DEVELOPERS

Connect Messenger to the systems around your CRM.

Send texts, start AI bot calls, and follow the outcome through a scoped API and signed events. Keep organisation rules and usage controls across your integrations.

GET STARTED

One API. Your organisation’s rules.

CRM Administrators create and manage keys in Messenger → Admin → Developer access. Connect your organisation account in OAuth Setup first. Requests use that account’s current CRM permissions; reconnecting changes the execution account for every key. Keep keys on your server.

Authentication and access

Send Authorization: Bearer YOUR_API_KEY. Choose resources:read, messages:read/write and calls:read/write when creating a key. Number and bot restrictions narrow access; empty selections allow all permitted resources. Revoked or expired keys fail immediately. The subscription and connected account’s enabled seat must remain active. Existing pilot gates can return 503 PILOT_PENDING.

Test and live requests

ze_test_ keys simulate message and call creation without contacting carriers or writing CRM actions. Reads still return permitted CRM data. Simulated IDs start with test_ and cannot be read as CRM records. Test cancellation does not modify CRM. ze_live_ keys execute real actions under sending hours, AI settings and allowances.

Retries and idempotency

Message and call creation require an Idempotency-Key of at most 128 characters. Retry the same operation and payload with the same key. Changed payloads require a new key. A 409 ACTION_PROCESSING means reconciliation is underway; retry unchanged. The explorer preserves keys for unchanged retries, including after a timeout.

Scheduling and pagination

Use scheduledFor with an ISO 8601 timezone offset, at least 30 seconds in the future. Cancel only future Queued actions before dispatch. Conversation endpoints page through 50 CRM messages; pass nextCursor as cursor until null. Conversation summaries cover each page and can repeat across pages.

Responses and limits

A 202 means accepted or scheduled, not delivered. Poll the corresponding message or AI call record for status. Requests are limited to 60 per minute per key. On 429, wait for Retry-After. Errors include error.code, error.message and error.requestId; every response includes X-Request-ID.

Errors and connection health

400: invalid input; 401: invalid, revoked or expired key; 403: missing scope, denied resource, inactive subscription/seat or unavailable organisation authorization; 404: missing resource; 409: processing or already dispatched; 413: oversized body; 500/502: service or CRM failure; 503: setup or pilot unavailable. Reconnect in CRM OAuth Setup for OAUTH_REQUIRED or IDENTITY_CHANGED.

Download OpenAPI specification · Signed webhook documentation

TRY IT NOW

Build and submit a request.

Your key stays in this page’s memory and is sent only to the API. Live actions require confirmation.

Request preview (key redacted)
curl -X GET 'https://zemessenger.com/api/v1/numbers' \
  -H 'Authorization: Bearer YOUR_API_KEY'

API REFERENCE

Every endpoint, with examples.

GET /api/v1/numbers

List permitted sender numbers · Scope: resources:read

Example request
curl -X GET 'https://zemessenger.com/api/v1/numbers' \
  -H 'Authorization: Bearer YOUR_API_KEY'
Success response and schema

HTTP 200 — Success

{
  "items": [
    {
      "sid": "PN_EXAMPLE",
      "phoneNumber": "+447700900456",
      "friendlyName": "Office",
      "capabilities": {
        "sms": true,
        "voice": true
      },
      "voiceOutboundBotId": null
    }
  ]
}
Response schema
{
  "type": "object",
  "properties": {
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "sid": {
            "type": "string"
          },
          "phoneNumber": {
            "type": "string",
            "pattern": "^\\+[1-9]\\d{7,14}$",
            "example": "+447700900123",
            "description": "International telephone number in E.164 format."
          },
          "friendlyName": {
            "type": "string"
          },
          "capabilities": {
            "type": "object",
            "properties": {
              "sms": {
                "type": "boolean"
              },
              "voice": {
                "type": "boolean"
              }
            },
            "required": []
          },
          "voiceOutboundBotId": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "sid",
          "phoneNumber",
          "friendlyName",
          "capabilities",
          "voiceOutboundBotId"
        ]
      }
    }
  },
  "required": [
    "items"
  ]
}

