Connext REST API (1.0.0)

Download OpenAPI specification:

Introduction

The Connext REST API lets you programmatically manage subscribers, send messages, schedule blasts, and view delivery logs for your organization.

All endpoints return JSON and use standard HTTP methods (GET, POST, PATCH, DELETE) with RESTful URL paths.

Base URL

https://api.connext.ms/api/v1

All endpoints in this document are relative to this base URL.

Authentication

Every request must include an API key in the Authorization header:

Authorization: Bearer cnxt_your_api_key_here

API keys are scoped to the user who created them. A key inherits the user's organization and permissions — it can only access data within that organization and is limited to the actions the user is allowed to perform.

Generating an API key

  1. Log in to the Connext admin panel.
  2. Navigate to Settings → API Keys.
  3. Click Create API Key and give it a descriptive name (e.g., "CRM Integration", "Zapier").
  4. Optionally set an expiration date. Keys without an expiration remain valid until manually revoked.
  5. Copy the key immediately — it is only displayed once and cannot be retrieved later.

Managing API keys

From the API Keys settings page you can:

  • View all keys for your organization, identified by the first 8 characters of the key hash.
  • Deactivate a key to temporarily suspend access without deleting it.
  • Reactivate a previously deactivated key.
  • Delete a key to permanently revoke access.

Security best practices

  • Store keys in environment variables or a secrets manager — never hard-code them in source code.
  • Use separate keys for each integration so you can revoke one without affecting others.
  • Set an expiration date for keys used in short-lived or third-party integrations.
  • If a key is compromised, delete it immediately from the admin panel.

Errors

The API returns standard HTTP status codes:

Status Meaning
200 Success
201 Resource created
204 Resource deleted (no body)
400 Bad request — missing or invalid parameters
401 Unauthorized — invalid or missing API key
403 Forbidden — valid key but insufficient permissions
404 Not found — resource doesn't exist or is outside your organization
405 Method not allowed
500 Server error

Error responses include a JSON body:

{
  "message": "Description of what went wrong"
}

Response conventions

  • GET (list) returns a JSON array of objects directly.
  • GET (single) returns the object directly.
  • POST returns 201 with the created resource.
  • PATCH returns 200 with the updated resource.
  • DELETE returns 204 with no body.
  • Action endpoints (send, test, estimate, cancel) return 200 with an operation result.

Pagination

List endpoints (GET /subscribers, GET /schedules, GET /logs) accept limit and offset query parameters.

GET /v1/subscribers?limit=25&offset=0

Subscribers

List subscribers

Authorizations:
bearerAuth
query Parameters
keyword
string

Search across name, phone, email, address

group
string

Filter by group number

sort
string
Enum: "recipient" "phone" "first" "last" "email" "address"
order
string
Enum: "asc" "desc"
limit
required
integer
offset
required
integer

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a subscriber

Authorizations:
bearerAuth
Request Body schema: application/json
required
phone
string

10-digit phone number (required if no email)

email
string <email>

Required if no phone

first
string
last
string
address
string
city
string
state
string
zip
string
enabled
boolean
Default: true
text
boolean
Default: false

Whether subscriber prefers SMS

groups
Array of integers

Responses

Request samples

Content type
application/json
{
  • "phone": "string",
  • "email": "user@example.com",
  • "first": "string",
  • "last": "string",
  • "address": "string",
  • "city": "string",
  • "state": "string",
  • "zip": "string",
  • "enabled": true,
  • "text": false,
  • "groups": [
    ]
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "first": "string",
  • "last": "string",
  • "phone": "string",
  • "email": "string",
  • "address": "string",
  • "city": "string",
  • "state": "string",
  • "zip": "string",
  • "enabled": 0,
  • "text": 0,
  • "groups": [
    ],
  • "phoneBlocked": 0,
  • "emailBlocked": 0
}

Update a subscriber

Authorizations:
bearerAuth
path Parameters
id
required
integer
Request Body schema: application/json
required
first
string
last
string
phone
string
email
string <email>
enabled
boolean
text
boolean
address
string
city
string
state
string
zip
string
groups
Array of integers

Responses

Request samples

Content type
application/json
{
  • "first": "string",
  • "last": "string",
  • "phone": "string",
  • "email": "user@example.com",
  • "enabled": true,
  • "text": true,
  • "address": "string",
  • "city": "string",
  • "state": "string",
  • "zip": "string",
  • "groups": [
    ]
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "first": "string",
  • "last": "string",
  • "phone": "string",
  • "email": "string",
  • "address": "string",
  • "city": "string",
  • "state": "string",
  • "zip": "string",
  • "enabled": 0,
  • "text": 0,
  • "groups": [
    ],
  • "phoneBlocked": 0,
  • "emailBlocked": 0
}

