KoltrixKoltrix docs
Reference·/api/v2

API reference

Every public Koltrix endpoint. Drop a kx_ key in the bar below and the Try it panel on each endpoint will fire the request against api.koltrix.com from your browser and render the JSON response in-place. Nothing is proxied through this docs site.

Your API key— stored in this browser only ( localStorage.koltrix_api_key ). Used for every "Try it" request below.

Don't have one yet? Generate a key at app.koltrix.com/api-keys.

Auth & meta

Resolve the tenant and permission set attached to the API key you're using.

GET/api/v2/me

Get current identity

Returns the tenant slug and permission set resolved from the Authorization header. Useful as a health-check from your integration to confirm the key is live and which workspace it points at.

Code sample

curl -X GET https://api.koltrix.com/api/v2/me \
  -H "Authorization: Bearer kx_live_..."

Example response

{
  "tenant": "acme",
  "permissions": [
    "read",
    "send",
    "contacts",
    "newsletter"
  ]
}

Lists

Newsletter audiences. Each list owns its own subscribers, double opt-in setting, and embed token.

GET/api/v2/lists

List newsletter lists

Returns every list visible to the current tenant.

Code sample

curl -X GET https://api.koltrix.com/api/v2/lists \
  -H "Authorization: Bearer kx_live_..."

Example response

{
  "data": [
    {
      "id": "lst_4f3a",
      "name": "Product updates",
      "description": "Monthly changelog digest",
      "subscriber_count": 1284,
      "created_at": "2026-01-12T09:14:22Z"
    }
  ]
}
POST/api/v2/lists

Create a list

Provision a new newsletter list.

Parameters

NameInTypeDescription
name*bodystringHuman-readable name shown in the dashboard.
descriptionbodystringInternal description, never shown to subscribers.

Code sample

curl -X POST https://api.koltrix.com/api/v2/lists \
  -H "Authorization: Bearer kx_live_..." \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Product updates",
  "description": "Monthly changelog digest"
}'

Example response

{
  "id": "lst_4f3a",
  "name": "Product updates",
  "description": "Monthly changelog digest",
  "subscriber_count": 0,
  "created_at": "2026-05-26T10:11:12Z"
}
GET/api/v2/lists/:id

Get a list

Returns a single list by its id.

Parameters

NameInTypeDescription
id*pathstringThe list id (e.g. `lst_4f3a`).

Code sample

curl -X GET https://api.koltrix.com/api/v2/lists/:id \
  -H "Authorization: Bearer kx_live_..."

Example response

{
  "id": "lst_4f3a",
  "name": "Product updates",
  "description": "Monthly changelog digest",
  "subscriber_count": 1284,
  "created_at": "2026-01-12T09:14:22Z"
}
PATCH/api/v2/lists/:id

Update a list

Patch list metadata. Only supplied fields are changed.

Parameters

NameInTypeDescription
id*pathstringThe list id.
namebodystringNew display name.
descriptionbodystringNew description.

Code sample

curl -X PATCH https://api.koltrix.com/api/v2/lists/:id \
  -H "Authorization: Bearer kx_live_..." \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Changelog"
}'

Example response

{
  "id": "lst_4f3a",
  "name": "Changelog",
  "description": "Monthly changelog digest",
  "subscriber_count": 1284
}
DELETE/api/v2/lists/:id

Delete a list

Permanently delete a list and all of its subscribers. This cannot be undone.

Parameters

NameInTypeDescription
id*pathstringThe list id.

Code sample

curl -X DELETE https://api.koltrix.com/api/v2/lists/:id \
  -H "Authorization: Bearer kx_live_..."

Example response

{
  "deleted": true,
  "id": "lst_4f3a"
}

Subscribers

Add, import, list, and unsubscribe subscribers on a given list. Unsubscribes hit the global suppression list automatically.

GET/api/v2/lists/:id/subscribers

List subscribers

Paginated subscribers for a list.

Parameters

NameInTypeDescription
id*pathstringThe list id.
limitquerynumberPage size (default 50, max 200).
offsetquerynumberOffset into the result set.

Code sample

curl -X GET https://api.koltrix.com/api/v2/lists/:id/subscribers \
  -H "Authorization: Bearer kx_live_..."

Example response