GET /api/v1/bots

List active outbound bots · Scope: resources:read

Example request
curl -X GET 'https://zemessenger.com/api/v1/bots' \
  -H 'Authorization: Bearer YOUR_API_KEY'
Success response and schema

HTTP 200 — Success

{
  "items": [
    {
      "id": "bot-example",
      "name": "Follow-up assistant",
      "description": "Customer follow-up calls"
    }
  ],
  "managementUrl": null
}
Response schema
{
  "type": "object",
  "properties": {
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "id",
          "name"
        ]
      }
    },
    "managementUrl": {
      "type": [
        "string",
        "null"
      ]
    }
  },
  "required": [
    "items"
  ]
}

GET /api/v1/templates

List CRM message templates · Scope: resources:read

Returns up to 200 available templates ordered by name.

Example request
curl -X GET 'https://zemessenger.com/api/v1/templates' \
  -H 'Authorization: Bearer YOUR_API_KEY'
Success response and schema

HTTP 200 — Success

{
  "items": [
    {
      "id": "template-example",
      "crmId": "1234567890123",
      "recordType": "Contacts",
      "name": "Greeting",
      "body": "Hello ${Contacts.Full_Name}"
    }
  ],
  "managementUrl": null
}
Response schema
{
  "type": "object",
  "properties": {
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "crmId": {
            "type": "string"
          },
          "recordType": {
            "type": [
              "string",
              "null"
            ]
          },
          "name": {
            "type": "string"
          },
          "body": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "crmId",
          "name",
          "body"
        ]
      }
    },
    "managementUrl": {
      "type": [
        "string",
        "null"
      ]
    }
  },
  "required": [
    "items"
  ]
}

GET /api/v1/conversations

List conversations · Scope: messages:read

Groups SMS records within each page of 50 CRM messages. A conversation may appear on multiple pages; unreadCount covers the current page.

cursor (query, optional) — Opaque cursor returned by the previous response; omit for the first page.

Example request
curl -X GET 'https://zemessenger.com/api/v1/conversations' \
  -H 'Authorization: Bearer YOUR_API_KEY'
Success response and schema

HTTP 200 — Success

{
  "items": [
    {
      "id": "KzQ0NzcwMDkwMDEyMw",
      "phone": "+447700900123",
      "name": "Alex",
      "preview": "Hello Alex",
      "at": "2026-10-01T12:00:00+01:00",
      "unread": false,
      "owner": {
        "id": "1234567890999",
        "name": "CRM integration account"
      },
      "direction": "Outbound",
      "status": "Queued",
      "type": "SMS",
      "sentBy": "CRM integration account",
      "linkedRecords": [],
      "unreadCount": 0,
      "line": "+447700900456"
    }
  ],
  "nextCursor": null
}
Response schema
{
  "type": "object",
  "properties": {
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "phone": {
            "type": "string",
            "pattern": "^\\+[1-9]\\d{7,14}$",
            "example": "+447700900123",
            "description": "International telephone number in E.164 format."
          },
          "name": {
            "type": "string"
          },
          "preview": {
            "type": "string"
          },
          "at": {
            "type": [
              "string",
              "null"
            ]
          },
          "unread": {
            "type": "boolean"
          },
          "owner": {
            "type": [
              "object",
              "null"
            ]
          },
          "direction": {
            "type": [
              "string",
              "null"
            ]
          },
          "status": {
            "type": [
              "string",
              "null"
            ]
          },
          "type": {
            "type": [
              "string",
              "null"
            ]
          },
          "sentBy": {
            "type": "string"
          },
          "linkedRecords": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "module": {
                  "type": "string"
                },
                "id": {
                  "type": "string"
                },
                "name": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              },
              "required": []
            }
          },
          "unreadCount": {
            "type": "integer"
          },
          "line": {
            "type": "string",
            "pattern": "^\\+[1-9]\\d{7,14}$",
            "example": "+447700900123",
            "description": "International telephone number in E.164 format."
          }
        },
        "required": [
          "id",
          "phone",
          "name",
          "unread",
          "unreadCount",
          "linkedRecords"
        ]
      }
    },
    "nextCursor": {
      "type": [
        "string",
        "null"
      ]
    }
  },
  "required": [
    "items",
    "nextCursor"
  ]
}

