Lelemon
  • Get started
  • Use cases
  • Guides
  • API basics
  • Webhooks
  • SDK, CLI and MCP
  • API reference
  • Changelog
  • v1 (legacy)
Information
Me
    Retrieve the current keyget
API keys
    List scopesget
Agents
    List agentsgetCreate an agentpostRetrieve an agentgetDelete an agentdeleteUpdate an agentpatchActivate an agentpostPause an agentpostList versionsgetRetrieve a versiongetRestore a versionpostList the fixed facts of an agentgetSave a fixed fact of an agentputForget a fixed fact of an agentdelete
Models and templates
    List agent templatesgetList modelsget
Subaccounts
    List subaccountsgetCreate a subaccountpostRetrieve a subaccountgetDelete a subaccountdeleteUpdate a subaccountpatchGive a subaccount its own keypost
WhatsApp
    List WhatsApp connectionsgetCreate a WhatsApp connection linkpostRetrieve a WhatsApp connectiongetRevoke a pending WhatsApp connectiondeleteList WhatsApp phone numbersgetRetrieve a WhatsApp phone numbergetDisconnect a WhatsApp phone numberdeleteChange the agent, label or state of a numberpatchRead the cart and catalog settings of a numbergetTurn the cart button or the catalog icon of a number on or offpatch
Actions
    List actionsgetCreate an actionpostRead the current authorization textgetRotate the signing secret of your actionspostRetrieve the signing secret of an actiongetRetrieve an actiongetDelete an actiondeleteUpdate an actionpatchTest an actionpostRead the approval floor of a shared actiongetSet the approval floor of a shared actionput
MCP servers
    List MCP serversgetConnect an MCP serverpostRetrieve an MCP servergetDisconnect an MCP serverdeleteUpdate an MCP serverpatchList the tools of an MCP servergetDiscover toolspostRead the run identity of an MCP servergetTurn on or rotate the run identity of an MCP serverpostTurn off the run identity of an MCP serverdelete
Data connectors
    Get the lelemon-connector/v1 formatgetValidate a connector documentpostList data connectorsgetRegister a data connectorpostRetrieve a data connectorgetDelete a data connectordeleteUpdate a data connectorpatchRetrieve the signing secret of a data connectorgetRotate the signing secret of a data connectorpostCheck a data connectorpostRetrieve the manifest of a data connectorgetSearch accounts by emailgetRead the card of an account livegetReveal one masked value of an accountpostGet the link of an account actionpostRead a view livegetList who looked at what through a connectorget
Skills
    List skillsgetCreate a skillpostRetrieve a skillgetDelete a skilldeleteUpdate a skillpatch
Agent tools
    List an agent's toolsgetGrant a toolputRemove a tooldelete
Approvals
    List approvalsgetRetrieve an approvalgetApprove an actionpostReject an actionpostAsk for a human review of a decisionpost
Automated decisions
    List automated decisionsgetRetrieve an automated decisiongetAsk for a human review of an automated decisionpost
Team questions
    List team questionsgetRetrieve a team questiongetRead a team question with its contextgetAnswer a team questionpost
Runs
    Give an agent a jobpostList runsgetRetrieve a rungetCancel a runpostAnswer a run that asked somethingpost
Schedules
    Schedule a job for an agentpostList scheduled tasksgetRetrieve a scheduled taskgetDelete a scheduled taskdeleteChange a scheduled taskpatchFire a scheduled task nowpost
Pipelines
    List pipelinesgetCreate a pipelinepostRetrieve a pipelinegetDelete a pipelinedeleteUpdate a pipelinepatchClone a pipelinepostReorder the stages of a pipelinepost
Stages
    List the stages of a pipelinegetCreate a stagepostRetrieve a stagegetDelete a stagedeleteUpdate a stagepatchMake a stage the entry stagepost
Fields
    List the fields of a pipelinegetCreate a fieldpostRetrieve a fieldgetDelete a fielddeleteUpdate a fieldpatch
Routing rules
    List the routing rules of a pipelinegetCreate a routing rulepostRetrieve a routing rulegetDelete a routing ruledeleteUpdate a routing rulepatch
Knowledge
    List collectionsgetCreate a collectionpostSearch the knowledgepostRetrieve a collectiongetDelete a collectiondeleteUpdate a collectionpatchList documentsgetAdd a documentpostRetrieve a documentgetDelete a documentdeleteUpdate a documentpatchLet an agent search a collectionputStop an agent from searching a collectiondelete
Contacts
    List contactsgetCreate a contactpostCreate or update a contact by your own idputRetrieve a contactgetErase a contactdeleteUpdate a contactpatch
Contact fields
    List the contact fieldsgetCreate a contact fieldpostRetrieve a contact fieldgetDelete a contact fielddeleteUpdate a contact fieldpatch
Companies
    List companiesgetCreate a companypostRetrieve a companygetDelete a companydeleteUpdate a companypatch
Lead forms
    List lead formsgetCreate a lead formpostRetrieve a lead formgetDelete a lead formdeleteUpdate a lead formpatch
Suppressions
    Retrieve a suppressionget
Cases
    List casesgetOpen a casepostRetrieve a casegetDelete a casedeleteUpdate a casepatchMove a case to a stagepostAssign a case to a memberpostClose a casepostReopen a casepostTake control of a casepostHand a case back to the agentpostMark a case as readpostMove several cases to a stagepostArchive a casepostBring an archived case backpostMute the contact of a casepostUnmute the contact of a casepostHand a case to a personpostReveal a sensitive field of a casepostEscalate a case to the technical teampostList the escalations of a caseget
Case queue
    Read the attention queue of a memberget
Contact events
    List the events of a contactgetReport a contact eventpostRetrieve a contact eventget
Case reminders
    List the reminders of a casegetAdd a reminder to a casepost
Reminders
    Retrieve a remindergetDelete a reminderdeleteEdit a reminderpatchComplete a reminderpostDismiss a reminderpost
Presence
    Report who is online in your apppostRead the presence settinggetTurn presence on or offput
Organization
    Get the organizationgetRename the organizationpatchGet the organization settingsgetChange the organization settingspatchGet the company profilegetChange the company profilepatch
Case notes
    List the notes of a casegetAdd a note to a casepostRetrieve a notegetDelete a notedeleteEdit a notepatch
Case attachments
    List the files of a casegetUpload a file to a casepostRetrieve a file of a casegetDelete a file of a casedeleteGet the download link of a fileget
Files
    List filesgetUpload a filepostRetrieve a filegetDelete a filedelete
