Authorization: Bearer header. See Authentication and the API Key guide
to get and configure the key. Base: https://api.nuvia.ai, prefix /v1.
Each case lists the required API key scopes. Grant only those when creating the key.
Case 1: Send your first message
Scopes:inboxes:read, conversations:read, messages:read, messages:create.
1
Discover your channels (inboxes)
List the inboxes connected to your company.
2
Get a conversation
Sending a message happens inside a conversation. List conversations to get a
conversationId (or create one with POST /v1/conversations).cURL
3
Send a text message
POST /v1/messages/send with the conversationId and the message object.contentType: "TEXT" for text messages.4
Read the conversation history
GET /v1/messages/conversation/:id returns the messages; attachments are at
GET /v1/messages/conversation/:id/attachments.cURL
Case 2: Receive events via webhooks
Register a URL of yours for Nuvia to notify in real time (messages, conversations, contacts). This case shows the end-to-end flow; the payload format, the full list of events, and the delivery guarantees are in the Webhooks guide. Scopes: to register and query,webhooks:create and webhooks:read; to manage,
webhooks:update and webhooks:delete (+ messages:create if you reply automatically).
1
Register a webhook
POST /v1/webhooks. There are 10 valid events: MESSAGE_SENT, MESSAGE_RECEIVED,
MESSAGE_DELIVERED, MESSAGE_READ, CONVERSATION_CREATED, CONVERSATION_UPDATED,
CONTACT_CREATED, CONTACT_UPDATED, FOLLOWUP_SENT, and FIELD_UPDATED. See what each one
delivers in the event table.Your company has one webhook: if one is already configured, this call returns 409.
Update the existing one instead of creating another.custom_headers (for you to validate the origin) and status (ACTIVE/INACTIVE).2
Receive the callbacks
When an event occurs, Nuvia makes a
POST to your url, with the header
X-Webhook-Event and a three-field body:data carries the event’s resource: the message, the conversation, or the contact, in the
same format as the corresponding GET. FIELD_UPDATED is the exception and has its own
structure.3
React to the event
From the callback, you can act via API: reply with
POST /v1/messages/send (Case 1) or download attachments with
GET /v1/messages/conversation/:id/attachments.4
Manage the configuration
GET /v1/webhooks returns one object with the company’s configuration (or null). It’s
not a list. Use that object’s id to update with PUT /v1/webhooks/:id or remove with
DELETE /v1/webhooks/:id. To pause without losing the configuration, prefer PUT with
status: "INACTIVE".Case 3: Campaigns and bulk sending
Scopes:campaigns:create, campaigns:read, campaigns:update, campaigns:delete
(+ messages:create for the bulk template shortcut).
1
Create the campaign
POST /v1/campaigns. Required fields: name, channel_type, trigger_type, and
audience_config; optional ones include description, trigger_config, behavior_config, and
sender_config. The internal structures of these configuration objects are in the
API reference. Follow the schema there.The audience is defined at creation time, inside audience_config (via contact_ids,
lists, or filters). There’s no separate enrollment step to do via API. The campaign is
already born with the audience you provide here.2
Check before sending
Use the previews (they create nothing):
POST /v1/campaigns/audience-preview counts the
audience’s contacts and POST /v1/campaigns/preview-message resolves the message variables.3
Activate and track
Activate with
POST /v1/campaigns/:id/activate (pause with /pause). Track with
GET /v1/campaigns/:id/analytics and GET /v1/campaigns/:id/step-analytics, and export the
contacts with GET /v1/campaigns/:id/enrollments/export.cURL
Shortcut: to send a WhatsApp template to several contacts without building a campaign, use
POST /v1/messages/send-bulk-template (scope messages:create). The step-by-step, with the
template parameters and Meta’s limits, is in the guide
Bulk template sending on WhatsApp.Case 4: Sync contacts
Keep your external CRM and Nuvia in sync. Scopes:contacts:read, contacts:create, contacts:update, contacts:delete.
1
Check for duplicates by phone
Before creating, resolve the phone numbers to see which already exist:
POST /v1/contacts/find-by-phones.2
Create the missing contacts
POST /v1/contacts. Fields: firstname, lastname, phone, email, company, and properties.3
Update and list
Update a contact with
PUT /v1/contacts/:id (or just the name with PUT /v1/contacts/:id/name) and
list/paginate with GET /v1/contacts. To remove the link between a contact and an external CRM,
use DELETE /v1/contacts/:id/crm-link: this only undoes the link; the contact keeps
existing in Nuvia (it’s not a contact deletion).Other public surfaces
Consumable via API key and covered in the Reference: Agents, Tables and lists, Conversations, and Knowledge base. See the map in API sections.Next steps
API Key guide
Scopes, key creation, and revocation.
API reference
All endpoints, parameters, and responses.