GET /api/v1/conversations/{id}

Read a conversation thread · Scope: messages:read

SMS messages visible to this key, paginated in pages of 50.

id (path, required) — Opaque conversation ID returned by GET /conversations.

cursor (query, optional) — Opaque cursor returned by the previous response; omit for the first page.

Example request
curl -X GET 'https://zemessenger.com/api/v1/conversations/KzQ0NzcwMDkwMDEyMw' \
  -H 'Authorization: Bearer YOUR_API_KEY'
Success response and schema

HTTP 200 — Success

{
  "items": [
    {
      "id": "1234567890001",
      "name": "Alex",
      "senderName": "Alex",
      "linkedSenders": {
        "Contact": "Alex",
        "Account": null,
        "Vendor": null,
        "Lead": null
      },
      "from": "+447700900456",
      "to": "+447700900123",
      "direction": "Outbound",
      "body": "Hello Alex",
      "status": "Queued",
      "type": "SMS",
      "botId": null,
      "read": null,
      "at": "2026-10-01T12:00:00+01:00",
      "scheduledFor": null,
      "owner": {
        "id": "1234567890999",
        "name": "CRM integration account"
      },
      "record": {
        "id": "1234567890123",
        "name": "Alex"
      },
      "linkedRecords": [
        {
          "module": "Contacts",
          "id": "1234567890123",
          "name": "Alex"
        }
      ],
      "sid": null,
      "audioFileId": null,
      "errorMessage": null,
      "sentBy": "CRM integration account",
      "modified": "2026-10-01T12:00:00+01:00"
    }
  ],
  "nextCursor": null
}
Response schema
{
  "type": "object",
  "properties": {
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": [
              "string",
              "null"
            ]
          },
          "senderName": {
            "type": [
              "string",
              "null"
            ]
          },
          "linkedSenders": {
            "type": "object",
            "properties": {
              "Contact": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "Account": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "Vendor": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "Lead": {
                "type": [
                  "string",
                  "null"
                ]
              }
            },
            "required": []
          },
          "from": {
            "type": [
              "string",
              "null"
            ]
          },
          "to": {
            "type": [
              "string",
              "null"
            ]
          },
          "direction": {
            "type": [
              "string",
              "null"
            ]
          },
          "body": {
            "type": "string"
          },
          "status": {
            "type": [
              "string",
              "null"
            ]
          },
          "type": {
            "type": [
              "string",
              "null"
            ]
          },
          "botId": {
            "type": [
              "string",
              "null"
            ]
          },
          "read": {
            "type": [
              "string",
              "null"
            ]
          },
          "at": {
            "type": [
              "string",
              "null"
            ]
          },
          "scheduledFor": {
            "type": [
              "string",
              "null"
            ]
          },
          "owner": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              }
            }
          },
          "record": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              }
            }
          },
          "linkedRecords": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "module": {
                  "type": "string"
                },
                "id": {
                  "type": "string"
                },
                "name": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              },
              "required": []
            }
          },
          "sid": {
            "type": [
              "string",
              "null"
            ]
          },
          "audioFileId": {
            "type": [
              "string",
              "null"
            ]
          },
          "errorMessage": {
            "type": [
              "string",
              "null"
            ]
          },
          "sentBy": {
            "type": "string"
          },
          "modified": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "id",
          "body",
          "botId",
          "linkedRecords"
        ]
      }
    },
    "nextCursor": {
      "type": [
        "string",
        "null"
      ]
    }
  },
  "required": [
    "items",
    "nextCursor"
  ]
}

POST /api/v1/messages

Queue or schedule a text · Scope: messages:write

Accepted does not guarantee carrier delivery. Test keys return a simulated test_ ID and never create a CRM action.

Idempotency-Key (header, required) — Reuse with exactly the same payload on retries; maximum 128 characters.

Request fields
tostring · required

International telephone number in E.164 format.

fromNumberSidstring · required · max 64