Case messages
    List the messages of a casegetAdd a message to a casepostRedact a messagepost
Case turns
    List the turns the agent took in a caseget
Usage
    Get the usage of your agentsget
Case metrics
    List the times of the cases that changed in a rangeget
Budgets
    List the budgetsgetCreate a monthly budgetpostGet a budgetgetDelete a budgetdeleteChange a budgetpatch
Members
    List the active members of the organizationgetList who invited, changed the role of or removed membersgetRead whether a team member is availablegetMark a team member available or awayputChange the role of a memberpatchChange which cases a member seespatchRemove a member from the organizationdelete
Invitations
    List the invitations of the organizationgetInvite a person to the organizationpostResend an invitationpostCancel an invitationpost
Scheduling
    List the agendasgetCreate an agendapostRetrieve an agendagetUpdate an agendapatchList the team of an agendagetAdd a person to the team of an agendapostRemove a person from the team of an agendadeleteUpdate a person in the team of an agendapatchRead the free slots of an agendagetList meetingsgetBook a meetingpostRetrieve a meetinggetCancel a meetingpostMove a meeting to another slotpost
Webhook endpoints
    List webhook endpointsgetCreate a webhook endpointpostRetrieve a webhook endpointgetDelete a webhook endpointdeleteUpdate a webhook endpointpatchRotate the signing secretpostSend a test eventpostList the deliveries of an endpointget
Events
    Resend an eventpostList the event typesget
Recipient allowlist
    Get the recipient allowlistgetReplace the recipient allowlistput
WhatsApp templates
    List templatesgetCreate a templatepostSync template statusespostRetrieve a templategetDelete a templatedeleteUpdate a templatepatchRender a templatepostSend a test messagepost
WhatsApp messages
    Send a templatepostRetrieve a template messagegetCancel a scheduled messagepost
Triggers
    List triggersgetCreate a triggerpostRetrieve a triggergetDelete a triggerdeleteUpdate a triggerpatchList the runs of a triggerget
Opt-outs
    List opt-outsgetOpt a contact outputClear an opt-outdelete
Campaigns
    List campaignsgetCreate a campaignpostRetrieve a campaigngetDelete a campaigndeleteUpdate a campaignpatchPreview a campaignpostLaunch a campaignpostPause a campaignpostResume a campaignpostCancel a campaignpostList recipientsget
Email domains
    List the sender domainsgetAdd a sender domainpostGet a sender domain with its status and DNS recordsgetRemove a sender domaindeleteChange the default sender or the inbound agent of a domainpatchCheck the DNS records nowpost
Email messages
    Write first by emailpostRetrieve an email messageget
Teams
    List the teamsgetCreate a teampostRetrieve a teamgetDelete a teamdeleteUpdate a teampatchMerge another team into this onepostMove a pipeline into a teamputAdd a member to a team or change their role in itputRemove a member from a teamdelete
Linear
    Get the Linear connectiongetConnect LinearputDisconnect LineardeleteUpdate the Linear connectionpatch
Schemas
powered by Zudoku
Lelemon API
Lelemon API

Campaigns


List campaigns

GET
https://api.lelemon.cl
/v2/campaigns
Bearer (API key)

Lists the campaigns of the organization, newest first. Read only. It is safe to repeat.

Required scope: whatsapp:read.

List campaigns › query Parameters

limit
​integer · min: 1 · max: 100
Default: 20
cursor
​string · maxLength: 512

The nextCursor of the previous page, with the same filters.

status
​string · enum
Enum values:
draft
scheduled
sending
paused
completed
canceled

List campaigns › Headers

Lelemon-Subaccount
​string · pattern: ^sub_[0-9A-Za-z]{22}…

The subaccount (sub_…) this request acts on. Only for the keys of a platform account; without it the request acts on the account itself.

List campaigns › Responses

CampaignList
object
​string · enum · required
Enum values:
list
hasMore
​boolean · required
nextCursor
​string | null · required
​Campaign[] · required
GET/v2/campaigns
curl https://api.lelemon.cl/v2/campaigns \ --header 'Authorization: Bearer <token>'
Example Responses
{ "object": "list", "hasMore": true, "nextCursor": "nextCursor", "data": [ { "object": "campaign", "id": "cmp_BF26", "name": "name", "status": "draft", "templateId": "templateId", "audience": { "contactFilter": { "tags": [ "vip" ], "lastCaseAfter": "2026-01-01", "createdAfter": "2024-08-25" }, "externalRefs": [ "string" ] }, "variables": { "key": "string" }, "components": { "headerImage": { "fileId": "fil_4Zq0x8bVw1TqS9mYp3RkLd", "attachmentId": "att_1Bq0x8bVw1TqS9mYp3RkLd", "url": "https://files.example.com/promo.jpg" }, "headerVideo": { "fileId": "fil_4Zq0x8bVw1TqS9mYp3RkLd", "attachmentId": "att_1Bq0x8bVw1TqS9mYp3RkLd", "url": "https://files.example.com/promo.jpg" }, "catalog": { "thumbnailProductId": "sku-1" }, "mpm": { "thumbnailProductId": "sku-1", "sections": [ { "title": "Cakes", "productIds": [ "sku-1", "sku-2" ] } ] }, "flow": { "token": "case-42", "data": {} }, "catalogId": "1234567890", "cards": [ { "image": { "fileId": "fil_4Zq0x8bVw1TqS9mYp3RkLd", "url": "https://files.example.com/chair.jpg" }, "video": { "fileId": "fil_4Zq0x8bVw1TqS9mYp3RkLd", "url": "https://files.example.com/chair.jpg" }, "productId": "sku-1" } ] }, "document": { "fileId": "fil_4Zq0x8bVw1TqS9mYp3RkLd", "attachmentId": "att_1Bq0x8bVw1TqS9mYp3RkLd", "url": "https://files.example.com/estado-de-cuenta.pdf", "filename": "estado-de-cuenta.pdf" }, "onReply": { "agentId": "agentId", "stageId": "stageId", "instructions": "instructions" }, "schedule": { "at": "2026-11-27T10:00:00-03:00", "window": { "from": "10:00", "to": "21:00", "timezone": "America/Santiago" }, "batchSize": 300, "batchEveryMinutes": 15 }, "pauseReason": "pauseReason", "counts": { "recipients": 0, "pending": 0, "queued": 0, "sent": 0, "delivered": 0, "read": 0, "replied": 0, "failed": 0, "skipped": 0 }, "launchedAt": "2024-08-25T15:00:00Z", "createdAt": "2024-08-25T15:00:00Z", "updatedAt": "2024-08-25T15:00:00Z" } ] }
json
application/json

