Reseller
Connexease Reseller API
Table of Contents
Integration Guide
Authentication
All Reseller API endpoints require a Bearer token that is provisioned for you by the Connexease support team. This token identifies your reseller account and authorizes server-to-server requests.
Include it in every request as an HTTP header:
Authorization: Bearer <your_reseller_token>This token does not expire by default, but can be rotated by contacting support. Keep it secret — it has full access to all accounts under your reseller profile.
Step 1 — Create an Account
When one of your customers signs up, call the account creation endpoint from your backend. This provisions a Connexease account scoped to your reseller.
POST https://api.reseller.connexease.com/accounts/
Authorization: Bearer <your_reseller_token>
Content-Type: application/json
{
"name": "Acme Corp",
"contact_email": "[email protected]",
"billing_email": "[email protected]",
"contact_name": "Jane",
"contact_lastname": "Doe",
"contact_phone_number": "+10000000000",
"time_zone": "Europe/Istanbul"
}Sample response:
{
"uuid": "eabd44ac-9639-4f6d-8885-abec634893d4",
"name": "Acme Corp",
"is_active": true,
"contact_email": "[email protected]"
}Store the uuid from the response — you will use it in all subsequent calls for this account.
Step 2 — Set Up Webhooks
After creating an account, register the webhooks your system needs for that account. At a minimum, you likely want channel.created to be notified when a channel is successfully connected through the onboarding dialog.
POST https://api.reseller.connexease.com/accounts/<account_uuid>/webhooks/
Authorization: Bearer <your_reseller_token>
Content-Type: application/json
{
"callback_url": "https://your-backend.example.com/hooks/connexease",
"triggers": ["channel.created"],
"channels": [],
"is_active": true
}channel.created is a channel-independent trigger, meaning it applies to the account as a whole rather than a specific channel. For this reason, channels must be an empty array when using it. Only one webhook per trigger is allowed for channel-independent triggers.
Sample body of the webhook for channel.created trigger:
{
"hook": "channel.created",
"account": {
"uuid": "eabd44ac-9639-4f6d-8885-abec634893d4",
"name": "Acme Corp"
},
"payload": null,
"channel": {
"uuid": "eea6ed79-a996-40e7-b599-d3651544b07a",
"name": "name of channel",
"backend": "whatsapp_cloud"
}
}For channel-specific triggers (e.g. message.created), you can scope them to one or more channels by passing their UUIDs in the channels array. See webhook document for a list of available triggers. Example:
POST https://api.reseller.connexease.com/accounts/<account_uuid>/webhooks/
Authorization: Bearer <your_reseller_token>
Content-Type: application/json
{
"callback_url": "https://your-backend.example.com/hooks/connexease",
"triggers": ["conversation.created", "message.created"],
"channels": ["eea6ed79-a996-40e7-b599-d3651544b07a"],
"is_active": true
}Step 3 — Add a Channel via Onboarding Dialog
Adding a channel is a two-step process involving your backend and your frontend.
3a — Request an Onboarding Token (backend)
Call the onboarding endpoint from your server to generate a short-lived token (valid for 10 minutes):
POST https://api.reseller.connexease.com/accounts/<account_uuid>/channels/onboarding/
Authorization: Bearer <your_reseller_token>
Content-Type: application/json
{
"type": "whatsapp"
}For reconnecting an existing channel, include the channel's UUID:
{
"type": "whatsapp",
"channel_uuid": "3990d863-3734-4088-aca3-f91c70b21a55"
}The response returns a ready-to-use onboarding_url and its expiry as a Unix timestamp:
{
"onboarding_url": "https://app.connexease.com/reseller/channels/whatsapp/connect?token=58f07878-62ff-4b3b-8d9a-d34057ec863d",
"expires_at": 1774336309
}3b — Open the Onboarding Dialog (frontend)
Pass the onboarding_url to your frontend and open it in a popup window. The dialog handles the entire channel connection flow (e.g. Facebook OAuth, WhatsApp, etc.). When the user finishes or cancels, the dialog posts a message event to the opener window.
let dialogWindow = null;
function openOnboardingDialog(onboardingUrl) {
const width = 570;
const height = Math.min(720, Math.round(screen.availHeight * 0.85));
const left = Math.round(window.screenX + (window.outerWidth - width) / 2);
const top = Math.round(window.screenY + (window.outerHeight - height) / 2);
dialogWindow = window.open(
onboardingUrl,
'connexeaseOnboarding',
`width=${width},height=${height},left=${left},top=${top},resizable=yes,scrollbars=yes`
);
}
window.addEventListener('message', (event) => {
const data = event.data;
if (!data || !data.status) return;
if (data.status === 'ok') {
console.log('Channel connected successfully:', data);
// data.channel_uuid is available here
} else {
console.error('Channel connection failed:', data);
}
if (dialogWindow && !dialogWindow.closed) {
dialogWindow.close();
}
});The message event payload has at minimum a status field:
Field | Value |
|---|---|
|
|
At this point, your registered webhook is called.
Note: The onboarding token is single-use. Once the dialog completes (successfully or not), the token is consumed and cannot be reused. Request a new token for each session.
Note: You should check the expires_at timestamp before opening the dialog. If the token has expired, request a fresh one before displaying the popup.Step 4 — Manage Account API Access Tokens
Each account has a dedicated API user whose access tokens can be created and managed through the Access Tokens API. These tokens allow direct API access scoped to that specific account (for use with the standard Connexease API, not the Reseller API).
Create a token for an account:
POST https://api.reseller.connexease.com/accounts/<account_uuid>/access-token/
Authorization: Bearer <your_reseller_token>Issued tokens expire after 5 years. The raw token value is returned only once in the key field of the creation response. Store it securely — it cannot be retrieved again.
To revoke a token, update it with is_active: false.
API Reference
Base URL: https://api.reseller.connexease.com/
Authentication
All endpoints in this section use:
Authorization: Bearer <your_reseller_token>Status Codes:
Code | Meaning |
|---|---|
| Validation error — check the response body for details |
| Missing or malformed |
| Valid token but not authorized for this resource |
| Resource not found or not scoped to your reseller |
Accounts
POST /accounts/
Creates a new account under your reseller.
Status Codes:
- 201 Created — account created
- 400 Bad Request — validation errors (e.g. email already in use)
Example request:
POST /accounts/ HTTP/1.1
Authorization: Bearer <your_reseller_token>
Content-Type: application/json
Host: api.reseller.connexease.com
{
"name": "Acme Corp",
"contact_email": "[email protected]",
"billing_email": "[email protected]",
"contact_name": "Jane",
"contact_lastname": "Doe",
"contact_phone_number": "+10000000000",
"time_zone": "Europe/Istanbul"
}Request body fields:
Field | Type | Required | Description |
|---|---|---|---|
| string | Yes | Account display name (max 80 chars) |
| string | Yes | Primary contact email; must be globally unique |
| string | Yes | Billing contact email |
| string | No | First name of the primary contact |
| string | No | Last name of the primary contact |
| string | No | Phone number of the primary contact |
| string | Yes | IANA timezone identifier (e.g. |
Example response:
{
"uuid": "eabd44ac-9639-4f6d-8885-abec634893d4",
"name": "Acme Corp",
"is_active": true,
"contact_email": "[email protected]"
}GET /accounts/
Returns all accounts under your reseller.
Status Codes:
- 200 OK
Example request:
GET /accounts/ HTTP/1.1
Authorization: Bearer <your_reseller_token>
Host: api.reseller.connexease.comQuery parameters:
Parameter | Description |
|---|---|
| Page number (default: 1) |
Example response:
{
"next": null,
"previous": null,
"count": 2,
"results": [
{
"uuid": "cff2a2ae-dc1d-4944-96dd-0d964ba65233",
"name": "Acme Corp",
"is_active": true,
"contact_email": "[email protected]"
},
{
"uuid": "eabd44ac-9639-4f6d-8885-abec634893d4",
"name": "Beta LLC",
"is_active": true,
"contact_email": "[email protected]"
}
]
}Webhooks
Webhooks are configured per-account. Each webhook can subscribe to one or more triggers. The supported triggers are:
Trigger | Channel-independent? | Description |
|---|---|---|
| Yes | A new channel was connected to the account |
| No | A channel's settings were updated |
| No | A message was created in a conversation |
| No | A message delivery state changed |
| No | A new conversation started |
| No | A conversation was assigned to an agent |
| No | A conversation was archived |
| No | A conversation type/category changed |
| No | Custom fields on a conversation were updated |
| No | A conversation expired |
| No | A conversation was moved to a different group |
| No | Customer info was updated |
| Yes | An agent's availability status changed |
| No | A feedback/CSAT response was submitted |
Channel-independent triggers apply to the entire account. For these, the channels array must be empty [], and only one webhook per trigger is permitted per account. For channel-scoped triggers, you can attach the same trigger to multiple webhooks as long as each targets a different channel.
GET /accounts/<account_uuid>/webhooks/
Returns all webhooks for an account.
Status Codes:
- 200 OK
Example request:
GET /accounts/eabd44ac-9639-4f6d-8885-abec634893d4/webhooks/ HTTP/1.1
Authorization: Bearer <your_reseller_token>
Host: api.reseller.connexease.comExample response:
{
"next": null,
"previous": null,
"count": 2,
"results": [
{
"uuid": "8191cdeb-d24c-4dcf-b59c-760f59b65ac7",
"callback_url": "https://your-backend.example.com/hooks/connexease",
"triggers": ["message.created"],
"channels": ["3990d863-3734-4088-aca3-f91c70b21a55"],
"is_active": true,
"data": {
"headers": null
}
},
{
"uuid": "bbf1a5ac-e4a9-4312-b8a4-018873f2d5d4",
"callback_url": "https://your-backend.example.com/hooks/connexease",
"triggers": ["channel.created"],
"channels": [],
"is_active": true,
"data": {
"headers": null
}
}
]
}POST /accounts/<account_uuid>/webhooks/
Creates a new webhook for an account.
Status Codes:
- 201 Created
- 400 Bad Request — validation errors (e.g. duplicate trigger for a channel)
Example request:
POST /accounts/eabd44ac-9639-4f6d-8885-abec634893d4/webhooks/ HTTP/1.1
Authorization: Bearer <your_reseller_token>
Content-Type: application/json
Host: api.reseller.connexease.com
{
"callback_url": "https://your-backend.example.com/hooks/connexease",
"triggers": ["message.created"],
"channels": ["3990d863-3734-4088-aca3-f91c70b21a55"],
"is_active": true
}Request body fields:
Field | Type | Required | Description |
|---|---|---|---|
| string | Yes | The HTTPS endpoint that will receive POST requests |
| string[] | Yes | One or more trigger names from the table above |
| uuid[] | Yes | Channel UUIDs to scope this webhook to. Use |
| boolean | Yes | Whether this webhook is active |
| object | No | Custom headers to include in the outgoing webhook request (e.g. for auth on your endpoint) |
Example response:
{
"uuid": "8191cdeb-d24c-4dcf-b59c-760f59b65ac7",
"callback_url": "https://your-backend.example.com/hooks/connexease",
"triggers": ["message.created"],
"channels": ["3990d863-3734-4088-aca3-f91c70b21a55"],
"is_active": true,
"data": {
"headers": null
}
}PATCH /accounts/<account_uuid>/webhooks/<webhook_uuid>/
Updates an existing webhook. All fields are optional.
Status Codes:
- 200 OK
- 400 Bad Request
Example request:
PATCH /accounts/eabd44ac-9639-4f6d-8885-abec634893d4/webhooks/8191cdeb-d24c-4dcf-b59c-760f59b65ac7/ HTTP/1.1
Authorization: Bearer <your_reseller_token>
Content-Type: application/json
Host: api.reseller.connexease.com
{
"is_active": false,
"data": {
"headers": {
"Authorization": "Bearer your-endpoint-secret"
}
}
}Example response:
{
"uuid": "8191cdeb-d24c-4dcf-b59c-760f59b65ac7",
"callback_url": "https://your-backend.example.com/hooks/connexease",
"triggers": ["message.created"],
"channels": ["3990d863-3734-4088-aca3-f91c70b21a55"],
"is_active": false,
"data": {
"headers": {
"Authorization": "Bearer your-endpoint-secret"
}
}
}Channel Onboarding
POST /accounts/<account_uuid>/channels/onboarding/
Generates a short-lived onboarding URL for a user to connect a channel through the Connexease dialog. The token embedded in the URL is valid for 10 minutes and is single-use.
Status Codes:
- 201 Created
- 404 Not Found — account not found or not under your reseller
Example request:
POST /accounts/eabd44ac-9639-4f6d-8885-abec634893d4/channels/onboarding/ HTTP/1.1
Authorization: Bearer <your_reseller_token>
Content-Type: application/json
Host: api.reseller.connexease.com
{
"type": "whatsapp"
}To reconnect or reconfigure an existing channel, include its UUID:
{
"type": "whatsapp",
"channel_uuid": "3990d863-3734-4088-aca3-f91c70b21a55"
}Request body fields:
Field | Type | Required | Description |
|---|---|---|---|
| string | Yes | Channel type. One of: |
| uuid | No | Provide when reconnecting an existing channel |
Example response:
{
"onboarding_url": "https://app.connexease.com/reseller/channels/whatsapp/connect?token=58f07878-62ff-4b3b-8d9a-d34057ec863d",
"expires_at": 1774336309
}
Field | Type | Description |
|---|---|---|
| string | The URL to open in a popup dialog on your frontend |
| integer | Unix timestamp (UTC) when the token expires |
Channels
GET /accounts/<account_uuid>/channels/
Returns all channels for an account. Paginated.
Status Codes:
- 200 OK
Example request:
GET /accounts/eabd44ac-9639-4f6d-8885-abec634893d4/channels/ HTTP/1.1
Authorization: Bearer <your_reseller_token>
Host: api.reseller.connexease.comQuery parameters:
Parameter | Description |
|---|---|
| Page number (default: 1) |
Example response:
{
"next": "https://api.reseller.connexease.com/accounts/eabd44ac-9639-4f6d-8885-abec634893d4/channels/?page=2",
"previous": null,
"count": 42,
"results": [
{
"uuid": "3990d863-3734-4088-aca3-f91c70b21a55",
"name": "WhatsApp Main",
"type": "whatsapp",
"backend": "whatsapp_core",
"is_active": true,
"data": {
"connected": true
}
}
]
}
Field | Description |
|---|---|
| Unique identifier for the channel |
| Channel display name |
| Channel type (e.g. |
| Underlying provider/backend used |
| Whether the channel is currently active |
| Whether the channel has an active connection to the provider |
Access Tokens
Each account has a dedicated API user. These endpoints let you create and manage access tokens for that user, enabling direct API access scoped to the account.
Security note: The raw token value is returned only at creation time. It cannot be retrieved afterward — store it immediately in a secure location.
GET /accounts/<account_uuid>/access-token/
Lists all access tokens for an account's API user.
Status Codes:
- 200 OK
Example request:
GET /accounts/eabd44ac-9639-4f6d-8885-abec634893d4/access-token/ HTTP/1.1
Authorization: Bearer <your_reseller_token>
Host: api.reseller.connexease.comExample response:
{
"next": null,
"previous": null,
"count": 1,
"results": [
{
"uuid": "9934c96c-5341-43bb-b2ce-625f61cef388",
"name": "",
"is_active": true,
"created_at": "2026-03-26T18:30:41.391409",
"expires_at": "2031-03-25T18:30:41.391409",
"revoked_at": null
}
]
}POST /accounts/<account_uuid>/access-token/
Creates a new access token for an account's API user. The raw token value is returned once in the key field.
Status Codes:
- 201 Created
- 400 Bad Request — maximum active token limit reached
Example request:
POST /accounts/eabd44ac-9639-4f6d-8885-abec634893d4/access-token/ HTTP/1.1
Authorization: Bearer <your_reseller_token>
Host: api.reseller.connexease.comIssued tokens expire after 5 years from creation. No request body is required.
Example response:
{
"uuid": "9934c96c-5341-43bb-b2ce-625f61cef388",
"name": "",
"is_active": true,
"created_at": "2026-03-26T18:30:41.391409",
"expires_at": "2031-03-25T18:30:41.391409",
"revoked_at": null,
"key": "8pLVfoDIM6o9a-DB24ILaK1ejIUjge4DshnhPuzODzI"
}The key field is only present in the creation response.GET /accounts/<account_uuid>/access-token/<token_uuid>/
Retrieves a single token by its UUID.
Status Codes:
- 200 OK
- 404 Not Found
Example request:
GET /accounts/eabd44ac-9639-4f6d-8885-abec634893d4/access-token/9934c96c-5341-43bb-b2ce-625f61cef388/ HTTP/1.1
Authorization: Bearer <your_reseller_token>
Host: api.reseller.connexease.comPATCH /accounts/<account_uuid>/access-token/<token_uuid>/
Updates a token. Primarily used to revoke it by setting is_active to false.
Status Codes:
- 200 OK
- 400 Bad Request — e.g. attempting to re-activate a revoked token
Example request:
PATCH /accounts/eabd44ac-9639-4f6d-8885-abec634893d4/access-token/9934c96c-5341-43bb-b2ce-625f61cef388/ HTTP/1.1
Authorization: Bearer <your_reseller_token>
Content-Type: application/json
Host: api.reseller.connexease.com
{
"is_active": false
}Request body fields:
Field | Type | Required | Description |
|---|---|---|---|
| boolean | No | Set to |
Example response:
{
"is_active": false
}