Sender SID from GET /numbers.

recordobject · optional
record.modulestring · required · Leads / Contacts / Vendors / Deals
record.idstring · required
scheduledForstring · optional

ISO 8601 time with offset, at least 30 seconds in the future.

bodystring · optional · max 5000
templateUuidstring · optional · max 128

Template ID returned by GET /templates; provide body or templateUuid, exactly one.

channelstring · optional · SMS / WhatsApp

Defaults to SMS. WhatsApp requires a connected sender and is sent immediately.

whatsAppContentSidstring · optional · max 64

Approved Twilio Content SID. Required when the WhatsApp session is closed.

whatsAppContentVariablesobject · optional

Template variables keyed by {{1}}, {{2}}, and so on.

Example request
curl -X POST 'https://zemessenger.com/api/v1/messages' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: example-request-1' \
  --data '{"to":"+447700900123","fromNumberSid":"PN_EXAMPLE","body":"Hello Alex"}'
Success response and schema

HTTP 202 — Accepted or scheduled

{
  "id": "1234567890001",
  "status": "accepted",
  "test": false
}
Response schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "status": {
      "type": "string",
      "enum": [
        "accepted",
        "scheduled"
      ]
    },
    "test": {
      "type": "boolean"
    }
  },
  "required": [
    "id",
    "status",
    "test"
  ]
}

POST /api/v1/ai-calls

Queue or schedule an outbound AI call · Scope: calls:write

Accepted does not guarantee carrier delivery. Test keys return a simulated test_ ID and never create a CRM action.

Idempotency-Key (header, required) — Reuse with exactly the same payload on retries; maximum 128 characters.

Request fields
tostring · required

International telephone number in E.164 format.

fromNumberSidstring · required · max 64

Sender SID from GET /numbers.

recordobject · optional
record.modulestring · required · Leads / Contacts / Vendors / Deals
record.idstring · required
scheduledForstring · optional

ISO 8601 time with offset, at least 30 seconds in the future.

botIdstring · required · max 128

Active outbound bot ID from GET /bots.

modestring · required · follow_script / deliver_specific_message
purposeMessagestring · optional · max 4000
Example request
curl -X POST 'https://zemessenger.com/api/v1/ai-calls' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: example-request-1' \
  --data '{"to":"+447700900123","fromNumberSid":"PN_EXAMPLE","botId":"bot-example","mode":"deliver_specific_message","purposeMessage":"Confirm the appointment tomorrow."}'
Success response and schema

HTTP 202 — Accepted or scheduled

{
  "id": "1234567890001",
  "status": "accepted",
  "test": false
}
Response schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "status": {
      "type": "string",
      "enum": [
        "accepted",
        "scheduled"
      ]
    },
    "test": {
      "type": "boolean"
    }
  },
  "required": [
    "id",
    "status",
    "test"
  ]
}

GET /api/v1/messages/{id}

Read a message · Scope: messages:read

id (path, required) — Numeric CRM action ID. Simulated test_ IDs cannot be read as CRM records.

Example request
curl -X GET 'https://zemessenger.com/api/v1/messages/1234567890001' \
  -H 'Authorization: Bearer YOUR_API_KEY'
Success response and schema

HTTP 200 — Success