Create a campaign

POST
https://api.lelemon.cl
/v2/campaigns
Bearer (API key)

Starts as a draft. Nothing goes out until you launch it, and no person has to approve it. Use dryRun=true to run the same checks (audience, schedule, template, variables, onReply) and get 200 with the draft as it would be saved; nothing is saved and its id is not saved.

Required scope: whatsapp:write.

Create a campaign › query Parameters

dryRun
​boolean

When true, the request goes through the same validation as the real one and is answered with what would happen (always 200), and nothing is saved, sent or charged. The answer has the same shape as the real one plus dryRun: true; an id in it is not saved. It does not use the Idempotency-Key.

Create a campaign › Headers

Lelemon-Subaccount
​string · pattern: ^sub_[0-9A-Za-z]{22}…

The subaccount (sub_…) this request acts on. Only for the keys of a platform account; without it the request acts on the account itself.

Idempotency-Key
​string · minLength: 1 · maxLength: 255

Makes the request safe to retry. Once it starts running, its final response (2xx, 4xx or 5xx) is kept for 24 hours and the same key gets it back, without repeating the effect. A request rejected before it runs leaves the key free. A replayed create omits the secret. The same key with a different request is rejected with 409 idempotency_key_reused.

Create a campaign › Request Body

CreateCampaign
name
​string · minLength: 1 · maxLength: 255 · required
templateId
​string · required
​object · required

contactFilter or externalRefs.

​Schedule · required
​object

Template variable to contact.name, contact.phone, contact.email or contact.externalRef. Any other text is used as is.

​HeaderDocument
​object

What the template needs besides its variables: image or video header, products, Flow data, cards.

​OnReply

Create a campaign › Responses

dryRun=true: the draft as it would be saved.

What a dryRun answer adds to the normal one: nothing was saved, sent or charged, and an id in it is not saved.
object
​string · enum · required
Enum values:
campaign
id
​string · required
name
​string · required
status
​string · enum · required
Enum values:
draft
scheduled
sending
paused
completed
canceled
templateId
​string · required
​Audience · required
​object · required
​required

The components saved on the campaign (media headers by fileId or url, cards, products), as you sent them. null when it has none.

​required

The document header saved on the campaign, as you sent it. null when it has none.

​required

Who continues the conversation if the contact answers, as you sent it. null when it was not set.

​Schedule · required
pauseReason
​string | null · required

Why it paused by itself, if it did.

​CampaignCounts · required
launchedAt
​string | null · date-time · required
createdAt
​string · date-time · required
updatedAt
​string · date-time · required
dryRun
​boolean · const

Present and true when the request had dryRun=true.

Const value:
POST/v2/campaigns
curl https://api.lelemon.cl/v2/campaigns \ --request POST \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <token>' \ --data '{ "name": "Black Friday", "templateId": "tpl_02y0e5MANqacVbmtn1YyeJ", "audience": { "contactFilter": { "tags": [ "vip" ] } }, "variables": { "coupon": "BLACK20" }, "schedule": { "at": "2026-11-27T12:00:00.000Z", "window": { "from": "09:00", "to": "19:00", "timezone": "America/Santiago" }, "batchSize": 100, "batchEveryMinutes": 10 }, "onReply": { "agentId": "agt_02y0e5MANqacVbmtn1YyeJ", "instructions": "Help them use the coupon." } }'
Example Request Body
{ "name": "Black Friday", "templateId": "tpl_02y0e5MANqacVbmtn1YyeJ", "audience": { "contactFilter": { "tags": [ "vip" ] } }, "variables": { "coupon": "BLACK20" }, "schedule": { "at": "2026-11-27T12:00:00.000Z", "window": { "from": "09:00", "to": "19:00", "timezone": "America/Santiago" }, "batchSize": 100, "batchEveryMinutes": 10 }, "onReply": { "agentId": "agt_02y0e5MANqacVbmtn1YyeJ", "instructions": "Help them use the coupon." } }
json
application/json
Example Responses
{ "object": "campaign", "id": "cmp_BF26", "name": "name", "status": "draft", "templateId": "templateId", "audience": { "contactFilter": { "tags": [ "vip" ], "lastCaseAfter": "2026-01-01", "createdAfter": "2024-08-25" }, "externalRefs": [ "string" ] }, "variables": { "key": "string" }, "components": { "headerImage": { "fileId": "fil_4Zq0x8bVw1TqS9mYp3RkLd", "attachmentId": "att_1Bq0x8bVw1TqS9mYp3RkLd", "url": "https://files.example.com/promo.jpg" }, "headerVideo": { "fileId": "fil_4Zq0x8bVw1TqS9mYp3RkLd", "attachmentId": "att_1Bq0x8bVw1TqS9mYp3RkLd", "url": "https://files.example.com/promo.jpg" }, "catalog": { "thumbnailProductId": "sku-1" }, "mpm": { "thumbnailProductId": "sku-1", "sections": [ { "title": "Cakes", "productIds": [ "sku-1", "sku-2" ] } ] }, "flow": { "token": "case-42", "data": {} }, "catalogId": "1234567890", "cards": [ { "image": { "fileId": "fil_4Zq0x8bVw1TqS9mYp3RkLd", "url": "https://files.example.com/chair.jpg" }, "video": { "fileId": "fil_4Zq0x8bVw1TqS9mYp3RkLd", "url": "https://files.example.com/chair.jpg" }, "productId": "sku-1" } ] }, "document": { "fileId": "fil_4Zq0x8bVw1TqS9mYp3RkLd", "attachmentId": "att_1Bq0x8bVw1TqS9mYp3RkLd", "url": "https://files.example.com/estado-de-cuenta.pdf", "filename": "estado-de-cuenta.pdf" }, "onReply": { "agentId": "agentId", "stageId": "stageId", "instructions": "instructions" }, "schedule": { "at": "2026-11-27T10:00:00-03:00", "window": { "from": "10:00", "to": "21:00", "timezone": "America/Santiago" }, "batchSize": 300, "batchEveryMinutes": 15 }, "pauseReason": "pauseReason", "counts": { "recipients": 0, "pending": 0, "queued": 0, "sent": 0, "delivered": 0, "read": 0, "replied": 0, "failed": 0, "skipped": 0 }, "launchedAt": "2024-08-25T15:00:00Z", "createdAt": "2024-08-25T15:00:00Z", "updatedAt": "2024-08-25T15:00:00Z", "dryRun": true }
json
application/json

Retrieve a campaign

GET
https://api.lelemon.cl
/v2/campaigns/{id}
Bearer (API key)