Delete a subscriber

Authorizations:
bearerAuth
path Parameters
id
required
integer

Responses

Response samples

Content type
application/json
{
  • "message": "string"
}

List blocklist entries

Authorizations:
bearerAuth

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Add to blocklist

Authorizations:
bearerAuth
Request Body schema: application/json
required
recipient
required
string

10-digit phone number or email address

Responses

Request samples

Content type
application/json
{
  • "recipient": "string"
}

Response samples

Content type
application/json
{
  • "recipient": "string",
  • "type": "phone",
  • "reason": "string",
  • "createdAt": "2019-08-24T14:15:22Z"
}

Remove from blocklist

Authorizations:
bearerAuth
Request Body schema: application/json
required
recipient
required
string

Only manually-blocked entries can be removed

Responses

Request samples

Content type
application/json
{
  • "recipient": "string"
}

Blasts

Send a blast message

Authorizations:
bearerAuth
Request Body schema: application/json
required
types
required
Array of strings
Items Enum: "sms" "voice" "email" "audio"
groups
required
Array of integers
message
string
subject
string

Email subject line

media
Array of objects
ivr
boolean
shortenLinks
boolean
Default: false

Responses

Request samples

Content type
application/json
{
  • "types": [
    ],
  • "groups": [
    ],
  • "message": "string",
  • "subject": "string",
  • "media": [
    ],
  • "ivr": true,
  • "shortenLinks": false
}

Response samples

Content type
application/json
{
  • "message": "string"
}

Send a test blast

Sends to the authenticated user only, not to groups.

Authorizations:
bearerAuth
Request Body schema: application/json
required
types
required
Array of strings
Items Enum: "sms" "voice" "email" "audio"
groups
required
Array of integers
message
string
subject
string
media
Array of objects
ivr
boolean
shortenLinks
boolean
Default: false

Responses

Request samples

Content type
application/json
{
  • "types": [
    ],
  • "groups": [
    ],
  • "message": "string",
  • "subject": "string",
  • "media": [
    ],
  • "ivr": true,
  • "shortenLinks": false
}

Response samples

Content type
application/json
{
  • "message": "string"
}

Estimate blast cost

Authorizations:
bearerAuth
Request Body schema: application/json
required
types
required
Array of strings
Items Enum: "sms" "voice" "email" "audio"
groups
required
Array of integers
message
string
hasMedia
required
boolean

Responses

Request samples

Content type
application/json
{
  • "types": [
    ],
  • "groups": [
    ],
  • "message": "string",
  • "hasMedia": true
}

Response samples

Content type
application/json
{ }

List message templates

Authorizations:
bearerAuth

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a template

Authorizations:
bearerAuth
Request Body schema: application/json
required
title
required
string
types
required
Array of strings
Items Enum: "sms" "voice" "email" "audio"
message
string
subject
string
voiceFallback
boolean
groups
Array of integers
dnc
Array of integers
media
Array of objects
shortenLinks
boolean
Default: false
ivr
boolean

Responses

Request samples

Content type
application/json
{
  • "title": "string",
  • "types": [
    ],
  • "message": "string",
  • "subject": "string",
  • "voiceFallback": true,
  • "groups": [
    ],
  • "dnc": [
    ],
  • "media": [
    ],
  • "shortenLinks": false,
  • "ivr": true
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "title": "string",
  • "types": [
    ],
  • "message": "string",
  • "subject": "string",
  • "voiceFallback": 0,
  • "groups": [
    ],
  • "dnc": [
    ],
  • "files": [ ],
  • "shortenLinks": 0,
  • "ivr": 0
}

Update a template

Authorizations:
bearerAuth
path Parameters
id
required
integer
Request Body schema: application/json
required
title
string
types
Array of strings
Items Enum: "sms" "voice" "email" "audio"
message
string
subject
string
voiceFallback
boolean
groups
Array of integers
dnc
Array of integers
media
Array of objects
shortenLinks
boolean
ivr
boolean

Responses

Request samples

Content type
application/json
{
  • "title": "string",
  • "types": [
    ],
  • "message": "string",
  • "subject": "string",
  • "voiceFallback": true,
  • "groups": [
    ],
  • "dnc": [
    ],
  • "media": [
    ],
  • "shortenLinks": true,
  • "ivr": true
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "title": "string",
  • "types": [
    ],
  • "message": "string",
  • "subject": "string",
  • "voiceFallback": 0,
  • "groups": [
    ],
  • "dnc": [
    ],
  • "files": [ ],
  • "shortenLinks": 0,
  • "ivr": 0
}