{
  "data": [
    {
      "id": "sub_91ac",
      "email": "[email protected]",
      "first_name": "Ada",
      "last_name": "Lovelace",
      "status": "subscribed",
      "created_at": "2026-04-02T14:01:00Z"
    }
  ],
  "total": 1,
  "limit": 50,
  "offset": 0
}
POST/api/v2/lists/:id/subscribers

Add a subscriber

Add a single subscriber to a list. Duplicate emails return the existing row instead of erroring.

Parameters

NameInTypeDescription
id*pathstringThe list id.
email*bodystringSubscriber email (will be lower-cased).
first_namebodystringFirst name for merge tags.
last_namebodystringLast name for merge tags.
metadatabodyobjectArbitrary JSON key/value pairs.

Code sample

curl -X POST https://api.koltrix.com/api/v2/lists/:id/subscribers \
  -H "Authorization: Bearer kx_live_..." \
  -H "Content-Type: application/json" \
  -d '{
  "email": "[email protected]",
  "first_name": "Ada",
  "last_name": "Lovelace",
  "metadata": {
    "plan": "pro",
    "source": "landing-hero"
  }
}'

Example response

{
  "id": "sub_91ac",
  "email": "[email protected]",
  "first_name": "Ada",
  "last_name": "Lovelace",
  "status": "subscribed",
  "created_at": "2026-05-26T10:14:33Z"
}
POST/api/v2/lists/:id/subscribers/import

Bulk import subscribers

Import up to 10k subscribers in a single call. The request is processed asynchronously and returns a job id you can poll.

Parameters

NameInTypeDescription
id*pathstringThe list id.
subscribers*bodyarrayArray of subscriber objects (same shape as POST /subscribers).

Code sample

curl -X POST https://api.koltrix.com/api/v2/lists/:id/subscribers/import \
  -H "Authorization: Bearer kx_live_..." \
  -H "Content-Type: application/json" \
  -d '{
  "subscribers": [
    {
      "email": "[email protected]",
      "first_name": "One"
    },
    {
      "email": "[email protected]",
      "first_name": "Two"
    }
  ]
}'

Example response

{
  "job_id": "job_imp_77fe",
  "accepted": 2,
  "rejected": 0,
  "status": "queued"
}
DELETE/api/v2/lists/:id/subscribers/:sub_id

Delete a subscriber

Hard-delete a subscriber row. To unsubscribe without losing history, use the unsubscribe endpoint instead.

Parameters

NameInTypeDescription
id*pathstringThe list id.
sub_id*pathstringThe subscriber id.

Code sample

curl -X DELETE https://api.koltrix.com/api/v2/lists/:id/subscribers/:sub_id \
  -H "Authorization: Bearer kx_live_..."

Example response

{
  "deleted": true,
  "id": "sub_91ac"
}
POST/api/v2/lists/:id/subscribers/:sub_id/unsubscribe

Unsubscribe

Marks the subscriber as `unsubscribed` and adds their email to the tenant-wide suppression list.

Parameters

NameInTypeDescription
id*pathstringThe list id.
sub_id*pathstringThe subscriber id.

Code sample

curl -X POST https://api.koltrix.com/api/v2/lists/:id/subscribers/:sub_id/unsubscribe \
  -H "Authorization: Bearer kx_live_..."

Example response

{
  "id": "sub_91ac",
  "status": "unsubscribed",
  "unsubscribed_at": "2026-05-26T10:18:02Z"
}

Broadcasts

One-off campaigns sent to every subscribed member of a list. For drip series see Sequences.

POST/api/v2/lists/:id/broadcast

Send a broadcast

Queue a broadcast to every subscribed member of the list. Returns immediately with a `broadcast_id` — delivery happens in the worker.

Parameters

NameInTypeDescription
id*pathstringThe list id.
subject*bodystringEmail subject line.
body_html*bodystringHTML body. Merge tags like `{{first_name}}` are interpolated per recipient.
body_textbodystringPlain-text fallback. Auto-generated if omitted.
from*bodystringFrom address. Must be on a verified domain.

Code sample

curl -X POST https://api.koltrix.com/api/v2/lists/:id/broadcast \
  -H "Authorization: Bearer kx_live_..." \
  -H "Content-Type: application/json" \
  -d '{
  "from": "[email protected]",
  "subject": "What shipped in May",
  "body_html": "<h1>Hi {{first_name}},</h1><p>This month we shipped…</p>",
  "body_text": "Hi {{first_name}}, this month we shipped…"
}'