Returns one campaign by id. Use it to refresh a single record you already know; to find records, use the list route. It includes the counts by recipient status. Read only. 404 not_found when the id does not exist or belongs to another organization. You can repeat it safely: it has no side effects.

Required scope: whatsapp:read.

Retrieve a campaign › path Parameters

id
​string · pattern: ^cmp_[0-9A-Za-z]{22}… · required

The id of the campaign (cmp_…).

Retrieve a campaign › Headers

Lelemon-Subaccount
​string · pattern: ^sub_[0-9A-Za-z]{22}…

The subaccount (sub_…) this request acts on. Only for the keys of a platform account; without it the request acts on the account itself.

Retrieve a campaign › Responses

Campaign
object
​string · enum · required
Enum values:
campaign
id
​string · required
name
​string · required
status
​string · enum · required
Enum values:
draft
scheduled
sending
paused
completed
canceled
templateId
​string · required
​Audience · required
​object · required
​required

The components saved on the campaign (media headers by fileId or url, cards, products), as you sent them. null when it has none.

​required

The document header saved on the campaign, as you sent it. null when it has none.

​required

Who continues the conversation if the contact answers, as you sent it. null when it was not set.

​Schedule · required
pauseReason
​string | null · required

Why it paused by itself, if it did.

​CampaignCounts · required
launchedAt
​string | null · date-time · required
createdAt
​string · date-time · required
updatedAt
​string · date-time · required
GET/v2/campaigns/{id}
curl https://api.lelemon.cl/v2/campaigns/:id \ --header 'Authorization: Bearer <token>'
Example Responses
{ "object": "campaign", "id": "cmp_BF26", "name": "name", "status": "draft", "templateId": "templateId", "audience": { "contactFilter": { "tags": [ "vip" ], "lastCaseAfter": "2026-01-01", "createdAfter": "2024-08-25" }, "externalRefs": [ "string" ] }, "variables": { "key": "string" }, "components": { "headerImage": { "fileId": "fil_4Zq0x8bVw1TqS9mYp3RkLd", "attachmentId": "att_1Bq0x8bVw1TqS9mYp3RkLd", "url": "https://files.example.com/promo.jpg" }, "headerVideo": { "fileId": "fil_4Zq0x8bVw1TqS9mYp3RkLd", "attachmentId": "att_1Bq0x8bVw1TqS9mYp3RkLd", "url": "https://files.example.com/promo.jpg" }, "catalog": { "thumbnailProductId": "sku-1" }, "mpm": { "thumbnailProductId": "sku-1", "sections": [ { "title": "Cakes", "productIds": [ "sku-1", "sku-2" ] } ] }, "flow": { "token": "case-42", "data": {} }, "catalogId": "1234567890", "cards": [ { "image": { "fileId": "fil_4Zq0x8bVw1TqS9mYp3RkLd", "url": "https://files.example.com/chair.jpg" }, "video": { "fileId": "fil_4Zq0x8bVw1TqS9mYp3RkLd", "url": "https://files.example.com/chair.jpg" }, "productId": "sku-1" } ] }, "document": { "fileId": "fil_4Zq0x8bVw1TqS9mYp3RkLd", "attachmentId": "att_1Bq0x8bVw1TqS9mYp3RkLd", "url": "https://files.example.com/estado-de-cuenta.pdf", "filename": "estado-de-cuenta.pdf" }, "onReply": { "agentId": "agentId", "stageId": "stageId", "instructions": "instructions" }, "schedule": { "at": "2026-11-27T10:00:00-03:00", "window": { "from": "10:00", "to": "21:00", "timezone": "America/Santiago" }, "batchSize": 300, "batchEveryMinutes": 15 }, "pauseReason": "pauseReason", "counts": { "recipients": 0, "pending": 0, "queued": 0, "sent": 0, "delivered": 0, "read": 0, "replied": 0, "failed": 0, "skipped": 0 }, "launchedAt": "2024-08-25T15:00:00Z", "createdAt": "2024-08-25T15:00:00Z", "updatedAt": "2024-08-25T15:00:00Z" }
json
application/json

Delete a campaign

DELETE
https://api.lelemon.cl
/v2/campaigns/{id}
Bearer (API key)

Cancel a running campaign first: answers 409 while it is scheduled, sending or paused.

Required scope: whatsapp:write.

Delete a campaign › path Parameters

id
​string · pattern: ^cmp_[0-9A-Za-z]{22}… · required

The id of the campaign (cmp_…).

Delete a campaign › Headers

Lelemon-Subaccount
​string · pattern: ^sub_[0-9A-Za-z]{22}…

The subaccount (sub_…) this request acts on. Only for the keys of a platform account; without it the request acts on the account itself.

Delete a campaign › Responses

No data returned
DELETE/v2/campaigns/{id}
curl https://api.lelemon.cl/v2/campaigns/:id \ --request DELETE \ --header 'Authorization: Bearer <token>'
Example Responses
No example specified for this content type

Update a campaign

PATCH
https://api.lelemon.cl
/v2/campaigns/{id}
Bearer (API key)

Only a draft can be edited. Answers 409 otherwise. Use dryRun=true to run the same checks and get the campaign as it would be saved, without saving it.

Required scope: whatsapp:write.

Update a campaign › path Parameters

id
​string · pattern: ^cmp_[0-9A-Za-z]{22}… · required

The id of the campaign (cmp_…).

Update a campaign › query Parameters

dryRun
​boolean

When true, the request goes through the same validation as the real one and is answered with what would happen (always 200), and nothing is saved, sent or charged. The answer has the same shape as the real one plus dryRun: true; an id in it is not saved. It does not use the Idempotency-Key.

Update a campaign › Headers

Lelemon-Subaccount
​string · pattern: ^sub_[0-9A-Za-z]{22}…

The subaccount (sub_…) this request acts on. Only for the keys of a platform account; without it the request acts on the account itself.

Update a campaign › Request Body optional

UpdateCampaign
name
​string · minLength: 1 · maxLength: 255
templateId
​string
​Audience
​object
​

Send null to remove the saved document header.

​

What the template needs besides its variables: image or video header, products, Flow data, cards. Send null to remove the saved components.

​Schedule
​

Send null to remove who continues if they answer.

Update a campaign › Responses

What a dryRun answer adds to the normal one: nothing was saved, sent or charged, and an id in it is not saved.
object
​string · enum · required
Enum values:
campaign
id
​string · required
name
​string · required
status
​string · enum · required
Enum values:
draft
scheduled
sending
paused
completed
canceled
templateId
​string · required
​Audience · required
​object · required
​required