{
  "id": "1234567890001",
  "name": "Alex",
  "senderName": "Alex",
  "linkedSenders": {
    "Contact": "Alex",
    "Account": null,
    "Vendor": null,
    "Lead": null
  },
  "from": "+447700900456",
  "to": "+447700900123",
  "direction": "Outbound",
  "body": "Hello Alex",
  "status": "Queued",
  "type": "SMS",
  "botId": null,
  "read": null,
  "at": "2026-10-01T12:00:00+01:00",
  "scheduledFor": null,
  "owner": {
    "id": "1234567890999",
    "name": "CRM integration account"
  },
  "record": {
    "id": "1234567890123",
    "name": "Alex"
  },
  "linkedRecords": [
    {
      "module": "Contacts",
      "id": "1234567890123",
      "name": "Alex"
    }
  ],
  "sid": null,
  "audioFileId": null,
  "errorMessage": null,
  "sentBy": "CRM integration account",
  "modified": "2026-10-01T12:00:00+01:00"
}
Response schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "name": {
      "type": [
        "string",
        "null"
      ]
    },
    "senderName": {
      "type": [
        "string",
        "null"
      ]
    },
    "linkedSenders": {
      "type": "object",
      "properties": {
        "Contact": {
          "type": [
            "string",
            "null"
          ]
        },
        "Account": {
          "type": [
            "string",
            "null"
          ]
        },
        "Vendor": {
          "type": [
            "string",
            "null"
          ]
        },
        "Lead": {
          "type": [
            "string",
            "null"
          ]
        }
      },
      "required": []
    },
    "from": {
      "type": [
        "string",
        "null"
      ]
    },
    "to": {
      "type": [
        "string",
        "null"
      ]
    },
    "direction": {
      "type": [
        "string",
        "null"
      ]
    },
    "body": {
      "type": "string"
    },
    "status": {
      "type": [
        "string",
        "null"
      ]
    },
    "type": {
      "type": [
        "string",
        "null"
      ]
    },
    "botId": {
      "type": [
        "string",
        "null"
      ]
    },
    "read": {
      "type": [
        "string",
        "null"
      ]
    },
    "at": {
      "type": [
        "string",
        "null"
      ]
    },
    "scheduledFor": {
      "type": [
        "string",
        "null"
      ]
    },
    "owner": {
      "type": [
        "object",
        "null"
      ],
      "properties": {
        "id": {
          "type": "string"
        },
        "name": {
          "type": "string"
        }
      }
    },
    "record": {
      "type": [
        "object",
        "null"
      ],
      "properties": {
        "id": {
          "type": "string"
        },
        "name": {
          "type": "string"
        }
      }
    },
    "linkedRecords": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "module": {
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "name": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": []
      }
    },
    "sid": {
      "type": [
        "string",
        "null"
      ]
    },
    "audioFileId": {
      "type": [
        "string",
        "null"
      ]
    },
    "errorMessage": {
      "type": [
        "string",
        "null"
      ]
    },
    "sentBy": {
      "type": "string"
    },
    "modified": {
      "type": [
        "string",
        "null"
      ]
    }
  },
  "required": [
    "id",
    "body",
    "botId",
    "linkedRecords"
  ]
}

GET /api/v1/ai-calls/{id}

Read an AI call · Scope: calls:read

id (path, required) — Numeric CRM action ID. Simulated test_ IDs cannot be read as CRM records.

Example request
curl -X GET 'https://zemessenger.com/api/v1/ai-calls/1234567890001' \
  -H 'Authorization: Bearer YOUR_API_KEY'
Success response and schema

HTTP 200 — Success