Example response

{
  "broadcast_id": "brd_aa12",
  "status": "queued",
  "recipients": 1284,
  "enqueued_at": "2026-05-26T10:20:01Z"
}

Sequences

Drip automations. A sequence has an entry trigger (e.g. `subscribed`) and an ordered list of steps that send after a configurable delay.

GET/api/v2/sequences

List sequences

Returns all sequences for the current tenant.

Code sample

curl -X GET https://api.koltrix.com/api/v2/sequences \
  -H "Authorization: Bearer kx_live_..."

Example response

{
  "data": [
    {
      "id": "seq_2c81",
      "name": "Welcome series",
      "list_id": "lst_4f3a",
      "trigger": "subscribed",
      "step_count": 3,
      "created_at": "2026-03-01T00:00:00Z"
    }
  ],
  "total": 1
}
POST/api/v2/sequences

Create a sequence

Create an empty sequence; add steps with POST `/steps`.

Parameters

NameInTypeDescription
name*bodystringSequence name.
list_id*bodystringThe list whose subscribers feed this sequence.
trigger*bodystringEntry trigger. Currently supported: `subscribed`, `manual`.

Code sample

curl -X POST https://api.koltrix.com/api/v2/sequences \
  -H "Authorization: Bearer kx_live_..." \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Welcome series",
  "list_id": "lst_4f3a",
  "trigger": "subscribed"
}'

Example response

{
  "id": "seq_2c81",
  "name": "Welcome series",
  "list_id": "lst_4f3a",
  "trigger": "subscribed",
  "step_count": 0,
  "created_at": "2026-05-26T10:22:14Z"
}
DELETE/api/v2/sequences/:id

Delete a sequence

Delete a sequence and stop any in-flight enrolments. Already-delivered messages are unaffected.

Parameters

NameInTypeDescription
id*pathstringThe sequence id.

Code sample

curl -X DELETE https://api.koltrix.com/api/v2/sequences/:id \
  -H "Authorization: Bearer kx_live_..."

Example response

{
  "deleted": true,
  "id": "seq_2c81"
}
GET/api/v2/sequences/:id/steps

List sequence steps

Returns the ordered steps for a sequence.

Parameters

NameInTypeDescription
id*pathstringThe sequence id.

Code sample

curl -X GET https://api.koltrix.com/api/v2/sequences/:id/steps \
  -H "Authorization: Bearer kx_live_..."

Example response

{
  "data": [
    {
      "id": "stp_001",
      "sequence_id": "seq_2c81",
      "position": 1,
      "delay_minutes": 0,
      "subject": "Welcome",
      "body_html": "<p>Glad you're here.</p>"
    },
    {
      "id": "stp_002",
      "sequence_id": "seq_2c81",
      "position": 2,
      "delay_minutes": 2880,
      "subject": "Day 2 — getting set up",
      "body_html": "<p>Here's how to send your first email…</p>"
    }
  ],
  "total": 2
}
POST/api/v2/sequences/:id/steps

Add a sequence step

Append a step to the end of the sequence. `delay_minutes` is the wait between the previous step (or trigger, for step 1) and this one.

Parameters

NameInTypeDescription
id*pathstringThe sequence id.
subject*bodystringStep email subject.
body_html*bodystringStep email body.
body_textbodystringPlain-text fallback.
delay_minutes*bodynumberMinutes to wait before sending this step.
frombodystringOverride From address for this step.

Code sample

curl -X POST https://api.koltrix.com/api/v2/sequences/:id/steps \
  -H "Authorization: Bearer kx_live_..." \
  -H "Content-Type: application/json" \
  -d '{
  "subject": "Welcome to Koltrix",
  "body_html": "<p>Hi {{first_name}}, glad you're here.</p>",
  "delay_minutes": 0
}'

Example response

{
  "id": "stp_003",
  "sequence_id": "seq_2c81",
  "position": 3,
  "delay_minutes": 0,
  "subject": "Welcome to Koltrix"
}
DELETE/api/v2/sequences/:id/steps/:step_id

Delete a sequence step

Remove a step from the sequence. Remaining steps' positions shift up.

Parameters

NameInTypeDescription
id*pathstringThe sequence id.
step_id*pathstringThe step id.

Code sample

