Every resource in the Arowana API has a unique identifier. This page explains each ID type: what format it takes, where you receive it, and which request fields to pass it into.
Shortened placeholders in example IDs. Some docs pages use values like msg_a1b2c3d4 or cr_a1b2c3 where the real suffix would be a full UUID (msg_550e8400e29b...). The prefixes themselves (msg_, c_, cr_, ag_, tpl_, evt_) are real and stable — only the suffix portion is abbreviated for readability. The table below shows canonical formats.
Send responses vs message log responses use different field names for the message identifier:
| Context | Field name | Example |
|---|
POST /v1/messages response | message_id | msg_a1b2c3d4 |
GET /v1/messages list item | id | msg_a1b2c3d4 |
GET /v1/messages/{id} object | id | msg_a1b2c3d4 |
Webhook data payload | message_id | msg_a1b2c3d4 |
The value is the same — only the field name differs between send responses (message_id) and log objects (id).
Quick reference
| Resource | Field name | Format | Example |
|---|
| Contact | contact_id | c_ prefix | c_550e8400e29b41d4a716446655440000 |
| Message | message_id | msg_ prefix | msg_550e8400e29b41d4a716446655440001 |
| RCS agent | agent_id | ag_draft_ or ag_live_ prefix | ag_draft_550e8400... |
| Consent record | record_id | cr_ prefix | cr_550e8400e29b41d4a716446655440002 |
| Channel | channel_id | ch_ prefix | ch_550e8400e29b41d4a716446655440003 |
| Campaign | campaign_id | UUID | 550e8400-e29b-41d4-a716-446655440004 |
| Template | template_id | tpl_ prefix | tpl_550e8400e29b41d4a716446655440005 |
| Webhook endpoint | webhook_id | UUID | 550e8400-e29b-41d4-a716-446655440006 |
| Webhook event | id | evt_ prefix | evt_550e8400e29b41d4a716446655440007 |
Format: c_ prefix — c_550e8400e29b41d4a716446655440000
Contact IDs use a c_ prefix followed by a UUID. You receive a contact ID in the response to POST /v1/contacts or POST /v1/contacts/import.
Used in:
GET /v1/contacts/{id} — fetch a contact
PATCH /v1/contacts/{id} — update a contact
DELETE /v1/contacts/{id} — delete a contact
GET /v1/contacts/{id}/consent — read consent records
POST /v1/contacts/{id}/consent — set consent
- Message logs — the
contact_id field on every message record
How to get it: Call POST /v1/contacts and read id from the response. If you use an external_id (e.g. your CRM user ID), you can look up the contact by external ID.
Message ID
Format: msg_ prefix — msg_a1b2c3d4
Every outbound send or inbound message receives a unique message ID.
Used in:
GET /v1/messages/{id} — fetch full message detail and delivery timeline
DELETE /v1/messages/{id} — revoke a queued message
- Webhook payloads —
data.message_id on all message.* events
How to get it: Call POST /v1/messages and read message_id from the response. Also available in GET /v1/messages list results.
RCS Agent ID
Format: ag_draft_ or ag_live_ prefix — ag_draft_550e8400..., ag_live_550e8400...
The prefix is chosen at agent creation based on whether you created the agent as a draft or directly in an approved/live state. It never changes after creation — an agent created as a draft keeps the ag_draft_ prefix even after it is approved and launched.
Do not use the ag_draft_ / ag_live_ prefix to determine whether an agent is currently live. An agent created as a draft that later gets approved and launched will always have an ag_draft_ prefix. Always check the status field from GET /v1/rcs/agents/{id} for the authoritative current state.
| Prefix | Meaning |
|---|
ag_draft_ | Agent was created in draft state (may now be APPROVED and live — check status) |
ag_live_ | Agent was created already in a live/approved state |
Used in:
GET /v1/rcs/agents/{id} — get agent details
PATCH /v1/rcs/agents/{id} — update agent profile
POST /v1/rcs/agents/{id}/submit — submit for review
GET /v1/rcs/agents/{id}/launch — check carrier launch status
POST /v1/messages — the agent_id body field on every RCS send
- Webhook payloads —
data.agent_id on agent.* and conversation.* events
How to get it: Call POST /v1/rcs/agents and read agent_id from the response. Also visible in the RCS dashboard.
Consent Record ID
Format: cr_ prefix — cr_a1b2c3
Each consent record is scoped to one contact + channel type + message type combination.
Used in:
DELETE /v1/contacts/{id}/consent/{record_id} — revoke a specific consent record
How to get it: Call GET /v1/contacts/{id}/consent or POST /v1/contacts/{id}/consent and read id from the consent record. Also returned inline in GET /v1/contacts/{id} inside consent_records[].
Channel ID
Format: ch_ prefix — ch_550e8400e29b41d4a716446655440003
Channels are configured in the dashboard. Each channel represents a verified sender identity for one transport (Email, RCS, or SMS).
RCS: agent_id on sends, channel_id in logs
RCS has two related but distinct concepts:
| Field | Where used | What it identifies |
|---|
agent_id | POST /v1/messages request body | The Google-registered brand agent (used for sending) |
channel_id | GET /v1/messages and GET /v1/messages/{id} response | The platform channel record in the message log |
When you send an RCS message you pass agent_id. The platform internally maps the agent to a workspace channel and records the send against that channel. Message history endpoints expose channel_id (not agent_id) in their response objects because the log schema is uniform across all channel types (Email, RCS, SMS). Both IDs are visible in the dashboard — they are different references to the same configured channel.
Used in:
POST /v1/messages — channel_id on Email and SMS sends; agent_id on RCS sends
- Message logs — the
channel_id field on every message record (including RCS)
- SMS webhook payloads —
data.channel_id
How to get it: Open the Channels section in your dashboard and copy the channel ID. Channel IDs do not change.
Campaign ID
Format: UUID — 550e8400-e29b-41d4-a716-446655440002
Campaigns are created and managed in the dashboard UI.
Used in:
POST /v1/campaigns/{id}/trigger — start a campaign
POST /v1/campaigns/{id}/pause — pause a running campaign
POST /v1/campaigns/{id}/resume — resume a paused campaign
GET /v1/campaigns/{id}/status — poll campaign status
- Message logs — the
campaign_id field links sends to the originating campaign
GET /v1/messages?campaign_id=... — filter message history by campaign
How to get it: Open the campaign in your dashboard and copy the ID from the URL or campaign detail panel.
Template ID
Format: tpl_ prefix — tpl_xxxx
Templates are created in the dashboard template editor.
Used in:
POST /v1/messages — the template_id body field on template-based sends (email and RCS)
How to get it: Open the template in your dashboard and copy the template ID.
Webhook Endpoint ID
Format: UUID — 550e8400-e29b-41d4-a716-446655440003
Webhook endpoint IDs are assigned when you register an endpoint.
Used in:
PATCH /v1/webhooks/{id} — update URL, events, or rotate secret
DELETE /v1/webhooks/{id} — remove endpoint
POST /v1/webhooks/{id}/test — send a test payload
How to get it: Call POST /v1/webhooks and read id from the response, or call GET /v1/webhooks to list all registered endpoints.
Event ID (webhook payloads)
Format: evt_ prefix — evt_a1b2c3
Every event delivered to your webhook endpoint has a unique event ID.
Used for: Deduplication. Store processed event IDs to detect and safely ignore retried deliveries.
const processedEvents = new Set();
app.post("/webhooks/arowana", (req, res) => {
const { id, event, data } = req.body;
if (processedEvents.has(id)) {
return res.status(200).send("already processed");
}
processedEvents.add(id);
// handle event...
res.status(200).send("OK");
});
How to get it: Always present in the webhook payload as the top-level id field.