Schemas
AgendaTimeRange
start^([01]\d|2[0-3]):([0… · requiredend^([01]\d|2[0-3]):([0… · requiredCreateWebhookEndpoint
urlPublic http(s) address that receives the events.
enabledEventsEvent types to receive, or "*" for all. See GET /v2/event-types.
descriptionapiVersionscopeself receives the events of this organization. customers receives the events of its subaccounts.
UpdateWebhookEndpoint
urlenabledEventsdescriptionapiVersionscopestatusSet enabled to turn on an endpoint that was disabled.
ErrorFix
summaryWhat to do, in one sentence a model can follow.
actionset a parameter, remove one, retry the same request, call another endpoint first, or stop because only a person can fix it.
docUrlparamThe header, query parameter or body field the fix is about. For invalid_request and required_fields_missing it is the field of the problem itself.
valueThe value to put in param, when the fix is the same for everyone.
endpointThe call to make first, as METHOD /v2/path.
BudgetExceededDetails
idscopesubjectIdThe sub_, agt_ or ctc_ id the budget covers. null for the organization.
limitConversationsMonthly limit in conversations.
usedConversationsConversations used this month.
resetsAtWhen the month ends and the used conversations go back to zero. Retry-After counts the seconds to this moment.
Problem
typetitlestatuscodedetaildocUrlrequestIdparamThe next step for this error code. It comes from the error catalog and never repeats what you sent.
Only with budget_exceeded: which budget stopped the agent, its limit, what was spent and when the month resets.
MeOrganization
idnamekindsubaccount when the key belongs to a subaccount or acts on one with Lelemon-Subaccount.
platformIdThe platform that owns this subaccount.
Me
objectscopesScope
objectiddescriptionScopeList
objecthasMorenextCursorAgentModelInput
modelPublic model id from GET /v2/models. Responses return the same id.
temperaturemaxOutputTokensMost tokens the model may write in one answer.
effortthinkingoff is not available on every model; the answer is 422 when it is not.
alwaysLoadedToolsModelConfigInput
modelPublic model id from GET /v2/models. Responses return the same id.
temperaturemaxOutputTokensMost tokens the model may write in one answer.
effortthinkingoff is not available on every model; the answer is 422 when it is not.
alwaysLoadedToolsAnswers when the main model fails.
BehaviorInput
greetingpersonalitytonedisplayNameThe name the agent uses to introduce itself.
CreateAgent
Decision Table
| Variant | Matching Criteria |
|---|---|
| type = object · requires: fromTemplate | |
| type = object · requires: name, instructions, llmConfig |
fromTemplateA template from GET /v2/agent-templates.
audiencecustomers: the agent talks to your customers. internal: a copilot that answers your team and can use the tools of your data connector (dct_) to read your back office. Creating an internal one needs the scope agents:internal (403 scope_missing otherwise) and it cannot be made from a template. It cannot be changed later.
nameRequired unless fromTemplate is set.
descriptioninstructionsHow the agent behaves. Required unless fromTemplate is set. May hold {{name}} placeholders.
Values for the {{name}} placeholders in the instructions, and any fact the agent should know. Replaces the whole map. Every placeholder needs a value or the answer is 422 template_variable_missing.
Required unless fromTemplate is set.
maxTokensmaxIterationschannelsWhere the agent answers. An empty list means every channel.
avatarAgentModel
modeltemperaturemaxOutputTokenseffortthinkingalwaysLoadedToolsModelConfig
modeltemperaturemaxOutputTokenseffortthinkingalwaysLoadedToolsAgent
objectidnameaudiencecustomers: talks to your customers. internal: a copilot for your team created with the scope agents:internal.
descriptionstatusversionGoes up on every change. Send it back as expectedVersion.
instructionsAs you wrote them, with the {{name}} placeholders still in place.
maxTokensmaxIterationschannelsavatarcreatedAtupdatedAtAgentList
objecthasMorenextCursorUpdateAgent
namedescriptioninstructionsCreates a version. May hold {{name}} placeholders; they are filled with variables.
Values for the {{name}} placeholders in the instructions, and any fact the agent should know. Replaces the whole map. Every placeholder needs a value or the answer is 422 template_variable_missing. Creates a version.
maxTokensmaxIterationschannelsWhere the agent answers. An empty list means every channel.
Merged into the current behaviors, key by key.
avatarexpectedVersionThe version you read. If someone saved first the answer is 409 agent_version_conflict and nothing is written.
ReadinessGap
codemessageReadiness
readyTrue when nothing keeps people from reaching the agent.
AgentWithReadiness
objectidnameaudiencecustomers: talks to your customers. internal: a copilot for your team created with the scope agents:internal.
descriptionstatusversionGoes up on every change. Send it back as expectedVersion.
instructionsAs you wrote them, with the {{name}} placeholders still in place.
maxTokensmaxIterationschannelsavatarcreatedAtupdatedAtVersionAuthor
typeidAgentVersion
objectidagentIdversionThe agent version this one left in place.
charsLength of the instructions.
createdAtAgentVersionList
objecthasMorenextCursorAgentVersionWithText
objectidagentIdversionThe agent version this one left in place.
charsLength of the instructions.
createdAtinstructionsThe instructions as written, with placeholders in place.
AgentFact
objectkeyvaluesourcemanual when someone wrote it through the API or the dashboard, auto when the agent saved it on its own.
createdAtupdatedAtAgentFactList
objecthasMorenextCursorAgentTemplate
objectidnamedescriptioncategoryvariablesThe variables its instructions ask for. Send a value for each in variables.
createdAtAgentTemplateList
objecthasMorenextCursorModelCapabilities
thinkingCanBeOffWhether thinking: off is accepted. When false, send effort low instead.
contextWindowCatalogModel
objectidThe value to send as llmConfig.model.
namedeprecatedDate (YYYY-MM-DD) from which the model is no longer accepted, or null.
ModelList
objecthasMorenextCursorSubaccountTemplates
agentsIds of the agent templates that GET /v2/agent-templates returns: Lelemon's and the ones your platform saved from the dashboard. Each one becomes a draft agent in the subaccount. A list that comes back empty means there is no template yet: leave this field out.
pipelinesPipelines of the platform. Each one is copied as a draft: stages and fields, never its agents, numbers, secrets or cases.
CreateSubaccount
externalRefYour own id for it. Unique among your subaccounts.
nameSubaccount
objectidexternalRefnamecreatedAtupdatedAtOnly on create: what fromTemplates made.
SubaccountList
objecthasMorenextCursorUpdateSubaccount
nameexternalRefCreateSubaccountKey
namescopesScopes for the key. They cannot go beyond the ones your own key has, and never include subaccounts:* scopes.
authorNameAccepted with cases:send, and required with conversations:send. Not allowed otherwise.
allowedActionOriginsSites the key may create HTTP actions for. Only with actions:write. Up to 10, each one inside the sites of your own key. Omit it to give the key the same sites as yours.
expiresInDaysSubaccountKey
objectidnameprefixscopesallowedActionOriginsThe sites this key may create HTTP actions for. Empty without actions:write.
createdAtexpiresAtsecretThe API key itself. It is shown once and never again.
CreateWhatsappConnection
phone^\+[1-9]\d{6,14}$ · requiredThe number the subaccount will link, in E.164. If they link another one, the connection fails and nothing is attached.
agentIdThe agent that will answer on this number.
connectionTypecoexistence keeps the WhatsApp Business app working next to the API; dedicated is API only.
languageConnectionFailure
codemessageWhatsappConnection
objectidphoneagentIdconnectionTypestatussetupUrlSend the subaccount here. Only while status is pending.
expiresAtphoneNumberIdThe phone number it created, once connected.
createdAtupdatedAtWhatsappConnectionList
objecthasMorenextCursorPhoneNumber
objectidphoneverifiedNamelabelYour own name for the number, such as the branch it serves.
catalogIdThe id of the Meta catalog connected to this number. The product, product_list and catalog messages and the catalog templates only send with this catalog. null when none is set.
agentIdactivecreatedAtupdatedAtPhoneNumberList
objecthasMorenextCursorUpdatePhoneNumber
agentIdThe agent that answers on this number from now on.
activefalse stops the agent from answering; true turns it back on.
labelYour own name for the number, such as the branch it serves. Send null to clear it.
catalogId^[0-9]{5,100}$The id of the catalog you connected to this number in Meta Commerce Manager and WhatsApp Manager. Send null to clear it. The platform cannot ask Meta whether it exists: a wrong id shows up as a failed message with its error.
CommerceSettings
objectphoneNumberIdisCartEnabledWhether the cart button shows on the product and catalog messages. WhatsApp turns it on by default.
isCatalogVisibleWhether the catalog icon shows in the chat with the number. WhatsApp turns it off by default.
catalogIdThe catalog set on the number, if any.
UpdateCommerceSettings
isCartEnabledtrue shows the cart button; false hides it.
isCatalogVisibletrue shows the catalog icon in the chat; false hides it.
ActionRequestInput
methodurlA public http or https URL, called exactly as written: a placeholder such as {id} is rejected with 400. It never comes back in a response, only its origin. Its site must be allowed for the API key.
Header name to value. This is where your credential goes: it is stored encrypted and never comes back in a response, only the names do.
timeoutMsMilliseconds to wait for your endpoint.
ActionVariableInput
name^[a-zA-Z0-9_-]{1,64}… · requiredThe name your endpoint receives: letters without accents, digits, "_" or "-", up to 64. It cannot repeat or match a property of input, ignoring case.
sourcelelemon: a fact Lelemon knows, named by variable. case_field: a field of the case, named by field.
variableRequired when source is lelemon, absent otherwise. See Variables of Lelemon in the actions guide for what each one sends. contact.phone and contact.whatsapp_id also need the destination authorization of the action.
fieldRequired when source is case_field: the key of a field the pipeline declares. If the case has no value for it, the action does not run, unless optional is true.
optionalOnly with case_field. When true and the case has no value, the field is left out of the request instead of blocking the action.
ActionAuthorizationInput
purposeWhat the data sent to your system is used for. Article 15 bis of Law 21.719 asks the engagement to state its purpose.
destinationCountryWhere your system is hosted, declared by you. unknown counts as outside Chile.
versionThe version of the authorization text you accept, from GET /v2/actions/authorization.
confirmsTransferOutsideChileRequired when destinationCountry is outside_chile or unknown: confirms apart that the data leaves the country (international transfer).
CreateAction
name^[a-z][a-z0-9_]{0,63… · requiredWhat the agent calls it: lowercase letters, digits and underscores, starting with a letter. It cannot change later.
descriptionWhen to use it. The agent reads this to decide.
JSON Schema of what the agent must send: type "object" with properties. The agent fills it in; for GET it goes in the query, otherwise in the body.
audienceWhich agents may be granted it: all, or customers (only agents that talk to the public).
noPersistWhen true, what this action returns lives only in the turn that called it. It is not kept in the tool memory between turns, in the execution trace, in approval requests or in run steps. The agent still uses it to answer. Consequences: the action cannot be replayed from a stored result, and a run interrupted in the middle of a round that called it fails instead of resuming. The provider (Bedrock) still receives the content as part of the prompt of that turn.
sharedWithSubaccountsPlatforms only. When true, every subaccount of yours can grant this action to its own agents. The action keeps living in your organization: calls to it are signed with your signing secret and carry the Lelemon-Subaccount-Id of the subaccount that made the call. Subaccounts cannot read, change or delete it. Turning it off, or deleting the action, removes it from the agents of your subaccounts. Its name cannot match an action that one of your subaccounts already has.
Fields Lelemon fills when it makes the call, not the agent: the agent does not see them and cannot invent them. They go in the query for GET and in the body otherwise. If Lelemon does not have the value, the field is left out.
The authorization to send personal data to your system (article 15 bis of Law 21.719): purpose, where it is hosted and the accepted text version. Optional as a block, but if you send it, send all of it. Without it the action is saved anyway, and it can be added later with PATCH.
ActionRequest
methodoriginOnly the origin. The path and query may hold a secret.
headerNamesNames only, never the values.
timeoutMsActionVariable
namesourcevariableWith source lelemon. A key the catalog no longer has is ignored when the action runs.
fieldoptionalWith case_field.
ActionAuthorizationRecord
purposeWhat the data sent to your system is used for, as it was accepted.
destinationCountryversionThe version of the authorization text that was accepted.
acceptedAtconfirmedTransferOutsideChileTrue when the transfer outside Chile was confirmed apart. False when the system is in Chile.
dataSentThe names of the input fields that leave for your system, never their values.
Action
objectidnamedescriptionaudiencenoPersistWhen true, what this action returns lives only in the turn that called it. It is not kept in the tool memory between turns, in the execution trace, in approval requests or in run steps. The agent still uses it to answer. Consequences: the action cannot be replayed from a stored result, and a run interrupted in the middle of a round that called it fails instead of resuming. The provider (Bedrock) still receives the content as part of the prompt of that turn.
sharedWithSubaccountsPlatforms only. When true, every subaccount of yours can grant this action to its own agents. The action keeps living in your organization: calls to it are signed with your signing secret and carry the Lelemon-Subaccount-Id of the subaccount that made the call. Subaccounts cannot read, change or delete it. Turning it off, or deleting the action, removes it from the agents of your subaccounts. Its name cannot match an action that one of your subaccounts already has.
The fields Lelemon fills on every call. Empty when there are none.
The authorization in force for the destination of this action: what you accepted when you created it or last changed its destination. null when there is none, for example after the destination changed and was not authorized again, and always null on an action shared by your platform.
createdAtupdatedAtActionAuthorization
objectversionThe version to send as authorization.version.
textThe authorization to deliver data to your system (article 15 bis of Law 21.719), which you accept every time.
detailWhat the text means in practice.
The extra confirmation for a system outside Chile. Accept it with authorization.confirmsTransferOutsideChile.
countriesActionList
objecthasMorenextCursorActionSigningSecretRotation
objectrotatedAtpreviousValidUntilUntil when calls signed with the previous secret still verify. Read the new secret of each action with GET /v2/actions/{id}/signing-secret.
ActionSigningSecret
objectactionIdsecretsThe secrets that sign the calls of this action, newest first. After a rotation the previous one is still listed for 24 hours: pass the whole list to verifyRequest. Each action has its own secret, derived from the one of your organization, so share it only with the system that serves that action.
previousValidUntilWhen the previous secret stops being listed. Absent when there is no previous secret.
ActionRequestChange
methodurlChanging the site checks it against the API key again.
Header name to value. This is where your credential goes: it is stored encrypted and never comes back in a response, only the names do. Omit to keep the current ones, send null to remove them.
timeoutMsUpdateAction
descriptionMerged into the current request, field by field.
Replaces the whole input schema.
noPersistWhen true, what this action returns lives only in the turn that called it. It is not kept in the tool memory between turns, in the execution trace, in approval requests or in run steps. The agent still uses it to answer. Consequences: the action cannot be replayed from a stored result, and a run interrupted in the middle of a round that called it fails instead of resuming. The provider (Bedrock) still receives the content as part of the prompt of that turn.
sharedWithSubaccountsPlatforms only. When true, every subaccount of yours can grant this action to its own agents. The action keeps living in your organization: calls to it are signed with your signing secret and carry the Lelemon-Subaccount-Id of the subaccount that made the call. Subaccounts cannot read, change or delete it. Turning it off, or deleting the action, removes it from the agents of your subaccounts. Its name cannot match an action that one of your subaccounts already has.
Replaces the whole list; omit it to keep the current one and send [] to remove them. Fields Lelemon fills when it makes the call, not the agent: the agent does not see them and cannot invent them. They go in the query for GET and in the body otherwise. If Lelemon does not have the value, the field is left out.
Registers or renews the authorization to send data to your system. Needed again when you change the destination site or where it is hosted.
TestAction
Sample input, as the agent would send it. For GET it goes in the query, otherwise in the body.
ActionTest
objectokTrue when your endpoint answered with a 2xx status.
durationMsbodyWhat your endpoint answered, cut at 4000 characters, with your credential hidden.
truncatedstatusAbsent when your endpoint did not answer.
failureMcpAuthInput
typenone: the server is open. bearer: sends Authorization: Bearer
tokenRequired for bearer. Stored encrypted and never returned.
apiKeyRequired for api_key. Stored encrypted and never returned.
headerNameFor api_key: the header that carries the key.
ConnectMcpServer
nameHow you see it. Its lowercase form prefixes every tool name the agent sees, so it cannot repeat or start like another server.
urlA public http or https URL of a Streamable HTTP MCP server. It never comes back in a response, only its origin. Redirects are not followed.
Defaults to none. OAuth servers are connected from the dashboard.
noPersistWhen true, what this action returns lives only in the turn that called it. It is not kept in the tool memory between turns, in the execution trace, in approval requests or in run steps. The agent still uses it to answer. Consequences: the action cannot be replayed from a stored result, and a run interrupted in the middle of a round that called it fails instead of resuming. The provider (Bedrock) still receives the content as part of the prompt of that turn.
sharedWithSubaccountsPlatforms only. When true, your subaccounts can grant the tools of this server to their agents but cannot change it. Turning it off, or deleting the server, removes the tools from their agents.
McpTool
objectidThe toolId to use in PUT /v2/agents/{id}/tools/{toolId}.
namedescriptionreadOnlyTrue when the server says the tool does not change anything. Absent when it does not say.
McpServerWithTools
objectidnameoriginOnly the origin. The path and query may hold a secret.
statusconnected: the last discovery worked, the last tool call was answered and its tools can be granted. error: the last discovery or the last tool call failed; lastError says which. inactive: not connected.
authTypetoolCountnoPersistWhen true, what this action returns lives only in the turn that called it. It is not kept in the tool memory between turns, in the execution trace, in approval requests or in run steps. The agent still uses it to answer. Consequences: the action cannot be replayed from a stored result, and a run interrupted in the middle of a round that called it fails instead of resuming. The provider (Bedrock) still receives the content as part of the prompt of that turn.
sharedWithSubaccountsPlatforms only. When true, your subaccounts can grant the tools of this server to their agents but cannot change it. Turning it off, or deleting the server, removes the tools from their agents.
lastErrorlastDiscoveryAtcreatedAtupdatedAtWhat the last discovery found.
sharedByPlatformTrue when your platform shares this server with you: you can grant its tools, not change it. Absent on your own servers.
McpServer
objectidnameoriginOnly the origin. The path and query may hold a secret.
statusconnected: the last discovery worked, the last tool call was answered and its tools can be granted. error: the last discovery or the last tool call failed; lastError says which. inactive: not connected.
authTypetoolCountnoPersistWhen true, what this action returns lives only in the turn that called it. It is not kept in the tool memory between turns, in the execution trace, in approval requests or in run steps. The agent still uses it to answer. Consequences: the action cannot be replayed from a stored result, and a run interrupted in the middle of a round that called it fails instead of resuming. The provider (Bedrock) still receives the content as part of the prompt of that turn.
sharedWithSubaccountsPlatforms only. When true, your subaccounts can grant the tools of this server to their agents but cannot change it. Turning it off, or deleting the server, removes the tools from their agents.
lastErrorlastDiscoveryAtcreatedAtupdatedAtsharedByPlatformTrue when your platform shares this server with you: you can grant its tools, not change it. Absent on your own servers.
McpServerList
objecthasMorenextCursorMcpToolList
objecthasMorenextCursorUpdateMcpServer
nameurlChanging it discovers the tools again.
Replaces the credentials and discovers the tools again.
noPersistWhen true, what this action returns lives only in the turn that called it. It is not kept in the tool memory between turns, in the execution trace, in approval requests or in run steps. The agent still uses it to answer. Consequences: the action cannot be replayed from a stored result, and a run interrupted in the middle of a round that called it fails instead of resuming. The provider (Bedrock) still receives the content as part of the prompt of that turn.
sharedWithSubaccountsPlatforms only. When true, your subaccounts can grant the tools of this server to their agents but cannot change it. Turning it off, or deleting the server, removes the tools from their agents.
McpRunIdentity
objectserverIdenabledTrue when Lelemon signs every call it makes to this server. False means calls go unsigned and the server gets no verified context.
headeraudiencekidThe kid of the secret that signs now. The JWT header carries it, so your server picks the right secret during a rotation.
secretCreatedAtActivateMcpRunIdentity
header^[a-z][a-z0-9-]{2,63…Header that carries the signed JWT. Lowercase letters, digits and hyphens, 3 to 64 characters, not one the server already uses for its own auth. Default x-agente-corrida.
audience^\S+$The aud claim: an https URL or an identifier without spaces, up to 200 characters. Default the URL of the server without query or fragment.
McpRunIdentityWithSecret
objectserverIdenabledTrue when Lelemon signs every call it makes to this server. False means calls go unsigned and the server gets no verified context.
headeraudiencekidThe kid of the secret that signs now. The JWT header carries it, so your server picks the right secret during a rotation.
secretCreatedAtsecretHS256 secret. Shown only in the answer that creates it, never again, and absent in a dryRun. Store it now.
rotatedOnly in the answer to POST: true when the identity was already on and this call replaced the signing secret. The previous secret keeps verifying until the next rotation, so your server accepts both for a while.
DataConnectorFormat
objectformatJSON Schemas of the manifest, the account card, the account search and the view page.
ValidateConnectorDocument
typeWhich document you are checking: manifest, account (the card), accounts_search (the answer to GET {base}/accounts?email=) or view_page (a page of a view).
The JSON document exactly as your connector serves it. It is checked and thrown away: nothing is stored and nothing is sent to your system.
baseUrlFor account: the base URL of your connector. The hosts of an action link must be this host or one of allowedOrigins.
allowedOriginsFor account: more https origins an action link may use.
DataConnectorFormatValidation
objecttypeokTrue when the document follows the format.
Every place that does not follow the format, up to 50, with its path. Values are never repeated.
CreateDataConnector
nameHow you see it. Its lowercase form (up to 16 characters) prefixes the tools the copilot gets from this connector, so it cannot repeat another connector.
baseUrlThe https base URL of your connector. Lelemon calls {baseUrl}/manifest, {baseUrl}/accounts and {baseUrl}/views/{viewId}. It must be public and its site must be allowed for this key, the same list actions use. Redirects are not followed.
allowedOriginsExtra sites that an action link of your account cards may point to, besides the host of baseUrl. Each one must be allowed for this key.
DataConnector
objectidnameslugThe prefix of the copilot tools of this connector, for example backoffice_account.
originOnly the origin of the base URL. The full URL never comes back.
allowedOriginsformatstatuspending: created, never checked. active: the last check passed. error: the last check or the manifest failed, see lastError.
lastErrorviewCountViews in the stored manifest.
manifestFetchedAtcreatedAtupdatedAtDataConnectorList
objecthasMorenextCursorUpdateDataConnector
namebaseUrlChanging it puts the connector back to pending until you call the check endpoint.
allowedOriginsDataConnectorSigningSecret
objectconnectorIdsecretsThe secrets that sign the calls to this connector, newest first. After a rotation the previous one is listed for 24 hours. Pass the whole list to verifyRequest of the SDK with domain connector.
previousValidUntilDataConnectorSigningSecretRotation
objectrotatedAtpreviousValidUntilDataConnectorCheck
objectokDataConnectorView
idnamedescriptionJSON Schema of the filters the view accepts, as filter[name]=value.
DataConnectorManifest
objectformatnameAccountSummary
objectidtitlesubtitleAccountSummaryList
objecthasMorenextCursorAccountSection
titleComponents of type field (value, masked, maskReason, revealable), table, badge or action (an https link opened by the person, never run by Lelemon). A masked field has value null.
AccountCard
objectidThe stable id your connector gives the account.
titlesubtitleRevealField
fieldKey^[a-z][a-z0-9_]{0,39… · requiredThe key of a field of the account card.
RevealedField
objectkeyvalueTypecurrencyActionLink
objecturlAn https link inside the sites of the connector. Open it in a new tab with rel=noopener noreferrer. Lelemon never calls it.
ViewPage
objecthasMorenextCursorColumns of the view: key, label, valueType and sensitive.
Rows with id, optional accountId and cells. Each cell is { value, masked, maskReason? }.
DataConnectorAccess
objectidconnectorIdkindactorTypeactorIdonBehalfOfaccountHmacA keyed hash of the account id. It never holds the id or any value.
viewIdfieldKeyintegritytampered means the row no longer matches its signature.
createdAtDataConnectorAccessList
objecthasMorenextCursorCreateSkill
name\S · requiredHow you see it.
description\S · requiredOne line that says WHEN to load it. It is the only part of the skill that travels in the prompt, in every message, so keep it short.
content\S · requiredThe full instructions, in Markdown. The agent loads them when it is about to do that task.
slug^[a-z0-9]+(-[a-z0-9]…The identifier the agent uses to load it. It cannot change. Defaults to the name in lowercase with hyphens. Creating again with the same slug and the same content returns the same skill; with different content it is a 409.
requiresSlugs of other skills of the same agent that the agent receives first, in full, every time it loads this one. One level only: a required skill cannot require another. Up to 5.
SkillWithContent
objectidslugnamedescriptionrequirescreatedAtupdatedAtcontentMarkdown.
Skill
objectidslugnamedescriptionrequirescreatedAtupdatedAtSkillList
objecthasMorenextCursorUpdateSkill
name\Sdescription\Scontent\SrequiresSlugs of other skills of the same agent that the agent receives first, in full, every time it loads this one. One level only: a required skill cannot require another. Up to 5.
BusinessHours
timezoneIANA time zone the hours are read in.
startHourendHourFirst hour that is already outside. Must be after startHour.
activeSaturdayactiveSundayHandoffFarewell
duringBusinessHoursWhat the contact reads when the hand-off happens inside business hours.
outsideBusinessHoursWhat the contact reads when the hand-off happens outside business hours.
SystemToolConfig
stageId^stg_[0-9A-Za-z]{22}…transfer_to_human only. The stage the case moves to when the agent hands it over. It wins over the pipeline setting. Ignored for a case in another pipeline, which falls back to the pipeline setting.
transfer_to_human only. Picks which goodbye the contact reads. Without it the goodbye is always the one for business hours.
transfer_to_human only. The goodbye the tool writes. Without it the tool uses a neutral Spanish text.
fieldssave_case_data only. The keys of the fields the agent may write. Each one must be a field with source agent that is not sensitive. Without it the agent may write every field with source agent.
Approver
typerole: everyone with that role in the organization. team: members of a team. member: one person. key: one API key, which then decides through POST /v2/approvals/{id}/approve. requester: the member whose conversation asked for it, only when no one else is named.
valueA member role such as owner, admin or member for a role. A tem_, mbr_ or key_ id for the others. Leave it out for requester.
ApprovalRule
effectallow: the agent runs the action, no one is asked. require_approval: a person decides first. reject: the action never runs and no one is asked; the agent tells the person it cannot be done.
When the rule applies: the same comparison or group as condition. Leave it out for a rule that applies to every call; it has to be the last one. A call whose argument is missing or has another type does not pass this rule silently: it goes to a person.
Only for effect require_approval. Who may decide a call that lands on this rule. Without it the approvers of the policy.
expiresInMinutesOnly for effect require_approval. Minutes to decide a call that lands on this rule. Without it the one of the policy.
escalateAfterMinutesOnly for effect require_approval. Minutes after which a request that landed on this rule escalates. Less than its expiresInMinutes.
customerMessageWhat the agent tells the person when a call lands on this rule, for require_approval and reject. Without it the one of the policy, or a neutral Spanish text.
AccumulatedLimit
paramThe argument of the action that holds the amount, as a number. If a call carries no valid number there, it needs approval.
periodA rolling window: the last 24 hours, 7 days or 30 days, counted per contact.
limitThe most the agent may run without approval, adding up everything it already ran in the window for the same contact and action. A call that would pass it needs approval. This is what stops a split into many small orders.
ApprovalPolicy
modenever: the agent runs the action without approval. always: every call waits for a person. when: only the calls that meet condition, or that pass accumulated, wait. rules: the ordered list in rules decides each call; the first rule that applies wins.
Only for mode when. A comparison {param, op, value} with op eq, ne, gt, gte, lt, lte, in (value is a list) or exists (no value), or a group {all: [...]} or {any: [...]}. Up to 3 levels and 10 comparisons. If the argument is missing or has another type the call needs approval. param is a path into the arguments of the action, like amount or order.total.
Only for mode rules. Evaluated in order for every call: the first rule whose when applies decides, and the rest are not read. A rule without when applies to every call and has to be last. If no rule applies the call runs, so end with a rule that has no when to choose the default. Use it for a hard cap ("above X, reject"), or for steps by amount ("up to X a supervisor decides, above X the management"). A platform floor and accumulated still apply on top: a rule can never run an action the floor sends to a person.
Who may decide. Without it: owners and admins. A role includes the roles above it: admin also lets owners decide. An API key decides only if it is named here.
expiresInMinutesMinutes to decide. Past it the request expires, the action never runs and the agent tells the person.
escalateAfterMinutesMinutes after which a pending request escalates: approval.escalated fires once. Less than expiresInMinutes.
customerMessageWhat the agent tells the person while it waits. Without it a neutral Spanish text is used.
automatedDecisionTrue when the action makes an automated decision about a person (Ley 21.719, art. 8 bis). It works with any mode. Every call leaves a record with the data it used and a reasonCode: an approval when a person decides, an automated decision (GET /v2/automated-decisions) when no one was asked or a rule rejected it. The person can ask for a human review of either.
AgentTool
objectidact_ for an action, mtl_ for an MCP tool, dct_ for a data connector tool, the tool name itself for a system tool. Use it in the path of PUT and DELETE.
kindnamedescriptiongrantedTrue when this agent may use it now.
serverIdFor an MCP tool, the server it comes from.
sharedByPlatformFor an action or an MCP tool: true when it belongs to your platform and is shared with your subaccounts. Absent for system tools and your own.
connectorIdFor a data connector tool (dct_), the data connector it reads. Only internal agents, such as a support copilot, can be granted them.
For a granted system tool, its configuration. Null when it has none. Absent for actions and MCP tools.
The approval policy of an action or MCP tool for this agent. mode never when it runs without approval. Absent for system tools.
The minimum approval your platform set for this shared action (PUT /v2/actions/{id}/approval-floor). It applies on top of approval: the stricter one wins, and approval cannot be mode never. Absent when there is none.
AgentToolList
objecthasMorenextCursorGrantTool
Only for the system tools transfer_to_human and save_case_data. It replaces the stored configuration: leaving it out clears it. Actions and MCP tools take no configuration.
Only for actions and MCP tools. Puts the tool behind a person: the agent proposes, a person or a named API key decides, and only an approval runs the action. Leaving it out keeps the policy the tool already has, so granting again never lifts it. To lift it, send mode never.
ApprovalDecision
decidedAtbyWho decided. A member of the organization (mbr_) or an API key (key_). When a key decides, actor is what your system declared: Lelemon stores it as declared by the key, not verified.
reasonApproval
objectidstatuspending waits for a decision. approved, executing, executed and failed follow an approval: the action runs only after it. rejected, expired and canceled never run it. preview only appears in the answer of approve with dryRun=true: the approval as it is now, with the decision that would be recorded; nothing was decided or run.
agentIdcaseIdtoolThe name of the action or tool the agent wants to run.
The exact arguments the action will run with if approved. Null when the tool is noPersist: those are kept encrypted and shown to nobody.
summaryA line for a person to read. For a noPersist tool it is only the name.
reasonCodeWhy it needed approval: policy_always, policy_condition (the condition on its arguments held), policy_accumulated (the sum for this contact in the period passed the limit) or policy_rule (a rule of the policy asked for it: see ruleIndex).
ruleIndexThe position (from 0) of the rule of the policy that decided this, when reasonCode is policy_rule. Null otherwise.
automatedDecisionTrue when the policy marks this as an automated decision about a person (Ley 21.719, art. 8 bis). The person may ask for a review.
dataSeenThe names of the argument fields the approver was shown. Never their values.
requestedByKeyIdThe API key whose turn proposed the action, if any. It can never decide this request.
resultWhat the action returned once it ran. Truncated.
executedAtexpiresAtescalatedAtreviewRequestedAtreviewReasonWhat the person said when they asked for the review: their point of view on the decision. Null if they gave none or no review was asked.
createdAtupdatedAtApprovalList
objecthasMorenextCursorActor
id^[^\r\n]*$ · requiredThe id of the person in your system. Lelemon does not verify it: it is stored as declared by your key.
roleThe role of the person in your system, from lowest to highest. A key of a subaccount cannot declare a role above staff.
name^[^\r\n]*$DecideApproval
reason^[^\u0000]*$ · requiredWhy you decide this. Required for approving and for rejecting. It is stored with the decision and read by the auditor.
The person in your system who decided. Lelemon records it as declared by this key, not verified. A key cannot declare a role above its own.
RequestApprovalReview
reasonThe point of view of the person on the decision, in their words. It is stored with the record, shown in reviewReason and sent in the review_requested event. Do not put anything the person did not say.
AutomatedDecision
objectidagentIdcaseIdtoolThe name of the action the agent decided about.
outcomeallowed: the agent ran the action and no person was asked. rejected: a rule of the policy refused it and the action never ran.
reasonCodeWhy: policy_rule (a rule of the policy decided: see ruleIndex) or policy_not_required (the policy did not ask for a person for this call).
ruleIndexThe position (from 0) of the rule that decided this, when reasonCode is policy_rule.
dataSeenThe names of the argument fields the decision used. Never their values. Empty for a noPersist action.
reviewRequestedAtreviewReasonThe point of view the person gave when they asked for the review.
createdAtAutomatedDecisionList
objecthasMorenextCursorTeamQuestion
objectidstatusopen waits for an answer. answered has the answer and the agent has not told the person yet. delivered: the agent told the person. discarded: it was closed without telling the person, for example because a human took the case.
caseIdquestionWhat the agent needs to know, written for a person who did not see the conversation.
contextWhat the agent is trying to do and why it asks.
answeranswerTitleansweredByWho answered: a member (mbr_ is not exposed here) or an API key (key_).
answeredAtdeliveredAtcreatedAtupdatedAtTeamQuestionList
objecthasMorenextCursorTeamQuestionMessage
fromWho wrote it: the customer, the agent, or someone on your team.
textThe text, shortened. A message that is not text (a voice note, an image) shows its type in brackets.
atTeamQuestionContext
objectidstatuscaseIdcontactNamepipelineNamequestionThe question, with every sensitive value covered.
contextanswercreatedAtThe last lines of the conversation with the customer, oldest first. Internal notes are left out.
The data of the case that is not sensitive, with the name of each field.
hiddenFieldsNames of the fields that hold sensitive values. Their values never appear here.
AnswerTeamQuestion
answerThe answer, written as a colleague would say it. The agent does not forward it: it tells the person in its own words, in the context of the conversation.
titleA title for the answer. Optional. Saving the answer as knowledge is a separate step: this does not create a knowledge document.
RunLimitsInput
maxRoundsHow many rounds the agent may take. Above 60 it is cut to 60.
maxMinutesHow many minutes it may last once it starts. Above 120 it is cut to 120.
CreateRun
goalWhat the agent has to achieve. It is treated as text from a user.
The person in your system the agent works for. It travels signed by Lelemon to every action and MCP server of the run as the actor, marked as declared by your key and not verified. Without it the run works as your key. A key cannot declare a role above its own.
Caps for this run. The server cuts them to its own maximums; what you leave out takes the default.
RunLimits
maxRoundsHow many rounds the agent may take.
maxMinutesHow many minutes it may last once it starts.
RunResult
summaryWhat the agent declared when it finished. It is a declaration: nobody has checked it yet.
checksWhat to look at to confirm the job is done, according to the agent.
partialThe last thing the agent wrote. It comes also when the run stopped or failed. With stopReason no_conclusion it is the answer the agent gave in plain text instead of finishing.
errorWhy it failed. Only with status failed.
errorCodeThe API error code behind the failure, the same one the request would have returned (for example budget_exceeded when the run found the budget used up). Only with status failed, and only when the failure has one.
RunActor
idroledeclaredByThe API key that declared this person. Lelemon does not verify the person: the key vouches for them.
nameThe name your key declared for this person, when it declared one.
Run
objectidagentIdstatusrunning: working, or in the queue. waiting_for_answer: paused to ask; question has it, answer it with POST /v2/runs/{id}/answer. completed_unverified: the agent says it finished and nobody has checked it, so do not read it as done. completed: a verifier checked it (it does not happen yet). stopped: the run was cut before the agent declared the job done, by a limit (rounds, time or the spending limit Lelemon sets for every run) or because the agent never concluded (no_conclusion) or repeated itself (loop); stopReason says which and result.partial keeps the last thing the agent wrote. failed: an error; result.error says what, or stopReason abandoned if nobody answered the pause in 30 days. canceled: you canceled it.
stopReasonWhy the run ended without finishing. Set with status stopped, and with status failed for abandoned. rounds: the run used all the rounds allowed by limits.maxRounds. cost: the run reached the spending limit Lelemon sets for every run. time: the run lasted all the minutes allowed by limits.maxMinutes. no_conclusion: the agent answered four times in a row without calling its finish action, so it never declared the job done. Its last answer is in result.partial. loop: the agent kept repeating the same action, so the run was cut. abandoned: with status failed: the agent asked a question and nobody answered it in 30 days.
questionWith status waiting_for_answer, what the agent asked. Answer it with POST /v2/runs/{id}/answer.
roundsRounds taken so far.
cancelRequestedtrue if a cancel was asked. While a worker runs it, the run stops at the start of its next round.
scheduleThe scheduled task that started this run. null for a run you created with POST /v2/agents/{id}/runs.
The person the run works for, as declared by the key that created it. null when the run works as the key itself.
createdAtstartedAtfinishedAtupdatedAtRunList
objecthasMorenextCursorAnswerRun
answerThe answer to what the agent asked.
The person in your system who answered. Lelemon records it as declared by this key, not verified, and the agent sees who answered. Without it the answer comes from your key.
ScheduledTaskContact
contactIdThe contact the agent writes to. Send this or externalRef, exactly one. The contact needs an email address.
externalRefThe externalRef you gave the contact. Send this or contactId, exactly one. An email address is not accepted here.
ScheduledTaskOnReply
instructionsWhat the agent knows if the contact answers the email. The same agent keeps the conversation by email.
CreateScheduledTask
namecronFive fields: minute hour day-of-month month day-of-week. It is read in the timezone below. 422 invalid_cron if it cannot be read.
goalThe job the agent gets on each date, as in a run. The agent runs it unattended: it never stops to ask.
channelHow the agent reaches the contact. Only email today. The agent needs the email channel.
timezoneAn IANA timezone. 422 invalid_timezone if it is not one.
fromThe sender. Its domain must be verified (POST /v2/email/domains). Without it the first verified domain is used.
enabledScheduledTask
objectidagentIdcontactIdnamecrontimezonegoalWhat the agent is asked to do on each date.
channelfromThe limits each run gets, after the server maximums.
enabledpausedReasonWhy the platform paused the task. consecutive_failures: three runs in a row failed or were cut.
nextRunAtWhen it fires next. A date missed while it was off is not replayed.
lastRunAtcreatedAtupdatedAtScheduledTaskList
objecthasMorenextCursorUpdateScheduledTask
namecrontimezonegoalenabledfalse pauses the task. true turns it on again from now, clears a platform pause and does not replay missed dates.
ScheduledTaskFire
objectstatusskipReasonWhy no run started. Set with status skipped.
InitialStage
nameentryMarks the stage where new cases start. The first stage is the entry when none says so.
agentIdThe agent that works cases in this stage.
QuickReply
shortcut1 to 30 lowercase letters, numbers, hyphens or underscores. Unique in the pipeline.
textUp to 4096 characters.
AutoClose
enabledTurns the automatic close on or off.
inactivityMinutesMinutes of silence before the case closes, from 5 to 525600. Counted inside the business hours when the pipeline has them.
messageFarewell sent when the case closes, up to 1000 characters. It needs inactivityMinutes under 1440, because after 24 hours the WhatsApp window is closed.
closeStageIdThe stage where the case is left when it closes. A stage of this pipeline.
includeTakenAlso close the chats a person has taken over.
reopenWindowHoursHours after the close when a new message reopens the case, from 0 to 720. 24 when omitted.
TimeRange
from^([01]\d|2[0-3]):[0-… · requiredHH:MM, 00:00 to 23:59.
to^(([01]\d|2[0-3]):[0… · requiredHH:MM, after from. 24:00 is the end of the day.
PipelineBusinessDays
Ranges on Monday. An empty list closes the day.
Ranges on Tuesday.
Ranges on Wednesday.
Ranges on Thursday.
Ranges on Friday.
Ranges on Saturday.
Ranges on Sunday.
Holiday
date^\d{4}-\d{2}-\d{2}$ · requiredYYYY-MM-DD.
Ranges that replace the ones of that weekday. Without ranges the day is closed.
PipelineBusinessHours
timezoneIANA time zone. Santiago when omitted.
Ranges per weekday. A day that is not here is closed. Without days the pipeline attends 24/7.
WaitThresholds
yellowMinutesMinutes without an answer before the wait turns yellow.
redMinutesMinutes without an answer before the wait turns red. Greater than yellowMinutes.
PipelineSettings
timezoneIANA time zone for the scheduled work of the pipeline.
askForHow the agent asks for the fields it fills: one_at_a_time as the conversation goes, or in_order following the order of the fields. null goes back to one_at_a_time.
Closes the cases that go silent. Replaces the whole block; null removes it.
When the pipeline attends. The wait colors, the auto close and the warning before it count only inside these hours. Replaces the whole block; null goes back to counting the clock all day.
When the wait of a case turns yellow and red. Replaces the whole block; null goes back to 10 and 30 minutes.
stageOnTakeControlThe stage a case moves to when a person takes control. A stage of this pipeline; it cannot be set on creation. null leaves cases where they are.
stageOnHandoffThe stage a case moves to when the agent hands it to a person. A stage of this pipeline; it cannot be set on creation. null leaves cases where they are.
CreatePipeline
namedescriptionCreate stages in the same call, in order.
Settings of the pipeline. A stage cannot be named here because the pipeline has none yet: set stageOnTakeControl, stageOnHandoff and autoClose.closeStageId with PATCH.
PipelineSettingsResponse
timezoneaskForstageOnTakeControlstageOnHandoffPipeline
objectidnamedescriptionstatusstagesThe ids of its stages, in order.
createdAtupdatedAtPipelineList
objecthasMorenextCursorReorderStages
stagesEvery stage of the pipeline, once each, in the order they should have: the first one takes position 0. A stage that is missing, repeated or from another pipeline is a 400 with param stages and nothing changes.
UpdatePipeline
namedescriptionstatusReplaces the whole list. An empty list removes them all.
Only the settings you send change. Each block (autoClose, businessHours, waitThresholds) replaces the whole block, and null removes a setting.
Condition
fieldPath of the value.
operatorWhat to compare with: a text, a number, a boolean, or a list for in. exists does not need one.
Transition
targetStageIdA stage of the same pipeline.
priorityLower numbers are tried first.
All of them must hold. Empty always holds.
FollowUp
enabledTurns the follow-ups of this stage on or off.
delaysMinutes of silence before each follow-up. A negative number counts before an event, as in a meeting reminder.
maxAttemptsFollow-ups to send before the last one.
templateSequenceWhat each follow-up says, in order.
allowTemplatesSend WhatsApp templates once the 24-hour window is closed. They cost money. false when omitted.
maxTemplatesMost templates to send. 1 when omitted.
NoProgress
minutesMinutes a case can stay in the stage before the team gets a task. They count only inside the business hours of the pipeline, when it has them.
title\S · requiredTitle of the task. It is a reminder of type call.
descriptionDescription of the task.
fallbackAssigneeIdMember who gets the task when the case has no assignee. An active member of the organization. Without it, a case with no assignee gets no task.
tag\STag added to the contact of the case when the task is created.
StageConfig
agentModeWhen the agent of the stage answers: always, never (paused) or only outside the business hours of the organization. null goes back to always.
attentionRoleThe part the stage plays in the attention queue. escalation: cases here wait for the technical team and show as waiting for a reply to whoever escalated them. answer: cases here came back with an answer and the customer still needs a reply; the owner is notified when a case enters. null removes the role.
Messages the stage sends to a person who went silent. Replaces the whole block; null removes it.
maxDurationSecondsLongest duration, in seconds.
minDurationSecondsShortest duration, in seconds, for a valid completion.
delayMinutesMinutes a case waits in the stage before it moves on.
Creates a task for the team when a case stays in the stage too long. One task per pass of the case through the stage; it closes by itself when the case moves on or closes. Replaces the whole block; null removes it.
CreateStage
nameclosestrue makes arriving at this stage end the conversation: the next message from the person starts a new case. A stage with statusType done ends it too.
closingOutcomeWhy the case closed, written in the case when it arrives here, up to 50 characters. It only counts in a stage that closes. null removes it.
statusTypeWhat the stage means in the pipeline: todo, in_progress or done. null leaves it without a type.
nextStageIdThe stage that follows when no transition holds. A stage of the same pipeline; null removes it.
Where a case goes from this stage, with their conditions. Replaces the whole list; an empty list removes them all.
Settings of the stage. Only the keys you send change, and null removes one.
positionWhere it goes among the stages, from 0. At the end when omitted.
entryMakes it the stage where new cases start. The first stage of a pipeline is the entry when none says so.
agentIdThe agent that works cases in this stage.
requiredFieldsKeys of fields a case needs before it can enter this stage.
StageConfigResponse
agentModeattentionRolemaxDurationSecondsminDurationSecondsdelayMinutesStage
objectidpipelineIdnamepositionentryagentIdrequiredFieldsclosesclosingOutcomestatusTypenextStageIdwhatsappPhoneNumberIdcreatedAtupdatedAtStageList
objecthasMorenextCursorUpdateStage
closestrue makes arriving at this stage end the conversation: the next message from the person starts a new case. A stage with statusType done ends it too.
closingOutcomeWhy the case closed, written in the case when it arrives here, up to 50 characters. It only counts in a stage that closes. null removes it.
statusTypeWhat the stage means in the pipeline: todo, in_progress or done. null leaves it without a type.
nextStageIdThe stage that follows when no transition holds. A stage of the same pipeline; null removes it.
Where a case goes from this stage, with their conditions. Replaces the whole list; an empty list removes them all.
Settings of the stage. Only the keys you send change, and null removes one.
namepositionentrytrue makes it the entry and unmarks the previous one. false is refused: make another stage the entry instead.
agentIdnull unlinks the agent.
requiredFieldsReplaces the list.
whatsappPhoneNumberIdA WhatsApp number of the organization. Messages that arrive at it start their cases in this stage. A number can feed one pipeline only. null releases it.
FieldOption
valuelabelWhat people see. Defaults to the value.
whenParentOnly on a field with dependsOn: the values of the parent field that offer this option. Omitted means always.
CreateField
key^[A-Za-z][A-Za-z0-9_… · requiredLetters, numbers and underscores, starting with a letter. Unique in the pipeline and fixed once created.
typelabelDefaults to the key.
requiredOnly for type select.
dependsOnThe key of a select field this one depends on. One level only.
sourceWho fills it: the team, the channel, your system or the agent.
instructionWhat the agent should ask or look for.
sensitiveHides its value from the agent and from webhooks.
Field
objectidpipelineIdkeylabeltyperequireddependsOnsourceinstructionsensitivecreatedAtupdatedAtFieldList
objecthasMorenextCursorUpdateField
labelrequiredReplaces the options. Cases keep the values they have.
dependsOnsourceinstructionsensitiveCreateRoutingRule
fromStageIdThe stage of this pipeline that triggers the rule.
toPipelineIdThe pipeline the case goes to.
toStageIdA stage of the destination. Its entry stage when omitted.
modecreate opens a new case in the destination and keeps this one. move takes the case there.
enabledRoutingRule
objectidpipelineIdfromStageIdtoPipelineIdtoStageIdmodeenabledcreatedAtupdatedAtRoutingRuleList
objecthasMorenextCursorCreateKnowledgeCollection
name\S · requireddescriptionKnowledgeCollection
objectidnamedescriptiondocumentCountDocuments in any status.
createdAtupdatedAtSearchKnowledge
queryWhat you are looking for, in your own words. It searches by meaning and by exact words (a product code, a name).
collectionIdsSearch only these collections. Leave it out to search all of them.
limitHow many passages to return, best first.
KnowledgePassage
objectcollectionIdcollectionNamedocumentIddocumentNamesourceUrlWhere the document came from, when it has an address.
textThe passage of the document.
scoreHow close the passage is in meaning, from 0 to 1. It is null when the passage was found only by its exact words.
KnowledgeSearch
objectBest first. An empty list means nothing in the knowledge answers it.
KnowledgeCollectionList
objecthasMorenextCursorUpdateKnowledgeCollection
name\Sdescriptionnull clears it.
CreateKnowledgeDocument
name\SRequired with text. With a file it defaults to the file name. The same name in a collection replaces the document.
text\SThe content as text. Send either text or a file, not both.
fileMultipart only. PDF, DOCX, TXT or MD, up to 15 MB. Send either a file or text.
KnowledgeDocumentError
codemessageKnowledgeDocument
objectidcollectionIdnamemimeTypesizeBytesstatuschunkCountSearchable passages.
Set when status is failed.
createdAtupdatedAtKnowledgeDocumentList
objecthasMorenextCursorKnowledgeDocumentWithContent
objectidcollectionIdnamemimeTypesizeBytesstatuschunkCountSearchable passages.
Set when status is failed.
createdAtupdatedAtcontentThe text the agent searches. null until status is ready.
UpdateKnowledgeDocument
name\Stext\SReplaces the content and processes the document again: status goes back to processing.
AgentKnowledgeCollection
objectagentIdcollectionIdgrantedCreateContact
nameemail^[A-Za-z0-9!#$%&'*+/…phoneexternalRefYour own id for this person. Unique in the organization: sending it again is a 409.
companyIdThe company this person works in, created with POST /v2/companies. A company that does not exist in the organization is a 400 with param companyId.
tagsValues for the contact fields you created with POST /v2/contact-fields, by key. Each value is checked against the type of its field. Nothing is saved if one key or value is not accepted.
Presence
onlinetrue when the last active signal is less than 120 seconds old and no offline signal came after.
lastSeenAtThe last time a signal arrived. While online it is exact; once offline it can be up to 5 minutes behind. null when no signal ever arrived for this contact.
Contact
objectidnameemailphoneexternalRefcompanyIdThe company of this contact, or null when it has none.
tagsThe values of the contact fields this contact has, by key. Empty when it has none.
createdAtupdatedAtWhether the contact is online. Present only when the organization setting presenceEnabled is on, at least one presence signal has arrived, and the key has the contacts:presence-read scope.
matchOnly when you search with q: the field of the contact that matched and its value, or null when the match was the name, email, phone or externalRef. Fields marked sensitive are never searched or shown.
caseCountOnly when you search, filter by pipeline or open cases, or sort: how many cases the contact has.
openCaseCountSame as caseCount, only the open ones.
lastActivityAtSame as caseCount: the latest message of its cases, or its creation date.
ContactList
objecthasMorenextCursorUpsertContact
nameRequired to create. When the contact exists and you omit it, the name stays. A new contact with no name is named after the externalRef.
email^[A-Za-z0-9!#$%&'*+/…phonecompanyIdLinks the contact to a company. When you omit it the company stays; null unlinks it. A company that does not exist in the organization is a 400 with param companyId.
tagsValues for the contact fields you created with POST /v2/contact-fields, by key. The keys you omit stay as they were; null removes the value. Each value is checked against the type of its field. Nothing is saved if one key or value is not accepted.
UpdateContact
nameemail^[A-Za-z0-9!#$%&'*+/…null removes it.
phonenull removes it.
externalRefnull removes it.
companyIdLinks the contact to a company, or to another one. null unlinks it. A company that does not exist in the organization is a 400 with param companyId.
tagsReplaces the whole list.
Values for the contact fields you created with POST /v2/contact-fields, by key. The keys you omit stay as they were; null removes the value. Each value is checked against the type of its field. Nothing is saved if one key or value is not accepted.
ContactFieldOption
valuelabelWhat people see. Defaults to the value.
CreateContactField
key^[A-Za-z][A-Za-z0-9_… · requiredLetters, numbers and underscores, starting with a letter. Unique in the organization and fixed once created.
typeThe kind of value it holds. Values are checked against it: email, phone, url, number, date (YYYY-MM-DD), boolean, select (one of the options) or free text.
labelDefaults to the key.
Required for type select and not allowed for the others.
ContactField
objectidkeylabeltypecreatedAtupdatedAtContactFieldList
objecthasMorenextCursorUpdateContactField
labelReplaces the options of a select field. Contacts keep the values they already have.
CreateCompany
namerutUnique among the live companies of the organization.
typestatuswebsiteindustrysourcenotesCompanyDetail
objectidnameruttypeWhat the company is for the organization.
statusHow the relationship is today.
websiteindustrysourcenotescreatedAtupdatedAtcontactIdsThe people of this company, as contact ids.
Company
objectidnameruttypeWhat the company is for the organization.
statusHow the relationship is today.
websiteindustrysourcenotescreatedAtupdatedAtCompanyList
objecthasMorenextCursorUpdateCompany
namerutnull removes it.
typestatuswebsitenull removes it.
industrynull removes it.
sourcenull removes it.
notesnull removes it.
CreateLeadForm
nameForm name
pipelineIdThe pipeline where the leads of this form start. A pipeline that does not exist in the organization is a 400 with param pipelineId.
tagsTags auto-applied to leads
source^[a-z0-9_-]+$Source label for the entity
LeadFormWithSecret
objectidnamepipelineIdThe pipeline where the leads of this form start.
tagssourcestatusAn inactive form does not accept leads.
keyPrefixThe first characters of the key, to tell which key a website has. It is not the key.
createdAtupdatedAtsecretThe key the website sends with each lead. It is shown only here; keep it.
LeadForm
objectidnamepipelineIdThe pipeline where the leads of this form start.
tagssourcestatusAn inactive form does not accept leads.
keyPrefixThe first characters of the key, to tell which key a website has. It is not the key.
createdAtupdatedAtLeadFormList
objecthasMorenextCursorUpdateLeadForm
nameForm name
tagsTags auto-applied to leads
source^[a-z0-9_-]+$Source label
statuspipelineIdMoves the form to another pipeline. A pipeline that does not exist in the organization is a 400 with param pipelineId.
SuppressionInventoryStore
idstorerowsSuppressionInventory
casesopenCasesOpen cases. While there are any, the real call needs closeOpenCases=true.
filesSuppression
objectidnull on a dryRun: nothing was created.
contactIdstatusphasereasonlegalHoldclosedOpenCasesRows erased or anonymized per store. Numbers only.
errorCodeOnly on dryRun: what would be erased, by store, without content.
createdAtcompletedAtdryRunPresent and true only on a dry run: nothing was erased and the inventory shows what would be.
InlineContact
nameRequired to create. When the contact exists and you omit it, the name stays. A new contact with no name is named after the externalRef.
email^[A-Za-z0-9!#$%&'*+/…phonetagscompanyIdThe company of the person, used only when the contact is created here. A company that does not exist in the organization is a 400 with param contact.companyId.
externalRefYour own id for this person. The contact with this externalRef is used; if there is none it is created.
CreateCase
Decision Table
| Variant | Matching Criteria |
|---|---|
| type = object · requires: contactId | |
| type = object · requires: contact |
contactIdThe contact of the case. Send this or contact, never both (400 on contact).
agentIdThe agent that attends the case. It needs the api channel (422 agent_channel_disabled otherwise). Alone, the case opens in the pipeline where this agent attends the entry stage; if it attends the entry of more than one pipeline that is 422 on pipelineId, so send pipelineId or stageId too. A copilot (an agent with audience internal) attends no stage: send its pipelineId or stageId, the case answers with the copilot whatever agent the stage has, and email cases are refused.
pipelineIdThe case enters by the entry stage of this pipeline.
stageIdThe stage where the case starts.
channelemail opens a case you write to by email. The contact needs an email address and the organization a verified sender domain (422 contact_without_email, 422 sender_domain_not_verified). The agent needs the email channel.
fromWith channel email, the sender address. It must belong to a verified domain. Defaults to the first verified domain.
LastMessage
authortypetextThe first 140 characters. null when the message is a file.
CaseContact
idCase
objectidcontactIdpipelineIdstageIdagentIdThe agent that answers the case: the copilot of a copilot case, otherwise the agent of the current stage.
statusassigneeIdchannelWhere the contact talks: whatsapp, email, api (your own system) or in_app. null when the case has no channel to write back.
phoneNumberIdThe WhatsApp number the contact wrote to, when it is a WhatsApp case.
controlWho answers the contact. human also covers a case the agent escalated and nobody took yet: see agentState.
agentStateWhat the agent is doing, to drive a typing indicator: thinking and replying mean it is working; waiting_for_contact means it answered; escalated means it asked for a person; idle is everything else.
unreadMessages of the contact since the last POST /v2/cases/{id}/read.
lastMessageAtA preview of the last public message.
outcomeclosedAtThe values of the fields the pipeline declares, by key. Sensitive fields are not included.
tagsThe tags of the contact of the case.
archivedAtWhen the case was archived: out of the board, state untouched. null when it is on the board.
mutedtrue while the contact is muted: the agent does not answer them and their open cases are closed. Muting belongs to the person, so every case of the contact shows it.
createdAtupdatedAtThe contact with its presence. Present only on GET /v2/cases and GET /v2/cases/{id}, when the organization setting presenceEnabled is on, at least one presence signal has arrived, and the key has the contacts:presence-read scope.
CaseList
objecthasMorenextCursorUpdateCase
Values for fields the pipeline declares, by key, whoever fills them (team, channel, system or agent). A field marked sensitive is written but never returned: read it with POST /v2/cases/{id}/fields/{key}/reveal. Nothing is saved if one key is not accepted.
tagsReplaces the tags of the case. Tags belong to the contact: the contact shows the same list, and so does every other case of the person.
MoveCase
stageIdThe stage to move to. A stage of another pipeline moves the case to that pipeline and needs the cases:reorganize scope. Send this or pipelineId, never both.
pipelineIdMoves the case to the entry stage of this pipeline and needs the cases:reorganize scope. Send this or stageId, never both.
AssignCase
assigneeIdAn active member who can attend cases. null unassigns.
QueuedCase
idcontactNamepipelineIdpipelineNamestageIdstageNameassigneeIdsinceWhen the wait started.
waitMinutesMinutes of attention waited: only the time inside the business hours of the pipeline counts.
waitColorGreen, yellow or red by the wait thresholds of the pipeline. Only the cases waiting for a person carry it.
CaseQueue
objectmemberIdCases the agent handed to a person and nobody took: assigned to the member or without an owner. A case leaves when someone takes it, answers it or it closes.
Cases the member escalated, sitting in a stage with attentionRole escalation, still without an answer.
Cases back in a stage with attentionRole answer whose customer has not been answered yet.
MoveCasesBatch
caseIdsUp to 100 cases of one pipeline.
stageIdThe stage they move to. The cases have to be in the pipeline of this stage: to change pipeline use POST /v2/cases/{id}/move.
NotMovedCase
caseIdreasonnot_found: no such case. not_in_pipeline: the case is in another pipeline. archived or closed: it cannot move. already_in_stage: nothing to do. required_fields_missing: the stage requires fields the case lacks, named in missingFields.
missingFieldsWith required_fields_missing, the keys of the fields.
CaseBatchMove
objectmovedCases that changed stage.
EscalateCase
reasonWhy the case needs a person. Your team sees it.
RevealedCaseField
objectcaseIdkeyvalueThe value as saved. null when the field has no value yet.
ContactEventSent
triggerIdwhatsappMessageIdemailMessageIdContactEventCaseAction
triggerIdactioncaseIdContactEvent
objectidtypecontactIdresultWhat each matching trigger with onEvent did to the case of the contact: opened a new case, moved the open one, left it where it was (unchanged), or found no open case to move (none). Empty when no trigger has onEvent.
reasonWhy nothing was sent: null when the matching triggers only act on the case and have no message, no_trigger, opted_out, no_phone, template_not_approved, human_in_control, cooldown, no_whatsapp_number, not_allowed or missing_variable. Cadence triggers add cadence_active (the contact is already in this cadence) and outside_window (the first attempt waits for the next window). Email triggers add no_email, recipient_not_allowed, no_verified_domain and open_case_elsewhere.
createdAtContactEventList
objecthasMorenextCursorCreateReminder
titledueAtWhen it is due, with the time zone.
assigneeIdThe member who has to do it. They see it in their tasks and get the notice when it is due.
descriptiontypepriorityReminder
objectidcaseIdtitledescriptiontypeprioritystatuspending until someone completes or dismisses it. overdue when its time passed and nobody did.
dueAtassigneeIdcompletedAtcompletionNotecreatedAtupdatedAtReminderList
objecthasMorenextCursorUpdateReminder
titledescriptiontypeprioritydueAtassigneeIdReassigns it. A reminder tied to a meeting made in the dashboard cannot be reassigned: 400 on assigneeId.
CompleteReminder
completionNoteWhat happened. It is saved with the reminder.
PresenceSignal
externalRefThe externalRef you set on the contact. A reference that matches no contact of this organization is ignored.
stateactive: the person is in your app right now, send it about every 60 seconds while they are. offline: they left; they stop showing as online at once.
ReportPresenceSignals
PresenceSignalsResult
objectacceptedHow many signals matched a contact of this organization. It does not say which ones did not.
PresenceSettings
objectenabledThe organization setting presenceEnabled. Presence shows only when it is true and hasSignals is true.
hasSignalsTrue once at least one signal arrived through POST /v2/presence-signals.
UpdatePresenceSettings
enabledtrue shows online and last seen in contacts and cases and allows presence=online. false hides them. Signals keep being stored while it is off.
Organization
objectidnameslugOrganizationBusinessHours
timezonestartHourendHouractiveSaturdayactiveSundayOrganizationSettings
objectWhen the human team attends. Null until it is set. An agent in a stage set to answer outside business hours answers only outside this window.
cerrarTrasDiasSinActividadDays of silence after which a conversation closes by itself. Null means it never closes by inactivity. Until it is set, the house default applies.
presenceEnabledWhether presence shows. Same setting as /v2/presence/settings.
noPersistTracesWhile true, the traces of the agent turns are not stored.
Public branding of the organization: logo, color and links.
CompanyProfile
objectbusinessNamebusinessDescriptionaddressphoneemailwebsiteschedulecustomInstructionsCreateNote
contentauthorNameThe person who writes the note, shown as its author. Omit it to sign with the name of the API key.
Note
objectidcaseIdcontentauthorWho wrote it: authorName, a member, or the name of the API key.
pinnedtrue for the pinned note of the case, shown first.
createdAtupdatedAtNoteList
objecthasMorenextCursorUpdateNote
contentpinnedtrue pins the note and unpins the one that was pinned: a case has one pinned note. false unpins it. Send content, pinned or both.
Attachment
objectidcaseIdfilenamemimeTypesizeBytessourcemanual is uploaded by API or by the team.
createdAtAttachmentList
objecthasMorenextCursorAttachmentDownload
objecturlA signed link. Open it before expiresAt.
expiresAtFile
objectidUse it as fileId in a message, a campaign or a template header.
purposeWhat the file is for. message_media: the image, video or document of one WhatsApp message. campaign_media: the same, for a campaign. template_header: the sample file WhatsApp reviews in a template header. The purpose sets which types and sizes are accepted, and a file only works where its purpose says.
filenamemimeTypeThe type found in the content, not the one the client sent.
sizeBytessha256SHA-256 of the content, in hex.
contactIdThe contact the file is about, or null.
createdAtFileList
objecthasMorenextCursorMessageAttachment
typemimeTypeurlA signed link. Open it before expiresAt.
expiresAtInteractiveButton
idComes back as reply.id when the person taps it. Unique within the message.
titleInteractiveRow
idtitledescriptionInteractiveSection
titleRequired when the list has more than one section.
InteractiveList
buttonThe label of the button that opens the list.
Up to 10 sections and 10 rows in total.
InteractiveProduct
catalogIdThe id of the catalog connected to the WhatsApp number.
productIdThe product id in the catalog (content_id / retailer id), not a Lelemon id.
InteractiveProducts
catalogIdUp to 10 sections and 30 products in total.
InteractiveMediaHeader
typeurlA public https link WhatsApp can download.
InteractiveCta
displayTextThe label of the button that opens the link.
urlA public https link. It opens in the browser of the person.
InteractiveFlow
flowIdThe id of a published WhatsApp Flow of the account.
ctaThe label of the button that opens the Flow.
actionnavigate opens the screen you name in screen (the default). data_exchange asks your Flow endpoint for the first screen.
screenThe id of the first screen. Required when you send data.
The values the first screen starts with.
tokenYour own correlation id. WhatsApp returns it with the Flow answer. Without it, the platform uses the flowId.
InteractiveCall
displayTextThe label of the call button. WhatsApp uses "Call Now".
ttlMinutesMinutes the button stays active. WhatsApp uses 10080 (7 days).
payloadComes back with the call, to know which message it came from.
InteractiveCard
bodyUp to 160 characters and 2 line breaks.
A link button. Send cta or buttons, never both. All cards use the same kind.
Quick replies. Every card has the same number of buttons and the ids are unique in the message.
InteractiveCarousel
Between 2 and 10 cards, in the order the person swipes them.
Interactive
Decision Table
| Variant | Matching Criteria |
|---|---|
| type = object · type="buttons" · requires: body, buttons | |
| type = object · type="list" · requires: body, list | |
| type = object · type="product" · requires: product | |
| type = object · type="product_list" · requires: body, header, products | |
| type = object · type="catalog" | |
| type = object · type="cta_url" · requires: body, cta | |
| type = object · type="flow" · requires: body, flow | |
| type = object · type="location_request" · requires: body | |
| type = object · type="contact_request" · requires: body | |
| type = object · type="call" · requires: body | |
| type = object · type="carousel" · requires: body, carousel |
typebodyThe text of the message. Required for buttons, list and product_list.
Only for type buttons: 1 to 3 buttons.
headerText above the body. Required for product_list.
footerAn image, video or document above the body. Only for buttons and cta_url. Do not send it together with header.
MessageOrderItem
productIdquantitypriceUnit price, as the catalog has it.
currencyMessageOrder
catalogIdMessageFlowResponse
The fields the person filled in the last screen of the Flow.
tokenThe token you sent with the Flow, if any.
MessageContact
MessageError
codeThe WhatsApp error code when WhatsApp rejected the message. null when the platform stopped it before sending.
messageWhy the message failed.
Message
objectidcaseIdauthorauthorNamevisibilitytextcontentTypestatusDelivery to the channel of the case.
createdAtThe buttons, list, product or catalog the message carried. null on any other message.
Set when the person tapped a button or a list row: the id and title they tapped. null otherwise.
Set when the person sent a cart from the WhatsApp catalog. text carries their note. null otherwise.
Set when the person shared a location (answering a location_request or on their own). text carries it as a sentence the agent reads. null otherwise.
Set when the person finished a WhatsApp Flow: the fields they filled in. null otherwise.
Set when the person shared their phone answering a contact_request. A contact card the person forwards on their own is not kept. null otherwise.
Set when status is failed: why. null on any other status. Read it to know whether to retry, send a template (outside the 24-hour window) or stop.
MessageList
objecthasMorenextCursorCreateMessage
Decision Table
| Variant | Matching Criteria |
|---|---|
| type = object · requires: author, text | |
| type = object · requires: author, text | |
| type = object · requires: author, interactive | |
| type = object · requires: author, attachmentIds |
authortextWho is speaking, for an embedded copilot. Only with author contact. It travels signed to every action and MCP server of this turn as the actor, marked as declared by your key and not verified by Lelemon. It is kept for this turn only.
TurnStep
toolName of the tool the agent called. A Lelemon system tool shows its public name (transfer_to_human, save_case_data, send_buttons...), the same one GET /v2/agents/{id}/tools lists. For a tool from an MCP server it is the server slug and the tool name.
statusdurationMsMilliseconds the tool took.
inputWhat the agent sent to the tool, with emails, RUTs, phones, cards and secrets masked by shape. Absent when the tool is marked noPersist: those tools leave only status and duration.
outputWhat the tool answered, masked the same way and cut at 4000 characters. Absent when the tool is marked noPersist.
Turn
objectidcaseIdagentIdmodelThe model that answered the last call of the turn.
statuscompleted: the agent finished by itself. incomplete: it stopped early and delivered a partial answer. failed: it gave no answer.
stopReasoniterationsCalls to the model in the turn.
durationMsomittedStepsTool calls that did not fit in steps (up to 50 steps and 64 KB are kept).
createdAtTurnList
objecthasMorenextCursorUsageTotals
turnsTurns the agent took.
messagesReplies the agent wrote.
inputTokensoutputTokensconversationsConversations opened in the range, the unit that is billed. A conversation is a window per case of up to 10 agent turns or 24 hours, whichever comes first; the next turn opens another one.
casesCases (conversations) in which the agent wrote at least one reply in the range. A case counts once however many replies it has.
UsageGroup
turnsTurns the agent took.
messagesReplies the agent wrote.
inputTokensoutputTokensconversationsConversations opened in this group. Absent with groupBy=model: a conversation is not split by model.
casesCases in which the agent wrote a reply in this group. A case with replies on two days counts in both, so the groups can add up to more than totals.cases. Absent with groupBy=model: a case is not split by model.
dayagentIdmodelsubaccountIdWith groupBy=subaccount. null is the usage of the platform itself, which is not in any subaccount.
Usage
objectfromtotimezoneCaseMetrics
objectcaseIdpipelineIdstatuscontrolWho has the case now. human also covers a case the agent handed off and nobody took yet.
createdAtescalatedAtThe first time the agent handed the case to a person.
takenAtThe first time a person took the case.
takenByThe member who took it first. null when nobody did, or when it was taken from the phone.
closedAtWhen it was closed. null while it is open.
closedByWho closed it: the agent, a person, or the system (inactivity, follow-ups exhausted). null while it is open.
resolvedByAgentTrue when the agent closed it without handing it off and without anyone taking it.
waitSecondsSeconds between the last handoff and the first time a person took the case. null when it was never handed off and taken.
agentSecondsSeconds the agent attended the case.
humanSecondsSeconds a person attended the case.
updatedAtThe last change. It is the field the range filters by.
CaseMetricsList
objecthasMorenextCursorCreateBudget
scopemonthlyLimitConversationsMonthly limit in conversations. A conversation is a window per case of up to 10 agent turns or 24 hours, whichever comes first.
subjectIdRequired for subaccount (sub_), agent (agt_) and contact (ctc_). Not allowed for organization. A subaccount budget needs the platform key without Lelemon-Subaccount; the key of the subaccount cannot see or raise it.
alertPercentenforcementBudgetPeriod
startFirst day of the month.
resetsAtWhen the month ends and the spent amount goes back to zero.
Budget
objectidscopeWhat the budget covers: the whole organization, one subaccount, one agent or one contact.
subjectIdThe sub_, agt_ or ctc_ id the budget covers. null for the organization.
monthlyLimitConversationsMonthly limit in conversations.
alertPercentPercent of the limit that fires budget.threshold_reached.
enforcementstop: at the limit the agent stops and the API answers 402 budget_exceeded. notify: the agent keeps working and only the events fire.
usedConversationsConversations used this month.
stateok: under the alert percent. alert: past it. limit_reached: the used conversations reached the limit.
createdAtupdatedAtBudgetList
objecthasMorenextCursorUpdateBudget
monthlyLimitConversationsNew monthly limit in conversations. Raising it makes a stopped agent answer again at once and re-arms the alert.
alertPercentenforcementMember
objectidThe id that POST /v2/cases/{id}/assign takes as assigneeId.
nameemailroleThe role of the member. A viewer cannot be assigned cases.
availabilityWhether the member is receiving new cases right now.
caseScopeWhich cases the member sees, when set for them: all (every case of their pipelines), unassigned_and_own (the unassigned ones and theirs) or assigned (only theirs). null means they follow the default of the organization.
effectiveCaseScopeWhat the member sees now: caseScope, or the default of the organization when that is null. The owner and admins always see all. The MCP connector of Lelemon only works for people who see all.
createdAtMemberList
objecthasMorenextCursorMemberAuditActor
memberIdThe member who did it, the same id members.list returns.
apiKeyIdThe API key used. null when it was done from the panel.
MemberAuditTarget
memberIdThe member it was done to. null while the person is only invited and has not joined.
invitationIdThe invitation it was done to, if the person was invited.
emailMemberAuditEntry
objectidactionroleBeforeroleAfterscopeBeforeOnly in member.scope_changed: the case scope before. null means the default of the organization (and, in other actions, that it does not apply).
scopeAfterOnly in member.scope_changed: the case scope after.
createdAtMemberAuditList
objecthasMorenextCursorMemberAvailability
objectmemberIdemailstatusWhat was marked, by the person or by the API. It does not consider the opening hours of the organization: that is availableForAssignment.
availableForAssignmentWhether the assignment would give this person a new case right now. false if away, and also if available but the organization has opening hours and they are closed: the automatic away by schedule wins, unless the person asked to keep going a while longer (extendedUntil in the future).
changedAtWhen the status last changed. null if it never did.
extendedUntilUntil when the person asked to keep receiving cases after the opening hours. null if there is no extension.
SetMemberAvailability
statusavailable: can receive new cases. away: the assignment skips them and any extension they asked for is dropped.
UpdateMemberRole
roleThe new role. It cannot be above the current role of whoever issued the key, and nobody is named owner by API.
UpdateMemberCaseScope
caseScopeall: sees every case of their pipelines. unassigned_and_own: the unassigned ones and theirs. assigned: only theirs. null: goes back to the default of the organization.
Invitation
objectidemailrolestatuspending can still be accepted. expired passed its 7 days: resend it to renew it. accepted already joined. cancelled can no longer be accepted.
invitedByThe member who invited, the same id members.list returns.
invitedAtWhen it was sent. Resending renews it.
expiresAtInvitationList
objecthasMorenextCursorCreateInvitation
email^[A-Za-z0-9!#$%&'*+/… · requiredroleThe owner invites up to admin. An admin invites member or viewer. Nobody invites as owner.
InvitationDelivery
objectidemailrolestatuspending can still be accepted. expired passed its 7 days: resend it to renew it. accepted already joined. cancelled can no longer be accepted.
invitedByThe member who invited, the same id members.list returns.
invitedAtWhen it was sent. Resending renews it.
expiresAtemailSentfalse when the email could not be sent. The invitation is created anyway: resend it with invitations.resend or ask the person to check the address. The acceptance link is never returned by the API.
Agenda
objectidslugThe short name your team gave the agenda. A filter-friendly label: routes take the id, never the slug.
nametimezoneThe time zone the opening hours of the agenda are read in.
slotDurationMinutesLength of every meeting.
minNoticeHoursHow many hours ahead a slot must start to be offered. Earlier slots are not listed.
maxDaysAheadHow many days ahead the agenda accepts bookings. It caps daysAhead.
bufferBeforeMinutesFree minutes kept before every meeting.
bufferAfterMinutesFree minutes kept after every meeting.
assignmentStrategyHow a booking picks the team member who takes it.
Opening hours by day of the week, in the time zone of the agenda. A day with no ranges is closed.
defaultTitledefaultDescriptiongenerateMeetLinkWhether each meeting gets a video call link.
createdAtupdatedAtAgendaList
objecthasMorenextCursorCreateAgenda
nameslugShort name of the agenda, unique in the organization: lowercase letters, numbers and hyphens. Routes take the id, never the slug.
assignmentStrategyHow a booking picks the team member who takes it.
timezoneThe time zone the opening hours are read in.
slotDurationMinutesLength of every meeting.
bufferBeforeMinutesFree minutes kept before every meeting.
bufferAfterMinutesFree minutes kept after every meeting.
minNoticeHoursHow many hours ahead a slot must start to be offered.
maxDaysAheadHow many days ahead the agenda accepts bookings.
Opening hours by day of the week, in the time zone of the agenda. A day with no ranges is closed.
defaultTitledefaultDescriptiongenerateMeetLinkUpdateAgenda
nameslugShort name of the agenda, unique in the organization: lowercase letters, numbers and hyphens. Routes take the id, never the slug.
assignmentStrategyHow a booking picks the team member who takes it.
timezoneThe time zone the opening hours are read in.
slotDurationMinutesLength of every meeting.
bufferBeforeMinutesFree minutes kept before every meeting.
bufferAfterMinutesFree minutes kept after every meeting.
minNoticeHoursHow many hours ahead a slot must start to be offered.
maxDaysAheadHow many days ahead the agenda accepts bookings.
Opening hours by day of the week, in the time zone of the agenda. A day with no ranges is closed.
defaultTitledefaultDescriptiongenerateMeetLinkAgendaMember
objectidThe same id that GET /v2/members lists.
namecalendarConnectedWhether the person has a connected calendar the agenda can read. Without one the person adds no free slots.
activeWhether the person takes bookings from this agenda. false keeps them in the agenda without offering their slots.
priorityWeight when the agenda assigns by priority: higher takes more bookings.
AgendaMemberList
objecthasMorenextCursorAddAgendaMember
memberId^mbr_[0-9A-Za-z]{22}… · requiredAn active member of the organization. List them with GET /v2/members.
prioritySlot
startWhen the slot starts. Send it as start to book it.
endAvailability
objectagendaIdtimezoneThe free slots, nearest first. An empty list means there are none in the window asked.
CreateMeeting
agendaId^agd_[0-9A-Za-z]{22}… · requiredThe agenda to book in. The one you asked availability for.
start(Z|[+-]\d{2}:\d{2})$ · requiredWhen it starts, ISO 8601 with a time zone. It must be the start of a slot from the availability of the agenda.
attendeeEmail^[A-Za-z0-9!#$%&'*+/… · requiredWho is booked. The invitation goes to this address.
attendeeNameattendeePhonecompanyNameGoes into the description of the calendar event.
contextWhat the meeting is for. Goes into the description of the calendar event so whoever attends arrives knowing.
Meeting
objectidagendaIdstatusscheduled is a booked meeting. canceled is closed and frees the slot.
startenddurationMinutestimezoneattendeeEmailattendeeNameattendeePhonecompanyNamecontextmeetLinkThe video call link the attendee got in the invitation.
canceledAtWhen the meeting was canceled. null if it was not.
cancelReasoncreatedAtupdatedAtMeetingList
objecthasMorenextCursorRescheduleMeeting
start(Z|[+-]\d{2}:\d{2})$ · requiredThe new start, ISO 8601 with a time zone. It must be a free slot of the agenda and the person assigned must be free then.
WebhookEndpointWithSecret
objectidurldescriptionenabledEventsapiVersionscopestatusdisabledReasonWhy the system turned the endpoint off, when it did.
createdAtupdatedAtsecretSigning secret. It is shown only here; keep it. Verify with Lelemon-Signature.
previousSecretExpiresAtAfter a rotation, until when the previous secret still signs. Both signatures go in the header.
WebhookEndpoint
objectidurldescriptionenabledEventsapiVersionscopestatusdisabledReasonWhy the system turned the endpoint off, when it did.
createdAtupdatedAtWebhookEndpointList
objecthasMorenextCursorWebhookEndpointRotation
objectidurldescriptionenabledEventsapiVersionscopestatusdisabledReasonWhy the system turned the endpoint off, when it did.
createdAtupdatedAtpreviousSecretExpiresAtUntil when the previous secret still signs. Both signatures go in the header.
secretThe new signing secret. It is shown only here; keep it. Verify with Lelemon-Signature. Absent in a dryRun, which rotates nothing.
Event
objectidtypeThe event type, such as case.escalated. See GET /v2/event-types.
createdAtorganizationIdThe shape depends on type. See GET /v2/event-types.
customerIdThe subaccount the event belongs to, when there is one.
WebhookDelivery
objectidSame value the endpoint received in Lelemon-Delivery-Id.
endpointIdeventIdeventTypeattemptstatusfailed will be retried. exhausted is the last attempt: it is not retried again.
httpStatuserrordurationMscreatedAtWebhookDeliveryList
objecthasMorenextCursorResendEvent
endpointIdSend only to this endpoint. Without it, to every enabled endpoint subscribed to the event.
EventType
objecttypedescriptionJSON Schema of the data of this event.
EventTypeList
objecthasMorenextCursorRecipientAllowlist
objectenabledWhile true, nothing is sent to anyone who is not in entries. While false, the list is kept but ignored.
entriesPhones in E.164, emails, or whole domains written as @domain. A domain does not include its subdomains.
updatedAtdryRunPresent and true only on a dry run: the list shown is what would be saved, and nothing was saved.
ReplaceRecipientAllowlist
enabledentriesReplaces the whole list. Phones in E.164 (+56912345678), emails (ana@empresa.cl) or domains (@empresa.cl).
TemplateHeaderInput
typeThe media above the body. document: send it with the document field of each message. image and video: send it with components.headerImage or components.headerVideo.
exampleFileIdA file you uploaded with POST /v2/files and purpose template_header. WhatsApp reviews it as the sample of the header, and its type must match the header (image, video or document). Send exampleFileId or exampleUrl, one of them. Preferred over a URL.
exampleUrlA public https file Meta reviews as the sample of the header. Lelemon downloads it and uploads it to WhatsApp, so it must stay reachable while the template is created.
TemplateButtonInput
typequick_reply sends a reply back when tapped (it arrives as a message with reply {id, title}). url opens a link. catalog opens the catalog of the number (no extra fields). mpm opens a selection of products you choose when you send (components.mpm). flow opens a WhatsApp Flow (flowId).
textpayloadOnly for quick_reply. It comes back as reply.id when the person taps the button. Without it, reply.id is the button text.
urlOnly for url, and then required. A public https link. It can end with one variable written like {{order_id}}, for example https://shop.example.com/orders/{{order_id}}: you give its value in variables when you send, and its sample in examples.
flowIdOnly for flow, and then required: the id of a published Flow.
flowActionOnly for flow. navigate opens the screen (the default).
screenOnly for flow with navigate: the id of the first screen.
TemplateCardHeader
typeexampleFileIdA file you uploaded with POST /v2/files and purpose template_header, an image or a video that matches type. Send exampleFileId or exampleUrl, one of them.
exampleUrlA public https sample WhatsApp reviews for the card.
TemplateCardButton
typetextpayloadOnly for quick_reply.
urlOnly for url, and then required: https, no variables.
TemplateCard
One or two buttons. Every card has the same buttons in the same order.
bodyIn every card or in none.
TemplateCarousel
typemedia: 2 to 10 cards with an image or video, fixed when the template is created. product: cards that show products of the catalog; the template is created with two and you send 2 to 10 cards.
Only for media.
buttonTextOnly for product, and then required: the text of the button of each card.
CreateTemplate
name^[a-z][a-z0-9_]{0,51… · requiredlowercase_with_underscores.
languagecategorybodyWith named variables: {{name}}.
A sample value for each variable.
footerUp to 10 buttons, at most 2 of type url. Marketing templates also get the opt-out button, which counts toward the 10: in the language of the template, or your own text if you send a quick_reply with payload lelemon_stop_messages. Quick replies are kept together before the links.
Swipeable cards under the body, with media or with catalog products. WhatsApp checks the combination with the other parts when it reviews the template.
TemplateButton
typetextpayloadurlflowIdflowActionscreenTemplate
objectidnamelanguagecategorystatusrejectionReasonbodyfooterbuttonsTexts of the buttons.
The buttons with their type, payload or link.
variablesThe variables of the body and of the links of the buttons.
createdAtupdatedAtTemplateSync
objectcheckedTemplates checked against WhatsApp.
updatedTemplates whose status changed.
importedTemplates found on WhatsApp that were not here.
TemplateList
objecthasMorenextCursorTemplateRender
objecttextbuttonsHeaderDocument
fileIdA file you uploaded with POST /v2/files. In a single message it needs purpose message_media; in a campaign, campaign_media. Preferred over a URL.
attachmentIdA file you uploaded to a case. Use fileId for a file uploaded with POST /v2/files.
urlA public https URL that WhatsApp can download.
filenameHeaderMedia
fileIdA file you uploaded with POST /v2/files. In a single message it needs purpose message_media; in a campaign, campaign_media. Preferred over a URL: WhatsApp gets the bytes from Lelemon, not from your server.
attachmentIdA file you uploaded to a case. Use fileId for a file uploaded with POST /v2/files.
urlA public https URL that WhatsApp can download.
SendCatalog
thumbnailProductIdThe product whose image heads the message. Without it WhatsApp uses the first product of the catalog.
SendProductSection
titleproductIdsSendMpm
thumbnailProductIdUp to 10 sections and 30 products in total.
SendFlow
tokenYour own correlation id. WhatsApp returns it with the Flow answer.
The values the first screen of the Flow starts with.
CardMedia
fileIdA file you uploaded with POST /v2/files, with purpose message_media in a single message or campaign_media in a campaign. Send fileId or url, one of them.
urlA public https URL that WhatsApp can download.
SendCard
The image of the card. Media carousels with image cards.
The video of the card. Media carousels with video cards.
productIdThe product of the card (retailer id in the catalog). Product carousels.
SendComponents
The image of the header, for templates with an image header.
The video of the header, for templates with a video header.
For templates with a catalog button. Optional.
For templates with a multi-product button. Required then.
For templates with a flow button. Optional.
catalogIdThe catalog of the products of a product carousel. It must be the one connected to the number that sends.
For templates with a carousel. Media carousel: as many cards as the template has, each with its image or video. Product carousel: 2 to 10 cards, each with a productId.
TestTemplate
toBy default, the sample values the template was created with.
What the template needs besides its variables: image or video header, products, Flow data, cards.
WhatsappMessage
objectidstatustemplateIdcontactIdcaseIdsendAtskipReasonWhy it was skipped: opted_out, no_phone, template_not_approved, human_in_control, cooldown, not_allowed or canceled.
createdAtRecipient
Decision Table
| Variant | Matching Criteria |
|---|---|
| type = object · requires: contactId | |
| type = object · requires: externalRef | |
| type = object · requires: phone |
contactIdOnReply
agentIdThe agent that continues if they answer.
stageIdThe stage where the case continues if they answer.
instructionsThe context the agent gets if they answer. For this send, it replaces the fixed instructions of the trigger.
CreateWhatsappMessage
Exactly one of contactId, externalRef or phone.
templateIdThe document of the header, for templates that have one.
What the template needs besides its variables: image or video header, products, Flow data, cards.
sendAtSchedule it. Without it the message goes out now.
fromThe number to send from. By default the one that fits the template and the agent.
EventContact
externalRefYour own id for this person. The contact is created if it is new.
namephoneemail^[A-Za-z0-9!#$%&'*+/…companyIdLinks the contact to a company. When you omit it the company stays. A company that does not exist in the organization is a 400 with param contact.companyId.
CreateContactEvent
typeYour own name for the fact.
Values the triggers can map to template variables.
For this event only. onReply.instructions replaces the fixed instructions of the trigger.
TriggerEmail
subject^[^\r\n]*$ · requiredSubject. {{variable}} placeholders are filled from variables.
textText of the first email, with {{variable}} placeholders.
fromThe sender. It must belong to a verified domain. Defaults to the first verified domain.
TriggerOnEventInput
Opens a case for the contact in this pipeline and stage when the event arrives. If the contact already has an open case in the pipeline, it is left where it is.
Moves the open case of the contact in the pipeline of this stage to the stage when the event arrives. If the contact has no open case there, nothing happens.
DailyWindow
from^([01]\d|2[0-3]):([0… · requiredto^([01]\d|2[0-3]):([0… · requiredtimezoneTriggerCadenceInput
attemptsHow many times the template is sent at most, the first one included. The first goes out when the event arrives.
intervalHoursHours between one attempt and the next.
Attempts only go out between from and to in this time zone. An attempt that falls outside waits for the next from.
stopOnWhat ends the cadence, checked right before each attempt: reply (the contact wrote back), opt_out, stage_changed (the case left the stage it was in) and closed (the case was closed). opt_out always applies, even if you leave it out.
CreateTrigger
contactEventYour own name for the fact, as you send it in POST /v2/contact-events.
channelwhatsapp sends the template. email sends the text in email and opens a case the agent continues.
templateIdThe template to send. A whatsapp trigger needs either templateId or onEvent. Without templateId it sends no message and only acts on the case, so variables, onReply, instructions, cooldownDays and cadence do not apply.
Required for email.
Template (or email placeholder) variable to a path in the event: data.x or contact.name, contact.phone, contact.email, contact.externalRef. Any other text is used as is. Required when the trigger has a template or an email; leave it out when it has neither.
instructionsContext the agent gets if they answer. An event can replace it with onReply.instructions.
cooldownDaysDon't send twice to the same contact within this many days.
What happens to the contact case the moment the event arrives, without waiting for a reply. Send exactly one of openCase or moveCase. WhatsApp triggers only. With no templateId it is the whole trigger: the case is opened or moved and no message goes out.
Repeat the template up to attempts times, every intervalHours, until the contact replies, opts out, or the case changes stage or closes. WhatsApp triggers only. cooldownDays applies to the first attempt only.
TriggerCadence
attemptsintervalHoursstopOnTrigger
objectidcontactEventchanneltemplateIdinstructionscooldownDaysstatuscreatedAtupdatedAtTriggerList
objecthasMorenextCursorCadenceRun
objectidcontactThe contact the cadence is running for.
statusstopReasonWhy the cadence stopped. Null while it is active.
attemptsMademaxAttemptsintervalHoursnextAtWhen the next attempt goes out. Null unless it is active.
startedAtupdatedAtCadenceRunList
objecthasMorenextCursorUpdateTrigger
contactEventtemplateIdEmail triggers only.
instructionscooldownDaysstatusOptOut
objectcontactIdchannelsourcecontact: they asked for it. organization: you set it through the API.
createdAtOptOutList
objecthasMorenextCursorContactFilter
tagslastCaseAfterContacts with a case opened after this date.
createdAfterContacts created after this date.
Schedule
atWhen the campaign starts after you launch it: a date-time, or "now" to start as soon as you launch it. "now" is saved as the moment you created the campaign, so reading it back gives a date-time. A date in the past also starts at once.
batchSizebatchEveryMinutesCreateCampaign
nametemplateIdcontactFilter or externalRefs.
Template variable to contact.name, contact.phone, contact.email or contact.externalRef. Any other text is used as is.
What the template needs besides its variables: image or video header, products, Flow data, cards.
CampaignOnReply
agentIdstageIdinstructionsCampaignCounts
recipientspendingqueuedsentdeliveredreadrepliedRecipients whose contact wrote back after receiving the message, counted once each. It is not a status: a recipient can be read and replied at once.
failedskippedCampaign
objectidnamestatustemplateIdThe components saved on the campaign (media headers by fileId or url, cards, products), as you sent them. null when it has none.
The document header saved on the campaign, as you sent it. null when it has none.
Who continues the conversation if the contact answers, as you sent it. null when it was not set.
pauseReasonWhy it paused by itself, if it did.
launchedAtcreatedAtupdatedAtCampaignList
objecthasMorenextCursorUpdateCampaign
nametemplateIdSend 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.
Send null to remove who continues if they answer.
CampaignCost
amountcurrencyeffectiveFromDate from which the Meta rate card used for the estimate applies.
CampaignPreview
objectrecipientsContacts that would get the message.
sampleList 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.
CampaignRecipient
objectcontactIdstatusskipReasonwhatsappMessageIdCampaignRecipientList
objecthasMorenextCursorCreateEmailDomain
nameThe domain emails go out from.
defaultFromLocalThe part before the @ of the default sender address.
inboundAgentIdThe agent that opens a case when a stranger writes to an address of this domain. Without it, mail from people with no thread is ignored.
DnsRecord
recordDKIM signs your emails; MX routes the replies to Lelemon.
typenamevalueprioritystatusEmailDomain
objectidnamestatusOnly a verified domain can send. Add the records; verification completes on its own once DNS answers, and POST /v2/email/domains/{id}/verify checks it right away.
defaultFrominboundAgentIdverifiedAtcreatedAtupdatedAtEmailDomainList
objecthasMorenextCursorEmailRecipient
Decision Table
| Variant | Matching Criteria |
|---|---|
| type = object · requires: contactId | |
| type = object · requires: externalRef | |
| type = object · requires: email |
contactIdCreateEmailMessage
Exactly one of contactId, externalRef or email.
subject^[^\r\n]*$ · requiredtextfromThe sender. It must belong to a verified domain. Defaults to the first verified domain.
Who continues if they answer. The agent needs the email channel. Without agentId or stageId the case reuses the open email case of the contact.
EmailMessage
objectiddirectionstatuscaseIdcontactIdsubjectfromtoskipReasonWhy it was skipped: opted_out, recipient_not_allowed, no_email, human_in_control, cooldown, no_verified_domain or open_case_elsewhere.
createdAtTeamMember
idThe same id that GET /v2/members lists.
nameemailroleisLeaderWhether the member leads the team.
receivesCasesWhether the assignment gives this member new cases.
Team
objectidnamemaxChatsPerPersonHow many open chats a member can hold at once. null means no limit.
TeamList
objecthasMorenextCursorTeamDetailMember
idThe same id that GET /v2/members lists.
nameemailroleisLeaderWhether the member leads the team.
receivesCasesWhether the assignment gives this member new cases.
availableWhether the member is marked available.
activeChatsChats the member holds now.
TeamQueue
countoldestSinceSince when the oldest waiting case has been in the queue.
TeamDetail
objectidnamemaxChatsPerPersonHow many open chats a member can hold at once. null means no limit.
Cases of the team pipelines waiting for someone to take them.
CreateTeam
namepipelineIdsPipelines to move into the new team. A pipeline belongs to exactly one team, so it leaves the one it had.
UpdateTeam
namemaxChatsPerPersonOpen chats a member can hold at once. null removes the limit.
MergeTeam
sourceTeamIdThe team that goes into this one. Its pipelines and members move over and it is deleted.
SetTeamMember
isLeaderMakes the member a leader, or stops them being one. A viewer cannot lead.
receivesCasesWhether the assignment gives this member new cases.
LinearWebhook
urlPaste it as the URL of a webhook in Linear (Settings, API, Webhooks) with the Issues resource and the team of this integration.
secretConfiguredfalse until you save the signing secret Linear shows for that webhook. Without it every notification is rejected.
LinearIntegration
objectidteamIdteamKeyteamNameprojectIdcreatedAtupdatedAtConnectLinear
apiKey^\S+$ · requiredA Linear personal API key. Create it in Linear, Settings, Account, Security and access. Use the key of a service user that can see the team. It is stored encrypted and never returned.
team^\S+$ · requiredThe key or the id of the Linear team that receives the issues.
project^\S+$The id of a project of that team. Without it the issues have no project.
UpdateLinear
apiKey^\S+$Replaces the API key.
team^\S+$Another team key or id.
project^\S+$Another project id. null removes it.
webhookSecret^\S+$The signing secret Linear shows when you create the webhook. It is stored encrypted and never returned.
EscalateToTeam
answerStageIdThe stage of the same pipeline where the case goes when the team completes the issue. Without it, the stage of the pipeline with config.attentionRole answer; if the pipeline has none, the case stays where it is and only gets the answer as a note.
TeamEscalation
objectidcaseIdstatuspending: the issue is not created yet and Lelemon keeps trying. created: the team has it. completed: the team completed it and the answer reached the case. canceled: the team canceled the issue, so there is no answer and the case stays where it was. failed: Lelemon gave up; saving the Linear connection again tries again.
originstage: the case entered a stage marked to escalate. manual: someone asked for it.
answerStageIdanswerThe last comment of the team on the issue, once it is completed.
lastErrorWhy the last attempt to create the issue failed.
completedAtcreatedAtTeamEscalationList
objecthasMorenextCursorDryRun
dryRunPresent and true when the request had dryRun=true.
CreateContactMessage
authortextWho is speaking, for an embedded copilot. Only with author contact. It travels signed to every action and MCP server of this turn as the actor, marked as declared by your key and not verified by Lelemon. It is kept for this turn only.
CreateTeamTextMessage
authortextauthorNameWho signs a team message. Defaults to the author name of the key.
visibilityinternal is a note only your team sees: it never reaches the person or the agent, and it needs neither cases:send nor control of the case.
subject^[^\r\n]*$Email cases only. The subject of the thread. Required on the first message of the case and ignored after that.
attachmentIdsFiles already uploaded with POST /v2/cases/{id}/attachments, sent by the channel of the case. Each file goes as its own message, and the text is the caption of the first. The response is the first message. Team messages only.
CreateTeamInteractiveMessage
authorA WhatsApp message with buttons, a list, a product, a product list or the catalog, instead of text. Team messages on WhatsApp cases only, inside the 24 hours window (422 interactive_unsupported_channel on other channels, 422 channel_window_closed after the window). Do not send text or attachmentIds with it: interactive.body is the text. The tap of the person arrives as a message with reply {id, title}.
authorNameWho signs a team message. Defaults to the author name of the key.
CreateTeamFilesMessage
authorattachmentIdsFiles already uploaded with POST /v2/cases/{id}/attachments, sent by the channel of the case. Each file goes as its own message, and the text is the caption of the first. The response is the first message. Team messages only.
textauthorNameWho signs a team message. Defaults to the author name of the key.
subject^[^\r\n]*$Email cases only. The subject of the thread. Required on the first message of the case and ignored after that.
InteractiveButtonsMessage
typebodyThe text of the message. Required for buttons, list and product_list.
Only for type buttons: 1 to 3 buttons.
headerText above the body. Required for product_list.
footerAn image, video or document above the body. Only for buttons and cta_url. Do not send it together with header.
InteractiveListMessage
typebodyThe text of the message. Required for buttons, list and product_list.
Only for type list.
headerText above the body. Required for product_list.
footerInteractiveProductMessage
typeOnly for type product.
bodyThe text of the message. Required for buttons, list and product_list.
headerText above the body. Required for product_list.
footerInteractiveProductListMessage
typebodyThe text of the message. Required for buttons, list and product_list.
headerText above the body. Required for product_list.
Only for type product_list.
footerInteractiveCatalogMessage
typebodyThe text of the message. Required for buttons, list and product_list.
headerText above the body. Required for product_list.
footerOnly for type catalog.
InteractiveCtaUrlMessage
typebodyThe text of the message. Required for buttons, list and product_list.
Only for type cta_url.
headerText above the body. Required for product_list.
footerAn image, video or document above the body. Only for buttons and cta_url. Do not send it together with header.
InteractiveFlowMessage
typebodyThe text of the message. Required for buttons, list and product_list.
Only for type flow.
headerText above the body. Required for product_list.
footerInteractiveLocationRequestMessage
typebodyThe text of the message. Required for buttons, list and product_list.
InteractiveContactRequestMessage
typebodyThe text of the message. Required for buttons, list and product_list.
InteractiveCallMessage
typebodyThe text of the message. Required for buttons, list and product_list.
Only for type call. Optional: WhatsApp has defaults.
InteractiveCarouselMessage
typebodyThe text of the message. Required for buttons, list and product_list.
Only for type carousel.
ApprovalCondition
Decision Table
| Variant | Matching Criteria |
|---|---|
| type = object · requires: param, op | |
| type = object · requires: all | |
| type = object · requires: any |
paramA path into the arguments of the action, like amount or order.total.
opvalueWhat to compare with. A list for in; leave it out for exists.
ApprovalComparison
paramA path into the arguments of the action, like amount or order.total.
opvalueWhat to compare with. A list for in; leave it out for exists.
ApprovalAllOf
Every condition must hold.
ApprovalAnyOf
At least one condition must hold.
ConnectorManifest
formatnameConnectorAccountSearch
objecthasMore