curl -X DELETE https://api.koltrix.com/api/v2/sequences/:id/steps/:step_id \
  -H "Authorization: Bearer kx_live_..."

Example response

{
  "deleted": true,
  "id": "stp_002"
}

Transactional emails

One-shot transactional sends. Pass an `Idempotency-Key` header to safely retry on network failures.

POST/api/v2/emails

Send a transactional email

Queue a transactional email for delivery. Returns a `message_id` you can use against `/messages/:id` and `/messages/:id/events`. Idempotency keys dedupe duplicate sends for 24 hours.

Parameters

NameInTypeDescription
from*bodystringFrom address. Must be on a verified domain.
to*bodyarrayArray of recipient addresses (max 50).
subject*bodystringSubject line.
body_html*bodystringHTML body.
body_textbodystringPlain-text fallback. Auto-generated from HTML if omitted.
reply_tobodystringReply-To address.
ccbodyarrayArray of CC addresses.
bccbodyarrayArray of BCC addresses.
attachmentsbodyarrayArray of `{ filename, content_type, content }` where `content` is base64-encoded.
headersbodyobjectCustom RFC-5322 headers as a flat key/value map.
Idempotency-KeyheaderstringAuto-generated per Run click. Pass the same value on retry to dedupe.

Code sample

curl -X POST https://api.koltrix.com/api/v2/emails \
  -H "Authorization: Bearer kx_live_..." \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "from": "[email protected]",
  "to": [
    "[email protected]"
  ],
  "subject": "Your invoice is ready",
  "body_html": "<p>Thanks for your order.</p>",
  "body_text": "Thanks for your order."
}'

Example response

{
  "id": "msg_018f5c12",
  "status": "queued",
  "to": [
    "[email protected]"
  ],
  "subject": "Your invoice is ready",
  "enqueued_at": "2026-05-26T10:25:11Z"
}

Messages

Inspect every outbound message — transactional, broadcast, or sequence — and its delivery timeline.

GET/api/v2/messages

List messages

Paginated outbound messages. Filter by status (queued/sent/delivered/bounced/complained) and recipient.

Parameters

NameInTypeDescription
statusquerystringOne of `queued`, `sent`, `delivered`, `bounced`, `complained`, `failed`.
toquerystringFilter by recipient address (exact match).
limitquerynumberPage size (default 50, max 200).
offsetquerynumberOffset into the result set.

Code sample

curl -X GET https://api.koltrix.com/api/v2/messages \
  -H "Authorization: Bearer kx_live_..."

Example response

{
  "data": [
    {
      "id": "msg_018f5c12",
      "from": "[email protected]",
      "to": [
        "[email protected]"
      ],
      "subject": "Your invoice is ready",
      "status": "delivered",
      "created_at": "2026-05-26T10:25:11Z",
      "delivered_at": "2026-05-26T10:25:14Z"
    }
  ],
  "total": 1,
  "limit": 50,
  "offset": 0
}
GET/api/v2/messages/:id

Get a message

Returns a single outbound message by id.

Parameters

NameInTypeDescription
id*pathstringThe message id.

Code sample

curl -X GET https://api.koltrix.com/api/v2/messages/:id \
  -H "Authorization: Bearer kx_live_..."

Example response

{
  "id": "msg_018f5c12",
  "from": "[email protected]",
  "to": [
    "[email protected]"
  ],
  "subject": "Your invoice is ready",
  "status": "delivered",
  "opens": 1,
  "clicks": 0,
  "created_at": "2026-05-26T10:25:11Z",
  "delivered_at": "2026-05-26T10:25:14Z"
}
GET/api/v2/messages/:id/events

Get message events

Returns the full timeline for a message — accept, deferral, delivery, open and click events.

Parameters

NameInTypeDescription
id*pathstringThe message id.

Code sample

curl -X GET https://api.koltrix.com/api/v2/messages/:id/events \
  -H "Authorization: Bearer kx_live_..."

Example response

{
  "data": [
    {
      "type": "queued",
      "at": "2026-05-26T10:25:11Z"
    },
    {
      "type": "sent",
      "at": "2026-05-26T10:25:12Z"
    },
    {
      "type": "delivered",
      "at": "2026-05-26T10:25:14Z",
      "smtp_code": 250
    },
    {
      "type": "opened",
      "at": "2026-05-26T10:30:02Z",
      "ua": "Apple Mail"
    }
  ],
  "total": 4
}