Contacts

By Orqestra · Published September 2, 2026

Overview

Create, read and update the people your organization talks to. Contacts are keyed per channel — waId for WhatsApp, igId for Instagram — and the same person on two channels is two contact records until you merge them. Bulk loading goes through the import endpoints, which run as background jobs you poll.

10 endpoints. Requires contacts.view or contacts.edit on the token.

MethodPathWhat it does
GET/contactsList contacts
POST/contactsCreate a contact
GET/contacts/{id}Get contact by ID
PATCH/contacts/{id}Update a contact
GET/contacts/exportExport contacts as CSV
POST/contacts/importQueue a contact import
GET/contacts/import-templateDownload contact import template
GET/contacts/importsList contact import jobs
GET/contacts/imports/{id}Get contact import job
GET/contacts/imports/{id}/errorsDownload import errors as CSV

Endpoints

GET /contacts

List contacts

List or search contacts with pagination, custom fields, and segments. Requires `contacts.view` permission.

Requires the contacts.view permission.

ParameterInTypeRequiredDescription
pagequeryintegeroptionalPage number Defaults to 1.
limitqueryintegeroptionalItems per page Defaults to 50.
searchquerystringoptionalSearch by name, WhatsApp ID, Instagram ID, or username
channelqueryWHATSAPP · INSTAGRAMoptionalFilter by channel
segmentIdquerystringoptionalFilter by segment ID

Example

curl -X GET "https://orqestra.id/api/v2/contacts" \
  -H "Authorization: Bearer $ORQESTRA_TOKEN"

Responds with 200 · 401 · 403. Try it in the playground →


POST /contacts

Create a contact

Create a new contact. At least one of `waId` or `igId` is required. Returns 409 if duplicate exists. Requires `contacts.edit` permission.

Requires the contacts.edit permission.

Request body

FieldTypeRequiredDescription
waIdstringoptionalWhatsApp ID (phone number)
igIdstringoptionalInstagram user ID
namestringrequiredDisplay name

Example

curl -X POST "https://orqestra.id/api/v2/contacts" \
  -H "Authorization: Bearer $ORQESTRA_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Example"
  }'

Responds with 200 · 400 · 401 · 403 · 409. Try it in the playground →


GET /contacts/{id}

Get contact by ID

Get a single contact. Accepts CUID, waId, or igId. Requires `contacts.view` permission.

Requires the contacts.view permission.

ParameterInTypeRequiredDescription
idpathstringrequiredContact CUID, waId, or igId

Example

curl -X GET "https://orqestra.id/api/v2/contacts/$id" \
  -H "Authorization: Bearer $ORQESTRA_TOKEN"

Responds with 200 · 401 · 403 · 404. Try it in the playground →


PATCH /contacts/{id}

Update a contact

Update contact fields. Supports updating name, customName, waId, igId, and igUsername. Accepts CUID, waId, or igId as path parameter. Requires `contacts.edit` permission.

Requires the contacts.edit permission.

ParameterInTypeRequiredDescription
idpathstringrequiredContact CUID, waId, or igId

Request body

FieldTypeRequiredDescription
namestringoptionalDisplay name
customNamestringoptionalCustom name override
waIdstringoptionalWhatsApp ID (phone number)
igIdstringoptionalInstagram user ID
igUsernamestringoptionalInstagram username

Example

curl -X PATCH "https://orqestra.id/api/v2/contacts/$id" \
  -H "Authorization: Bearer $ORQESTRA_TOKEN"

Responds with 200 · 400 · 401 · 403 · 404. Try it in the playground →


GET /contacts/export

Export contacts as CSV

Download contacts as CSV. Requires `contacts.view` permission.

Requires the contacts.view permission.

ParameterInTypeRequiredDescription
searchquerystringoptionalSearch filter
channelqueryWHATSAPP · INSTAGRAMoptionalFilter by channel
segmentIdquerystringoptionalFilter by segment ID

Example

curl -X GET "https://orqestra.id/api/v2/contacts/export" \
  -H "Authorization: Bearer $ORQESTRA_TOKEN"

Responds with 200 · 401 · 403. Try it in the playground →


POST /contacts/import

Queue a contact import

Upload a CSV file and queue an asynchronous contact import job. Requires `contacts.edit` permission.

Requires the contacts.edit permission.

Example

curl -X POST "https://orqestra.id/api/v2/contacts/import" \
  -H "Authorization: Bearer $ORQESTRA_TOKEN"

Responds with 200 · 400 · 401 · 403. Try it in the playground →


GET /contacts/import-template

Download contact import template

Download a starter CSV template for contact imports. Requires `contacts.view` permission.

Requires the contacts.view permission.

Example

curl -X GET "https://orqestra.id/api/v2/contacts/import-template" \
  -H "Authorization: Bearer $ORQESTRA_TOKEN"

Responds with 200 · 401 · 403. Try it in the playground →


GET /contacts/imports

List contact import jobs

List recent contact import jobs. Requires `contacts.view` permission.

Requires the contacts.view permission.

ParameterInTypeRequiredDescription
activeOnlyquerybooleanoptionalOnly return queued or processing jobs
limitqueryintegeroptionalNumber of jobs to return Defaults to 20.

Example

curl -X GET "https://orqestra.id/api/v2/contacts/imports" \
  -H "Authorization: Bearer $ORQESTRA_TOKEN"

Responds with 200 · 401 · 403. Try it in the playground →


GET /contacts/imports/{id}

Get contact import job

Get the current status and counters for a contact import job. Requires `contacts.view` permission.

Requires the contacts.view permission.

ParameterInTypeRequiredDescription
idpathstringrequiredContact import job ID

Example

curl -X GET "https://orqestra.id/api/v2/contacts/imports/$id" \
  -H "Authorization: Bearer $ORQESTRA_TOKEN"

Responds with 200 · 401 · 403 · 404. Try it in the playground →


GET /contacts/imports/{id}/errors

Download import errors as CSV

Download the failed-row report for a contact import job. Requires `contacts.view` permission.

Requires the contacts.view permission.

ParameterInTypeRequiredDescription
idpathstringrequiredContact import job ID

Example

curl -X GET "https://orqestra.id/api/v2/contacts/imports/$id/errors" \
  -H "Authorization: Bearer $ORQESTRA_TOKEN"

Responds with 200 · 401 · 403 · 404. Try it in the playground →