The components saved on the campaign (media headers by fileId or url, cards, products), as you sent them. null when it has none.

​required

The document header saved on the campaign, as you sent it. null when it has none.

​required

Who continues the conversation if the contact answers, as you sent it. null when it was not set.

​Schedule · required
pauseReason
​string | null · required

Why it paused by itself, if it did.

​CampaignCounts · required
launchedAt
​string | null · date-time · required
createdAt
​string · date-time · required
updatedAt
​string · date-time · required
dryRun
​boolean · const

Present and true when the request had dryRun=true.

Const value:
PATCH/v2/campaigns/{id}
curl https://api.lelemon.cl/v2/campaigns/:id \ --request PATCH \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer <token>' \ --data '{ "name": "Black Friday 2026", "schedule": { "at": "now" } }'
Example Request Body
{ "name": "Black Friday 2026", "schedule": { "at": "now" } }
json
application/json
Example Responses
{ "object": "campaign", "id": "cmp_BF26", "name": "name", "status": "draft", "templateId": "templateId", "audience": { "contactFilter": { "tags": [ "vip" ], "lastCaseAfter": "2026-01-01", "createdAfter": "2024-08-25" }, "externalRefs": [ "string" ] }, "variables": { "key": "string" }, "components": { "headerImage": { "fileId": "fil_4Zq0x8bVw1TqS9mYp3RkLd", "attachmentId": "att_1Bq0x8bVw1TqS9mYp3RkLd", "url": "https://files.example.com/promo.jpg" }, "headerVideo": { "fileId": "fil_4Zq0x8bVw1TqS9mYp3RkLd", "attachmentId": "att_1Bq0x8bVw1TqS9mYp3RkLd", "url": "https://files.example.com/promo.jpg" }, "catalog": { "thumbnailProductId": "sku-1" }, "mpm": { "thumbnailProductId": "sku-1", "sections": [ { "title": "Cakes", "productIds": [ "sku-1", "sku-2" ] } ] }, "flow": { "token": "case-42", "data": {} }, "catalogId": "1234567890", "cards": [ { "image": { "fileId": "fil_4Zq0x8bVw1TqS9mYp3RkLd", "url": "https://files.example.com/chair.jpg" }, "video": { "fileId": "fil_4Zq0x8bVw1TqS9mYp3RkLd", "url": "https://files.example.com/chair.jpg" }, "productId": "sku-1" } ] }, "document": { "fileId": "fil_4Zq0x8bVw1TqS9mYp3RkLd", "attachmentId": "att_1Bq0x8bVw1TqS9mYp3RkLd", "url": "https://files.example.com/estado-de-cuenta.pdf", "filename": "estado-de-cuenta.pdf" }, "onReply": { "agentId": "agentId", "stageId": "stageId", "instructions": "instructions" }, "schedule": { "at": "2026-11-27T10:00:00-03:00", "window": { "from": "10:00", "to": "21:00", "timezone": "America/Santiago" }, "batchSize": 300, "batchEveryMinutes": 15 }, "pauseReason": "pauseReason", "counts": { "recipients": 0, "pending": 0, "queued": 0, "sent": 0, "delivered": 0, "read": 0, "replied": 0, "failed": 0, "skipped": 0 }, "launchedAt": "2024-08-25T15:00:00Z", "createdAt": "2024-08-25T15:00:00Z", "updatedAt": "2024-08-25T15:00:00Z", "dryRun": true }
json
application/json

Preview a campaign

POST
https://api.lelemon.cl
/v2/campaigns/{id}/preview
Bearer (API key)

Who gets it, who is skipped and why, a rendered sample and the estimated cost at the list rate of the Meta rate card (never null).

Required scope: whatsapp:read.

Preview a campaign › path Parameters

id
​string · pattern: ^cmp_[0-9A-Za-z]{22}… · required

The id of the campaign (cmp_…).

Preview a campaign › Headers

Lelemon-Subaccount
​string · pattern: ^sub_[0-9A-Za-z]{22}…

The subaccount (sub_…) this request acts on. Only for the keys of a platform account; without it the request acts on the account itself.

Idempotency-Key
​string · minLength: 1 · maxLength: 255

Makes the request safe to retry. Once it starts running, its final response (2xx, 4xx or 5xx) is kept for 24 hours and the same key gets it back, without repeating the effect. A request rejected before it runs leaves the key free. A replayed create omits the secret. The same key with a different request is rejected with 409 idempotency_key_reused.

Preview a campaign › Responses

CampaignPreview
object
​string · enum · required
Enum values:
campaign_preview
recipients
​number · required

Contacts that would get the message.

​object · required
sample
​string | null · required
​object · required