Delete a template

Authorizations:
bearerAuth
path Parameters
id
required
integer

Responses

Response samples

Content type
application/json
{
  • "message": "string"
}

Schedules

List scheduled messages

Authorizations:
bearerAuth
query Parameters
keyword
string

Search in title or message

limit
required
integer
offset
required
integer

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a scheduled message

Authorizations:
bearerAuth
Request Body schema: application/json
required
startDate
required
string <date>
startTime
required
string

HH:MM format

title
required
string
types
required
Array of strings
Items Enum: "sms" "voice" "email" "audio"
groups
required
Array of integers
message
string
subject
string
media
Array of objects
ivr
boolean
shortenLinks
boolean
Default: false
frequency
string
Enum: "minutes" "hours" "days" "weeks" "months"

Makes the schedule recurring

every
integer >= 1

Interval for recurrence (required if frequency set)

remaining
integer

Max number of iterations

days
integer [ 0 .. 127 ]

Day-of-week bitmap (only with frequency)

Responses

Request samples

Content type
application/json
{
  • "startDate": "2019-08-24",
  • "startTime": "string",
  • "title": "string",
  • "types": [
    ],
  • "groups": [
    ],
  • "message": "string",
  • "subject": "string",
  • "media": [
    ],
  • "ivr": true,
  • "shortenLinks": false,
  • "frequency": "minutes",
  • "every": 1,
  • "remaining": 0,
  • "days": 127
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "title": "string",
  • "subject": "string",
  • "message": "string",
  • "groups": [
    ],
  • "types": "string",
  • "active": 0,
  • "next": "2019-08-24T14:15:22Z",
  • "media": [ ],
  • "every": 0,
  • "frequency": "minutes",
  • "remaining": 0,
  • "days": 0
}

Update a scheduled message

Authorizations:
bearerAuth
path Parameters
id
required
integer
Request Body schema: application/json
required
message
string
subject
string
title
string
every
integer
frequency
string
Enum: "minutes" "hours" "days" "weeks" "months"
remaining
integer
active
integer
Enum: 0 1
days
integer
startDate
string <date>

Must be paired with startTime

startTime
string

Must be paired with startDate

Responses

Request samples

Content type
application/json
{
  • "message": "string",
  • "subject": "string",
  • "title": "string",
  • "every": 0,
  • "frequency": "minutes",
  • "remaining": 0,
  • "active": 0,
  • "days": 0,
  • "startDate": "2019-08-24",
  • "startTime": "string"
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "title": "string",
  • "subject": "string",
  • "message": "string",
  • "groups": [
    ],
  • "types": "string",
  • "active": 0,
  • "next": "2019-08-24T14:15:22Z",
  • "media": [ ],
  • "every": 0,
  • "frequency": "minutes",
  • "remaining": 0,
  • "days": 0
}

Delete a scheduled message

Authorizations:
bearerAuth
path Parameters
id
required
integer

Responses

Response samples

Content type
application/json
{
  • "message": "string"
}

Logs

List message logs

Authorizations:
bearerAuth
query Parameters
keyword
string

Search in username or message

limit
required
integer
offset
required
integer

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get log details for a message

Authorizations:
bearerAuth
path Parameters
id
required
integer
query Parameters
keyword
string

Filter by recipient

status
string
Enum: "queued" "sent" "delivered" "failed" "clicked"
limit
required
integer
offset
required
integer
getClicks
string
Value: "true"

Include click counts per recipient

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get delivery statistics for a message

Authorizations:
bearerAuth
path Parameters
id
required
integer

Responses

Response samples

Content type
application/json
{
  • "statuses": {
    },
  • "errors": [
    ],
  • "clicks": 0
}

Cancel a pending message

Authorizations:
bearerAuth
path Parameters
id
required
integer

Responses

Response samples

Content type
application/json
{
  • "message": "string"
}

Groups

List groups

Authorizations:
bearerAuth

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a group

Authorizations:
bearerAuth
Request Body schema: application/json
required
name
required
string
number
integer

Auto-assigned if omitted

private
boolean
Default: false

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "number": 0,
  • "private": false
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "name": "string",
  • "number": 0
}

Update a group

Authorizations:
bearerAuth
path Parameters
id
required
integer
Request Body schema: application/json
required
name
required
string
number
required
integer
private
boolean

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "number": 0,
  • "private": true
}

Response samples

Content type
application/json
{
  • "id": 0,
  • "name": "string",
  • "number": 0
}

Delete a group

Authorizations:
bearerAuth
path Parameters
id
required
integer

Responses

Response samples

Content type
application/json
{
  • "message": "string"
}