Skip to main content

Documentations

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

status

"ok" on success, "error" on failure

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

400 Bad Request

Validation error — check the response body for details

401 Unauthorized

Missing or malformed Authorization header

403 Forbidden

Valid token but not authorized for this resource

404 Not Found

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

name

string

Yes

Account display name (max 80 chars)

contact_email

string

Yes

Primary contact email; must be globally unique

billing_email

string

Yes

Billing contact email

contact_name

string

No

First name of the primary contact

contact_lastname

string

No

Last name of the primary contact

contact_phone_number

string

No

Phone number of the primary contact

time_zone

string

Yes

IANA timezone identifier (e.g. "Europe/Istanbul", "UTC")

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.com

Query parameters:

Parameter

Description

page

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

channel.created

Yes

A new channel was connected to the account

channel.updated

No

A channel's settings were updated

message.created

No

A message was created in a conversation

message.state_changed

No

A message delivery state changed

conversation.created

No

A new conversation started

conversation.assigned

No

A conversation was assigned to an agent

conversation.archived

No

A conversation was archived

conversation.type_changed

No

A conversation type/category changed

conversation.custom_fields_updated

No

Custom fields on a conversation were updated

conversation.expired

No

A conversation expired

conversation.group_changed

No

A conversation was moved to a different group

customer.updated

No

Customer info was updated

agent.status_changed

Yes

An agent's availability status changed

feedback.received

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.com

Example 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

callback_url

string

Yes

The HTTPS endpoint that will receive POST requests

triggers

string[]

Yes

One or more trigger names from the table above

channels

uuid[]

Yes

Channel UUIDs to scope this webhook to. Use [] for channel-independent triggers

is_active

boolean

Yes

Whether this webhook is active

data.headers

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

type

string

Yes

Channel type. One of: whatsapp, instagram, telegram, messenger, tiktok, hepsiburada, google-reviews, livechat, trendyol, pazarama, n11, apple-store, google-play, custom

channel_uuid

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

onboarding_url

string

The URL to open in a popup dialog on your frontend

expires_at

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.com

Query parameters:

Parameter

Description

page

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

uuid

Unique identifier for the channel

name

Channel display name

type

Channel type (e.g. whatsapp, instagram)

backend

Underlying provider/backend used

is_active

Whether the channel is currently active

data.connected

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.com

Example 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.com

Issued 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.com

PATCH /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

is_active

boolean

No

Set to false to revoke the token. Revocation is permanent

Example response:

{
  "is_active": false
}