List price of the messages that would be sent: the rate of the template category in the market of each phone number, from the WhatsApp Business Platform rate card published by Meta (https://developers.facebook.com/docs/whatsapp/pricing). It is the list rate before the volume tiers of utility and authentication messages, so the real charge can be lower; it is zero when nobody would receive the message.

POST/v2/campaigns/{id}/preview
curl https://api.lelemon.cl/v2/campaigns/:id/preview \ --request POST \ --header 'Authorization: Bearer <token>'
Example Responses
{ "object": "campaign_preview", "recipients": 0, "skipped": { "opted_out": 41, "no_phone": 12, "not_allowed": 3 }, "sample": "sample", "estimatedCost": { "amount": 4.445, "currency": "USD", "effectiveFrom": "2026-10-01" } }
json
application/json

Launch a campaign

POST
https://api.lelemon.cl
/v2/campaigns/{id}/launch
Bearer (API key)

Freezes the recipient list and starts at schedule.at, in batches inside the daily window. Launching twice answers 409; a restart in the middle never sends twice to the same contact. It sends messages that cost money and cannot be undone: use dryRun=true first, which checks the template and the state and answers with the campaign in the status it would take (scheduled or sending), without freezing the list or sending anything; use POST /v2/campaigns/{id}/preview for the recipients and the cost.

Required scope: whatsapp:write.

Launch a campaign › path Parameters

id
​string · pattern: ^cmp_[0-9A-Za-z]{22}… · required

The id of the campaign (cmp_…).

Launch a campaign › query Parameters

dryRun
​boolean

When true, the request goes through the same validation as the real one and is answered with what would happen (always 200), and nothing is saved, sent or charged. The answer has the same shape as the real one plus dryRun: true; an id in it is not saved. It does not use the Idempotency-Key.

Launch a campaign › Headers

Lelemon-Subaccount
​string · pattern: ^sub_[0-9A-Za-z]{22}…

The subaccount (sub_…) this request acts on. Only for the keys of a platform account; without it the request acts on the account itself.

Idempotency-Key
​string · minLength: 1 · maxLength: 255

Makes the request safe to retry. Once it starts running, its final response (2xx, 4xx or 5xx) is kept for 24 hours and the same key gets it back, without repeating the effect. A request rejected before it runs leaves the key free. A replayed create omits the secret. The same key with a different request is rejected with 409 idempotency_key_reused.

Launch a campaign › Responses

What a dryRun answer adds to the normal one: nothing was saved, sent or charged, and an id in it is not saved.
object
​string · enum · required
Enum values:
campaign
id
​string · required
name
​string · required
status
​string · enum · required
Enum values:
draft
scheduled
sending
paused
completed
canceled
templateId
​string · required
​Audience · required
​object · required
​required

The components saved on the campaign (media headers by fileId or url, cards, products), as you sent them. null when it has none.

​required

The document header saved on the campaign, as you sent it. null when it has none.

​required

Who continues the conversation if the contact answers, as you sent it. null when it was not set.

​Schedule · required
pauseReason
​string | null · required

Why it paused by itself, if it did.

​CampaignCounts · required
launchedAt
​string | null · date-time · required
createdAt
​string · date-time · required
updatedAt
​string · date-time · required
dryRun
​boolean · const

Present and true when the request had dryRun=true.

Const value:
POST/v2/campaigns/{id}/launch
curl https://api.lelemon.cl/v2/campaigns/:id/launch \ --request POST \ --header 'Authorization: Bearer <token>'
Example Responses
{ "object": "campaign", "id": "cmp_BF26", "name": "name", "status": "draft", "templateId": "templateId", "audience": { "contactFilter": { "tags": [ "vip" ], "lastCaseAfter": "2026-01-01", "createdAfter": "2024-08-25" }, "externalRefs": [ "string" ] }, "variables": { "key": "string" }, "components": { "headerImage": { "fileId": "fil_4Zq0x8bVw1TqS9mYp3RkLd", "attachmentId": "att_1Bq0x8bVw1TqS9mYp3RkLd", "url": "https://files.example.com/promo.jpg" }, "headerVideo": { "fileId": "fil_4Zq0x8bVw1TqS9mYp3RkLd", "attachmentId": "att_1Bq0x8bVw1TqS9mYp3RkLd", "url": "https://files.example.com/promo.jpg" }, "catalog": { "thumbnailProductId": "sku-1" }, "mpm": { "thumbnailProductId": "sku-1", "sections": [ { "title": "Cakes", "productIds": [ "sku-1", "sku-2" ] } ] }, "flow": { "token": "case-42", "data": {} }, "catalogId": "1234567890", "cards": [ { "image": { "fileId": "fil_4Zq0x8bVw1TqS9mYp3RkLd", "url": "https://files.example.com/chair.jpg" }, "video": { "fileId": "fil_4Zq0x8bVw1TqS9mYp3RkLd", "url": "https://files.example.com/chair.jpg" }, "productId": "sku-1" } ] }, "document": { "fileId": "fil_4Zq0x8bVw1TqS9mYp3RkLd", "attachmentId": "att_1Bq0x8bVw1TqS9mYp3RkLd", "url": "https://files.example.com/estado-de-cuenta.pdf", "filename": "estado-de-cuenta.pdf" }, "onReply": { "agentId": "agentId", "stageId": "stageId", "instructions": "instructions" }, "schedule": { "at": "2026-11-27T10:00:00-03:00", "window": { "from": "10:00", "to": "21:00", "timezone": "America/Santiago" }, "batchSize": 300, "batchEveryMinutes": 15 }, "pauseReason": "pauseReason", "counts": { "recipients": 0, "pending": 0, "queued": 0, "sent": 0, "delivered": 0, "read": 0, "replied": 0, "failed": 0, "skipped": 0 }, "launchedAt": "2024-08-25T15:00:00Z", "createdAt": "2024-08-25T15:00:00Z", "updatedAt": "2024-08-25T15:00:00Z", "dryRun": true }
json
application/json

Pause a campaign

POST
https://api.lelemon.cl
/v2/campaigns/{id}/pause
Bearer (API key)

Pauses a campaign that is scheduled or sending. Messages already sent are not recalled; the pending recipients wait until you resume. 409 conflict when the campaign is in any other state. Pausing a paused campaign is a 409, not a second pause.

Required scope: whatsapp:write.

Pause a campaign › path Parameters

id
​string · pattern: ^cmp_[0-9A-Za-z]{22}… · required

The id of the campaign (cmp_…).

Pause a campaign › Headers

Lelemon-Subaccount
​string · pattern: ^sub_[0-9A-Za-z]{22}…

The subaccount (sub_…) this request acts on. Only for the keys of a platform account; without it the request acts on the account itself.

Idempotency-Key
​string · minLength: 1 · maxLength: 255

Makes the request safe to retry. Once it starts running, its final response (2xx, 4xx or 5xx) is kept for 24 hours and the same key gets it back, without repeating the effect. A request rejected before it runs leaves the key free. A replayed create omits the secret. The same key with a different request is rejected with 409 idempotency_key_reused.

Pause a campaign › Responses

Campaign
object
​string · enum · required
Enum values:
campaign
id
​string · required
name
​string · required
status
​string · enum · required
Enum values:
draft
scheduled
sending
paused
completed
canceled
templateId
​string · required
​Audience · required
​object · required
​required

The components saved on the campaign (media headers by fileId or url, cards, products), as you sent them. null when it has none.

​required

The document header saved on the campaign, as you sent it. null when it has none.

​required

Who continues the conversation if the contact answers, as you sent it. null when it was not set.

​Schedule · required
pauseReason
​string | null · required

Why it paused by itself, if it did.

​CampaignCounts · required
launchedAt
​string | null · date-time · required
createdAt
​string · date-time · required
updatedAt
​string · date-time · required
POST/v2/campaigns/{id}/pause
curl https://api.lelemon.cl/v2/campaigns/:id/pause \ --request POST \ --header 'Authorization: Bearer <token>'
Example Responses
{ "object": "campaign", "id": "cmp_BF26", "name": "name", "status": "draft", "templateId": "templateId", "audience": { "contactFilter": { "tags": [ "vip" ], "lastCaseAfter": "2026-01-01", "createdAfter": "2024-08-25" }, "externalRefs": [ "string" ] }, "variables": { "key": "string" }, "components": { "headerImage": { "fileId": "fil_4Zq0x8bVw1TqS9mYp3RkLd", "attachmentId": "att_1Bq0x8bVw1TqS9mYp3RkLd", "url": "https://files.example.com/promo.jpg" }, "headerVideo": { "fileId": "fil_4Zq0x8bVw1TqS9mYp3RkLd", "attachmentId": "att_1Bq0x8bVw1TqS9mYp3RkLd", "url": "https://files.example.com/promo.jpg" }, "catalog": { "thumbnailProductId": "sku-1" }, "mpm": { "thumbnailProductId": "sku-1", "sections": [ { "title": "Cakes", "productIds": [ "sku-1", "sku-2" ] } ] }, "flow": { "token": "case-42", "data": {} }, "catalogId": "1234567890", "cards": [ { "image": { "fileId": "fil_4Zq0x8bVw1TqS9mYp3RkLd", "url": "https://files.example.com/chair.jpg" }, "video": { "fileId": "fil_4Zq0x8bVw1TqS9mYp3RkLd", "url": "https://files.example.com/chair.jpg" }, "productId": "sku-1" } ] }, "document": { "fileId": "fil_4Zq0x8bVw1TqS9mYp3RkLd", "attachmentId": "att_1Bq0x8bVw1TqS9mYp3RkLd", "url": "https://files.example.com/estado-de-cuenta.pdf", "filename": "estado-de-cuenta.pdf" }, "onReply": { "agentId": "agentId", "stageId": "stageId", "instructions": "instructions" }, "schedule": { "at": "2026-11-27T10:00:00-03:00", "window": { "from": "10:00", "to": "21:00", "timezone": "America/Santiago" }, "batchSize": 300, "batchEveryMinutes": 15 }, "pauseReason": "pauseReason", "counts": { "recipients": 0, "pending": 0, "queued": 0, "sent": 0, "delivered": 0, "read": 0, "replied": 0, "failed": 0, "skipped": 0 }, "launchedAt": "2024-08-25T15:00:00Z", "createdAt": "2024-08-25T15:00:00Z", "updatedAt": "2024-08-25T15:00:00Z" }
json
application/json

Resume a campaign

POST
https://api.lelemon.cl
/v2/campaigns/{id}/resume
Bearer (API key)

Resumes a paused campaign and queues its pending recipients, so messages leave and cost money. A campaign whose schedule is still in the future goes back to scheduled. 409 conflict when the campaign is not paused. Use dryRun=true to check the state and see the status it would take, without queueing anything.

Required scope: whatsapp:write.

Resume a campaign › path Parameters

id
​string · pattern: ^cmp_[0-9A-Za-z]{22}… · required

The id of the campaign (cmp_…).

Resume a campaign › query Parameters

dryRun
​boolean

When true, the request goes through the same validation as the real one and is answered with what would happen (always 200), and nothing is saved, sent or charged. The answer has the same shape as the real one plus dryRun: true; an id in it is not saved. It does not use the Idempotency-Key.

Resume a campaign › Headers

Lelemon-Subaccount
​string · pattern: ^sub_[0-9A-Za-z]{22}…

The subaccount (sub_…) this request acts on. Only for the keys of a platform account; without it the request acts on the account itself.

Idempotency-Key
​string · minLength: 1 · maxLength: 255

Makes the request safe to retry. Once it starts running, its final response (2xx, 4xx or 5xx) is kept for 24 hours and the same key gets it back, without repeating the effect. A request rejected before it runs leaves the key free. A replayed create omits the secret. The same key with a different request is rejected with 409 idempotency_key_reused.

Resume a campaign › Responses

What a dryRun answer adds to the normal one: nothing was saved, sent or charged, and an id in it is not saved.
object
​string · enum · required
Enum values:
campaign
id
​string · required
name
​string · required
status
​string · enum · required
Enum values:
draft
scheduled
sending
paused
completed
canceled
templateId
​string · required
​Audience · required
​object · required
​required

The components saved on the campaign (media headers by fileId or url, cards, products), as you sent them. null when it has none.

​required

The document header saved on the campaign, as you sent it. null when it has none.

​required

Who continues the conversation if the contact answers, as you sent it. null when it was not set.

​Schedule · required
pauseReason
​string | null · required

Why it paused by itself, if it did.

​CampaignCounts · required
launchedAt
​string | null · date-time · required
createdAt
​string · date-time · required
updatedAt
​string · date-time · required
dryRun
​boolean · const

Present and true when the request had dryRun=true.

Const value:
POST/v2/campaigns/{id}/resume
curl https://api.lelemon.cl/v2/campaigns/:id/resume \ --request POST \ --header 'Authorization: Bearer <token>'
Example Responses
{ "object": "campaign", "id": "cmp_BF26", "name": "name", "status": "draft", "templateId": "templateId", "audience": { "contactFilter": { "tags": [ "vip" ], "lastCaseAfter": "2026-01-01", "createdAfter": "2024-08-25" }, "externalRefs": [ "string" ] }, "variables": { "key": "string" }, "components": { "headerImage": { "fileId": "fil_4Zq0x8bVw1TqS9mYp3RkLd", "attachmentId": "att_1Bq0x8bVw1TqS9mYp3RkLd", "url": "https://files.example.com/promo.jpg" }, "headerVideo": { "fileId": "fil_4Zq0x8bVw1TqS9mYp3RkLd", "attachmentId": "att_1Bq0x8bVw1TqS9mYp3RkLd", "url": "https://files.example.com/promo.jpg" }, "catalog": { "thumbnailProductId": "sku-1" }, "mpm": { "thumbnailProductId": "sku-1", "sections": [ { "title": "Cakes", "productIds": [ "sku-1", "sku-2" ] } ] }, "flow": { "token": "case-42", "data": {} }, "catalogId": "1234567890", "cards": [ { "image": { "fileId": "fil_4Zq0x8bVw1TqS9mYp3RkLd", "url": "https://files.example.com/chair.jpg" }, "video": { "fileId": "fil_4Zq0x8bVw1TqS9mYp3RkLd", "url": "https://files.example.com/chair.jpg" }, "productId": "sku-1" } ] }, "document": { "fileId": "fil_4Zq0x8bVw1TqS9mYp3RkLd", "attachmentId": "att_1Bq0x8bVw1TqS9mYp3RkLd", "url": "https://files.example.com/estado-de-cuenta.pdf", "filename": "estado-de-cuenta.pdf" }, "onReply": { "agentId": "agentId", "stageId": "stageId", "instructions": "instructions" }, "schedule": { "at": "2026-11-27T10:00:00-03:00", "window": { "from": "10:00", "to": "21:00", "timezone": "America/Santiago" }, "batchSize": 300, "batchEveryMinutes": 15 }, "pauseReason": "pauseReason", "counts": { "recipients": 0, "pending": 0, "queued": 0, "sent": 0, "delivered": 0, "read": 0, "replied": 0, "failed": 0, "skipped": 0 }, "launchedAt": "2024-08-25T15:00:00Z", "createdAt": "2024-08-25T15:00:00Z", "updatedAt": "2024-08-25T15:00:00Z", "dryRun": true }
json
application/json

Cancel a campaign

POST
https://api.lelemon.cl
/v2/campaigns/{id}/cancel
Bearer (API key)

What was not sent yet is not sent. What already went out stays.

Required scope: whatsapp:write.

Cancel a campaign › path Parameters

id
​string · pattern: ^cmp_[0-9A-Za-z]{22}… · required

The id of the campaign (cmp_…).

Cancel a campaign › Headers

Lelemon-Subaccount
​string · pattern: ^sub_[0-9A-Za-z]{22}…

The subaccount (sub_…) this request acts on. Only for the keys of a platform account; without it the request acts on the account itself.

Idempotency-Key
​string · minLength: 1 · maxLength: 255

Makes the request safe to retry. Once it starts running, its final response (2xx, 4xx or 5xx) is kept for 24 hours and the same key gets it back, without repeating the effect. A request rejected before it runs leaves the key free. A replayed create omits the secret. The same key with a different request is rejected with 409 idempotency_key_reused.

Cancel a campaign › Responses

Campaign
object
​string · enum · required
Enum values:
campaign
id
​string · required
name
​string · required
status
​string · enum · required
Enum values:
draft
scheduled
sending
paused
completed
canceled
templateId
​string · required
​Audience · required
​object · required
​required

The components saved on the campaign (media headers by fileId or url, cards, products), as you sent them. null when it has none.

​required

The document header saved on the campaign, as you sent it. null when it has none.

​required

Who continues the conversation if the contact answers, as you sent it. null when it was not set.

​Schedule · required
pauseReason
​string | null · required

Why it paused by itself, if it did.

​CampaignCounts · required
launchedAt
​string | null · date-time · required
createdAt
​string · date-time · required
updatedAt
​string · date-time · required
POST/v2/campaigns/{id}/cancel
curl https://api.lelemon.cl/v2/campaigns/:id/cancel \ --request POST \ --header 'Authorization: Bearer <token>'
Example Responses
{ "object": "campaign", "id": "cmp_BF26", "name": "name", "status": "draft", "templateId": "templateId", "audience": { "contactFilter": { "tags": [ "vip" ], "lastCaseAfter": "2026-01-01", "createdAfter": "2024-08-25" }, "externalRefs": [ "string" ] }, "variables": { "key": "string" }, "components": { "headerImage": { "fileId": "fil_4Zq0x8bVw1TqS9mYp3RkLd", "attachmentId": "att_1Bq0x8bVw1TqS9mYp3RkLd", "url": "https://files.example.com/promo.jpg" }, "headerVideo": { "fileId": "fil_4Zq0x8bVw1TqS9mYp3RkLd", "attachmentId": "att_1Bq0x8bVw1TqS9mYp3RkLd", "url": "https://files.example.com/promo.jpg" }, "catalog": { "thumbnailProductId": "sku-1" }, "mpm": { "thumbnailProductId": "sku-1", "sections": [ { "title": "Cakes", "productIds": [ "sku-1", "sku-2" ] } ] }, "flow": { "token": "case-42", "data": {} }, "catalogId": "1234567890", "cards": [ { "image": { "fileId": "fil_4Zq0x8bVw1TqS9mYp3RkLd", "url": "https://files.example.com/chair.jpg" }, "video": { "fileId": "fil_4Zq0x8bVw1TqS9mYp3RkLd", "url": "https://files.example.com/chair.jpg" }, "productId": "sku-1" } ] }, "document": { "fileId": "fil_4Zq0x8bVw1TqS9mYp3RkLd", "attachmentId": "att_1Bq0x8bVw1TqS9mYp3RkLd", "url": "https://files.example.com/estado-de-cuenta.pdf", "filename": "estado-de-cuenta.pdf" }, "onReply": { "agentId": "agentId", "stageId": "stageId", "instructions": "instructions" }, "schedule": { "at": "2026-11-27T10:00:00-03:00", "window": { "from": "10:00", "to": "21:00", "timezone": "America/Santiago" }, "batchSize": 300, "batchEveryMinutes": 15 }, "pauseReason": "pauseReason", "counts": { "recipients": 0, "pending": 0, "queued": 0, "sent": 0, "delivered": 0, "read": 0, "replied": 0, "failed": 0, "skipped": 0 }, "launchedAt": "2024-08-25T15:00:00Z", "createdAt": "2024-08-25T15:00:00Z", "updatedAt": "2024-08-25T15:00:00Z" }
json
application/json

List recipients

GET
https://api.lelemon.cl
/v2/campaigns/{id}/recipients
Bearer (API key)

Lists the recipients of a campaign with the status of each one: pending, queued, sent, delivered, read, failed or skipped. Use it to see who did not receive the message and why. Read only. It is safe to repeat.

Required scope: whatsapp:read.

List recipients › path Parameters

id
​string · pattern: ^cmp_[0-9A-Za-z]{22}… · required

The id of the campaign (cmp_…).

List recipients › query Parameters

limit
​integer · min: 1 · max: 100
Default: 20
cursor
​string · maxLength: 512

The nextCursor of the previous page, with the same filters.

status
​string · enum
Enum values:
pending
queued
sent
delivered
read
failed
skipped

List recipients › Headers

Lelemon-Subaccount
​string · pattern: ^sub_[0-9A-Za-z]{22}…

The subaccount (sub_…) this request acts on. Only for the keys of a platform account; without it the request acts on the account itself.

List recipients › Responses

CampaignRecipientList
object
​string · enum · required
Enum values:
list
hasMore
​boolean · required
nextCursor
​string | null · required
​CampaignRecipient[] · required
GET/v2/campaigns/{id}/recipients
curl https://api.lelemon.cl/v2/campaigns/:id/recipients \ --header 'Authorization: Bearer <token>'
Example Responses
{ "object": "list", "hasMore": true, "nextCursor": "nextCursor", "data": [ { "object": "campaign_recipient", "contactId": "contactId", "status": "pending", "skipReason": "skipReason", "whatsappMessageId": "whatsappMessageId" } ] }
json
application/json

Opt-outsEmail domains