{
  "id": "1234567890001",
  "name": "Alex",
  "senderName": "Alex",
  "linkedSenders": {
    "Contact": "Alex",
    "Account": null,
    "Vendor": null,
    "Lead": null
  },
  "from": "+447700900456",
  "to": "+447700900123",
  "direction": "Outbound",
  "body": "Call transcript",
  "status": "Delivered",
  "type": "Call",
  "botId": "bot-example",
  "read": null,
  "at": "2026-10-01T12:00:00+01:00",
  "scheduledFor": null,
  "owner": {
    "id": "1234567890999",
    "name": "CRM integration account"
  },
  "record": {
    "id": "1234567890123",
    "name": "Alex"
  },
  "linkedRecords": [
    {
      "module": "Contacts",
      "id": "1234567890123",
      "name": "Alex"
    }
  ],
  "sid": null,
  "audioFileId": null,
  "errorMessage": null,
  "sentBy": "CRM integration account",
  "modified": "2026-10-01T12:00:00+01:00"
}
Response schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "name": {
      "type": [
        "string",
        "null"
      ]
    },
    "senderName": {
      "type": [
        "string",
        "null"
      ]
    },
    "linkedSenders": {
      "type": "object",
      "properties": {
        "Contact": {
          "type": [
            "string",
            "null"
          ]
        },
        "Account": {
          "type": [
            "string",
            "null"
          ]
        },
        "Vendor": {
          "type": [
            "string",
            "null"
          ]
        },
        "Lead": {
          "type": [
            "string",
            "null"
          ]
        }
      },
      "required": []
    },
    "from": {
      "type": [
        "string",
        "null"
      ]
    },
    "to": {
      "type": [
        "string",
        "null"
      ]
    },
    "direction": {
      "type": [
        "string",
        "null"
      ]
    },
    "body": {
      "type": "string"
    },
    "status": {
      "type": [
        "string",
        "null"
      ]
    },
    "type": {
      "type": [
        "string",
        "null"
      ]
    },
    "botId": {
      "type": [
        "string",
        "null"
      ]
    },
    "read": {
      "type": [
        "string",
        "null"
      ]
    },
    "at": {
      "type": [
        "string",
        "null"
      ]
    },
    "scheduledFor": {
      "type": [
        "string",
        "null"
      ]
    },
    "owner": {
      "type": [
        "object",
        "null"
      ],
      "properties": {
        "id": {
          "type": "string"
        },
        "name": {
          "type": "string"
        }
      }
    },
    "record": {
      "type": [
        "object",
        "null"
      ],
      "properties": {
        "id": {
          "type": "string"
        },
        "name": {
          "type": "string"
        }
      }
    },
    "linkedRecords": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "module": {
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "name": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": []
      }
    },
    "sid": {
      "type": [
        "string",
        "null"
      ]
    },
    "audioFileId": {
      "type": [
        "string",
        "null"
      ]
    },
    "errorMessage": {
      "type": [
        "string",
        "null"
      ]
    },
    "sentBy": {
      "type": "string"
    },
    "modified": {
      "type": [
        "string",
        "null"
      ]
    }
  },
  "required": [
    "id",
    "body",
    "botId",
    "linkedRecords"
  ]
}

POST /api/v1/messages/{id}/cancel

Cancel a pending scheduled action · Scope: messages:write

Only Queued actions scheduled more than 30 seconds in the future can be cancelled. Test keys simulate cancellation without changing CRM. No request body or idempotency header is required.

id (path, required) — Numeric CRM action ID. Simulated test_ IDs cannot be read as CRM records.

Example request
curl -X POST 'https://zemessenger.com/api/v1/messages/1234567890001/cancel' \
  -H 'Authorization: Bearer YOUR_API_KEY'
Success response and schema

HTTP 200 — Success

{
  "id": "1234567890001",
  "status": "cancelled"
}
Response schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "status": {
      "type": "string",
      "enum": [
        "cancelled"
      ]
    },
    "test": {
      "type": "boolean",
      "description": "Present for simulated cancellation."
    }
  },
  "required": [
    "id",
    "status"
  ]
}

POST /api/v1/ai-calls/{id}/cancel

Cancel a pending scheduled action · Scope: calls:write

Only Queued actions scheduled more than 30 seconds in the future can be cancelled. Test keys simulate cancellation without changing CRM. No request body or idempotency header is required.

id (path, required) — Numeric CRM action ID. Simulated test_ IDs cannot be read as CRM records.

Example request
curl -X POST 'https://zemessenger.com/api/v1/ai-calls/1234567890001/cancel' \
  -H 'Authorization: Bearer YOUR_API_KEY'
Success response and schema

HTTP 200 — Success

{
  "id": "1234567890001",
  "status": "cancelled"
}
Response schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "status": {
      "type": "string",
      "enum": [
        "cancelled"
      ]
    },
    "test": {
      "type": "boolean",
      "description": "Present for simulated cancellation."
    }
  },
  "required": [
    "id",
    "status"
  ]
}
01

Designed for server-side integrations

Scoped organisation API keys, idempotent actions, cursor pagination, and signed events. Live access is gated until your pilot organisation and credentials are enabled.

02

Same workflow. Another entry point.

API and mobile actions share Messenger’s sending rules and allowances. Acceptance is not a delivery guarantee.

YOUR NEXT CHAPTER

Put the next
conversation to work.

See how connected messaging, calling, and AI follow-up could work for your Zoho CRM team.