SuprSend Message API
The Message API from SuprSend — 1 operation(s) for message.
The Message API from SuprSend — 1 operation(s) for message.
openapi: 3.1.1
info:
title: SuprSend Broadcast Message API
description: APIs supported on suprsend platform
version: 1.2.2
servers:
- url: https://hub.suprsend.com
security:
- sec0: []
- BearerAuth: []
tags:
- name: Message
paths:
/v1/message/:
get:
summary: List Messages
description: 'Retrieve a paginated list of messages in a workspace order by created_at desc. Can be used to fetch and show message logs on the platform.
'
operationId: list-messages
security:
- BearerAuth: []
parameters:
- name: limit
in: query
schema:
type: integer
default: 10
maximum: 1000
description: Maximum number of messages to return per page. Defaults to `10`, maximum is `1000`.
- name: after
in: query
schema:
type: string
description: 'Cursor for forward pagination - pass the `meta.after` value from a previous response to fetch the next page of older messages. Treat this value as an opaque cursor - do not parse, validate, or assume any format for it. **Takes precedence over `before` when both are set** (`before` is silently ignored).
'
- name: before
in: query
schema:
type: string
description: 'Cursor for backward pagination - pass the `meta.before` value from a previous response to fetch the previous page of newer messages. Treat this value as an opaque cursor - do not parse, validate, or assume any format for it. Ignored when `after` is also set.
'
- name: status[]
in: query
schema:
type: array
items:
type: string
enum:
- triggered (status AnyOf('triggered','trigger_blocked','sent_by_vendor','to_be_triggered','not_to_be_triggered'))
- delivery_failed (status AnyOf('trigger_failed','failure_by_vendor')
- delivered
- seen
- clicked
- dismissed
- read (is_read = true)
- unread (is_read = false)
- archived (is_archived = true)
style: form
explode: true
description: 'Filter by one or more derived statuses. Multiple values are OR-ed. Repeat the param for each value, e.g. `?status[]=delivered&status[]=seen`.
'
- name: channel
in: query
schema:
type: string
enum:
- sms
- email
- androidpush
- iospush
- webpush
- inbox
- whatsapp
- slack
- ms_teams
description: Filter by delivery channel.
- name: recipient_id[]
in: query
schema:
type: array
items:
type: string
style: form
explode: true
description: Filter by one or more recipient `distinct_id`s (OR-ed). Repeat the param for each value, e.g. `?recipient_id[]=user_123&recipient_id[]=user_456`.
- name: category[]
in: query
schema:
type: array
items:
type: string
style: form
explode: true
description: Filter by one or more notification categories (OR-ed). Repeat the param for each value, e.g. `?category[]=transactional&category[]=promotional`.
- name: created_at_gte
in: query
schema:
type: string
format: date-time
description: 'RFC3339 timestamp lower bound (inclusive). Compared against the `created_at` column which has **second precision** - sub-second components in the filter value are effectively truncated. Example: `2026-04-26T21:34:33Z`.
'
- name: created_at_lte
in: query
schema:
type: string
format: date-time
description: 'RFC3339 timestamp upper bound (inclusive). Same second-precision caveat as `created_at_gte`. Must be `>= created_at_gte` when both are set.
'
- name: workflow_slug
in: query
schema:
type: string
description: Filter messages triggered from a specific workflow.
- name: execution_id
in: query
schema:
type: string
description: Matches `wf_exec_id` or `broadcast_id`.
- name: idempotency_key
in: query
schema:
type: string
description: Filter by the idempotency key associated with the message at trigger time.
- name: message_id
in: query
schema:
type: string
description: Exact match on message ID.
- name: tenant_id
in: query
schema:
type: string
description: Filter messages belonging to a specific tenant.
- name: is_campaign
in: query
schema:
type: boolean
description: Set `true` to return only messages sent as part of a broadcast/campaign.
- name: object_id
in: query
schema:
type: string
description: Must be provided together with `object_type` to filter messages sent to an object. Will filter all message logs which were sent to recipients after object fanout.
- name: object_type
in: query
schema:
type: string
description: Must be provided together with `object_id` to filter messages sent to an object. Will filter all message logs which were sent to recipients after object fanout.
responses:
'200':
description: Returns the paginated list of messages order by created_at desc.
content:
application/json:
schema:
type: object
properties:
meta:
$ref: '#/components/schemas/CursorPagination'
results:
type: array
items:
$ref: '#/components/schemas/MessageResponse'
example:
meta:
count: 3506
limit: 10
has_prev: false
before: null
has_next: true
after: 01HVXXXXXXXXXXXXXXXXXXXX10
results:
- message_id: 01HVXXXXXXXXXXXXXXXXXXXX01
created_at: '2026-04-01T17:18:06.000Z'
updated_at: '2026-04-01T17:20:11.000Z'
triggered_at: '2026-04-01T17:18:06.000Z'
delivered_at: '2026-04-01T17:18:08.000Z'
seen_at: '2026-04-01T17:19:25.000Z'
clicked_at: null
dismissed_at: null
read_at: null
unread_at: null
archived_at: null
unarchived_at: null
is_read: false
is_archived: false
status: seen
channel: inbox
idempotency_key: order-5678
failure_reason: null
recipient:
$type: user
distinct_id: user_123
object_type: null
id: null
parent_entity_id: null
parent_entity_type: null
vendor:
name: suprsend_inbox
nickname: Inbox
execution_id: exec_01HV...
parent_execution_id: null
is_campaign: false
tenant_id: acme
workflow:
slug: order-confirmation
version_id: wf_ver_01HV...
name: Order Confirmation
node_ref: send_inbox_1
template:
name: Order Confirmation
slug: order-confirmation
version_no: 4
channel_identity:
inbox: user_123
category: transactional
- message_id: 01HVXXXXXXXXXXXXXXXXXXXX02
created_at: '2026-04-01T17:30:01.000Z'
updated_at: '2026-04-01T17:30:15.000Z'
triggered_at: '2026-04-01T17:30:01.000Z'
delivered_at: null
seen_at: null
clicked_at: null
dismissed_at: null
read_at: null
unread_at: null
archived_at: null
unarchived_at: null
is_read: false
is_archived: false
status: delivery_failure
channel: sms
idempotency_key: null
failure_reason: invalid_recipient_number
recipient:
$type: user
distinct_id: user_456
object_type: null
id: null
parent_entity_id: null
parent_entity_type: null
vendor:
name: gupshup
nickname: Gupshup WhatsApp
execution_id: exec_01HV...
parent_execution_id: null
is_campaign: false
tenant_id: acme
workflow:
slug: password-reset
version_id: wf_ver_01HV...
name: Password Reset
node_ref: multichannel_1
template:
name: Password Reset
slug: password-reset
version_no: 2
channel_identity:
sms: '+15555550100'
category: transactional
deprecated: false
tags:
- Message
components:
schemas:
MessageResponse:
type: object
description: A single notification delivery attempt produced by a workflow trigger or broadcast.
properties:
message_id:
type: string
description: Message-id to update.
created_at:
type: string
format: date-time
description: Time when the message entry was created.
updated_at:
type: string
format: date-time
description: Time when the message entry was last updated (for example, on a status or timestamp change).
triggered_at:
type: string
format: date-time
nullable: true
description: Time when the message was handovered to vendor by SuprSend.
delivered_at:
type: string
format: date-time
nullable: true
description: Time when the vendor confirmed successful delivery. Null if the message has not been delivered yet. If you're not getting delivery events for email, SMS and Whatsapp, make sure to configure SuprSend webhook URL in vendor portal.
seen_at:
type: string
format: date-time
nullable: true
description: Time when the recipient first saw or opened the message. Seen tracking is available for all channels accept Slack, MS Teams and SMS.
clicked_at:
type: string
format: date-time
nullable: true
description: Time when the recipient clicked or interacted with the message. Tracked for Email, Push and Inbox.
dismissed_at:
type: string
format: date-time
nullable: true
description: Time when the recipient dismissed or cleared the message. Only application for mobile push notifications.
read_at:
type: string
format: date-time
nullable: true
description: Time when the message was marked as read. Only applicable for Inbox channel.
unread_at:
type: string
format: date-time
nullable: true
description: Time when a previously read message was marked unread. Only applicable for Inbox channel.
archived_at:
type: string
format: date-time
nullable: true
description: Time when the message was archived. Only applicable for Inbox channel.
unarchived_at:
type: string
format: date-time
nullable: true
description: Time when a previously archived message was unarchived. Only applicable for Inbox channel.
is_read:
type: boolean
description: Whether the message is currently in the read state. Only applicable for Inbox channel.
is_archived:
type: boolean
description: Whether the message is currently archived. Only applicable for Inbox channel.
status:
type: string
description: 'Current message status. Other than `archived`, all actions translate to a status. Archived is just a flag on the message.
- `triggered` - Message has been triggered by SuprSend and queued for delivery to the vendor.
- `trigger_failed` - Vendor reported failure in response to delivery API call itself.
- `trigger_blocked` - Test mode is enabled and this channel was not part of allowed channel list.
- `not_to_be_triggered` - Message was intentionally skipped (generally happens in smart delivery when success metric is achieved)
- `to_be_triggered` - Message is queued and waiting to be triggered (generally happens when there is a wait added in smart delivery)
- `sent_by_vendor` - Vendor accepted the message for delivery; final delivery confirmation is pending.
- `delivered` - Vendor confirmed successful delivery to the recipient.
- `delivery_failure` - Vendor reported a delivery failure (for example, bounce or invalid recipient).
- `seen` - Recipient saw or opened the message.
- `clicked` - Recipient clicked or interacted with the message.
- `dismissed` - Recipient dismissed the message without acting on it.
- `read` - Inbox message was marked as read by the recipient.
'
enum:
- triggered
- trigger_failed
- trigger_blocked
- not_to_be_triggered
- to_be_triggered
- sent_by_vendor
- delivered
- delivery_failure
- seen
- clicked
- dismissed
- read
channel:
type: string
description: Channel through which the message was sent.
enum:
- sms
- email
- whatsapp
- inbox
- androidpush
- iospush
- webpush
- slack
- ms_teams
idempotency_key:
type: string
description: Idempotency key supplied at trigger time to prevent duplicate sends for the same logical event.
failure_reason:
type: string
description: Human-readable reason describing why delivery failed. Empty when the message did not fail.
recipient:
type: object
description: 'Recipient of the message. Either a user (`$type: user`) or an object (`$type: object`).'
properties:
$type:
type: string
description: Recipient type - `user` for a user recipient or `object` for an object recipient.
enum:
- user
- object
distinct_id:
type: string
description: Distinct ID of the user recipient. Present when `$type` is `user`.
object_type:
type: string
description: Object type slug. Present when `$type` is `object`.
id:
type: string
description: Object ID. Present when `$type` is `object`.
parent_entity_id:
type: string
description: ID of the parent entity (object)
parent_entity_type:
type: string
description: Type of the parent entity that originated this message (object)
vendor:
type: object
description: Delivery vendor that handled this message.
properties:
name:
type: string
description: Internal name of the vendor integration (for example, `sendgrid`, `twilio`).
nickname:
type: string
description: User-defined nickname for the vendor integration in the SuprSend dashboard.
execution_id:
type: string
description: ID of the workflow execution this message belongs to.
parent_execution_id:
type: string
description: ID of the parent execution, when this message was produced as fanout on object trigger.
is_campaign:
type: boolean
description: true when message was sent as part of a broadcast.
tenant_id:
type: string
description: ID of the tenant the message was sent under.
workflow:
type: object
description: Workflow that produced the message.
properties:
slug:
type: string
description: Unique slug of the workflow.
version_id:
type: string
description: ID of the specific workflow version that ran.
name:
type: string
description: Human-readable name of the workflow.
node_ref:
type: string
description: Slug to the specific node within the workflow that emitted this message.
template:
type: object
description: Template used to render the message.
properties:
name:
type: string
description: Human-readable name of the template.
slug:
type: string
description: Unique slug of the template.
version_no:
type: integer
description: Version number of the template that was used to render the message.
channel_identity:
type: object
additionalProperties: true
description: Channel-specific recipient identity that the message was delivered to (for example, the phone number for SMS, email address for email). Credential keys (`access_token`, `keys`, `incoming_webhook`) are stripped from the response.
example:
sms: '+15555550100'
category:
type: string
description: Notification category slug associated with this message.
CursorPagination:
type: object
properties:
count:
type: integer
description: Total matching records (ignores cursor position).
limit:
type: integer
description: Maximum number of results returned per page.
has_prev:
type: boolean
description: True when the previous page (newer logs) exists.
before:
type: string
nullable: true
description: Cursor to pass as `before=` to retrieve the previous page (newer logs). Null on the first page or when `has_prev` is false.
has_next:
type: boolean
description: True when an next page (older logs) exist.
after:
type: string
nullable: true
description: Cursor to pass as `after=` to retrieve the next page (older logs). Null when `has_next` is false.
securitySchemes:
BearerAuth:
type: http
scheme: bearer
bearerFormat: API_Key
description: Pass as `Bearer <API_KEY>`. Get API Key from SuprSend dashboard Developers -> API Keys section.
ServiceTokenAuth:
type: apiKey
in: header
name: ServiceToken <token>
description: You can get Service Token from [SuprSend dashboard -> Account Settings -> Service Tokens](https://app.suprsend.com/en/account-settings/service-tokens) section.
sec0:
type: apiKey
in: header
name: Authorization
x-bearer-format: bearer
description: Bearer authentication header of the form `Bearer <token>`, where <token> is your auth token.
x-readme:
headers: []
explorer-enabled: true
proxy-enabled: true
x-readme-fauxas: true