1. Contacts
Chronox AI API Referance
  • Get Started
    • Introduction
    • Authentication
    • Rate limiting
    • Errors
    • Pagination
    • Campaign
  • Account
    • Get User Details
      GET
    • Get Meta Integration
      GET
    • Get Integrated Channels
      GET
    • Get WABA Catalogs
      GET
  • WhatsApp Templates
    • Getting started
    • Templates
      • Create Whatsapp Template Guide
      • Get Whatsapp Templates
      • Get Whatsapp Template Details
      • Create Whatsapp Template
    • Lookups
      • Get Whatsapp Template Category
      • Get Whatsapp Languages
      • Get Whatsapp Template Type
      • Get Whatsapp Template Interactive Type
      • Get Whatsapp Template Header Type
      • Get Whatsapp Template Button Type
      • Get Whatsapp Template Dynamic Variable Type
  • Messaging
    • Getting started
    • Send Whatsapp Message
      POST
    • Send Whatsapp Template
      POST
    • Send Canned Response
      POST
  • Inbox
    • Get Inbox Data
      GET
    • Get Thread Details
      GET
    • Update Thread Archive
      PUT
    • Assign Thread Tags
      PUT
    • Assign Thread Status
      PUT
    • Update Thread Notes
      PUT
    • Get Canned Responses
      GET
    • Get Tags
      GET
    • Get Thread Status Types
      GET
  • Contact List
    • Getting started
    • Get Contact List
    • Create Contact List
    • Update Contact List
    • Update Contact List Status
    • Delete Contact List
  • Contacts
    • Getting started
    • Get Contacts
      POST
    • Create Contacts
      POST
    • Update Contact
      PUT
    • Delete Contact
      PUT
    • Delete Contact Copy
      PUT
  • Tags and fields
    • Contact Tags
      • Get contact tags
      • Create contact tags
      • Update contact tag
      • Delete contact tag
    • Contact Fields
      • Get contact fields
      • Create contact fields
      • Update contact field
      • Delete contact field
  • Campaign
    • Getting Started
    • Campaign APIs
      • Create campaign
      • Get campaign
      • Update campaign
      • Delete campaign
      • Run campaign
      • Pause campaign
      • Resume campaign
      • Archive campaign
      • Get campaign Stats
    • Lookup
      • Get Statuses
      • Get campaign execution statuses
      • Get campaign contact filter types
      • Get campaign message types
      • Get contact field types
      • Get template variable types
      • Get country codes
  • Whatsapp Flow
    • Get Whatsapp flows
  • Tickets
    • Getting started
    • Get Tickets
    • Create Ticket
    • Update Ticket
    • Get Ticket Statuses
    • Get Agents
  • Organization Teams
    • Get Organization Teams
  • Template Library
    • Get Template Library
    • Get Template Drafts
  • CRM
    • Import leads (single or bulk)
    • List leads
    • Get lead detail
  • Schemas
    • Thread Execution Data
    • LeadImportField
    • LeadImportContact
    • Single lead
    • LeadImportBulkLead
    • Bulk (leads[])
    • LeadImportWarning
    • Single result
    • Bulk result
    • ApiError
    • ErrorEnvelope
    • Lead detail
    • Lead list row
    • Lead list
  1. Contacts

Getting started

Getting started with contacts#

A contact is one person in one contact list: a WhatsApp phone number plus the details you keep about them (for example a first name), and optional tags. This section lets you add contacts, find them, change them and delete them.
You need a contact list first. If you do not have one, read Getting started with contact lists.
What you want to doEndpoint
Find contacts in a listPOST /contact
Add one or many contactsPOST /contact/create-contact
Change a contactPUT /contact
Delete contactsPUT /contact/delete-contact
POST /contact is a "get" even though it uses POST: the filters go in the body.

1. The big picture#

Contact list
 ├─ Fields   (Phone Number, Country Code, First Name, ... plus your own)
 └─ Contacts
      ├─ one value per field   (contact_data)
      └─ tags                  (contact_tag_assignment)
Every value you save for a contact belongs to a field. To save a value you send the field's ID and the value, so you first need to know the field IDs of your list.

2. Before you add contacts: what you need#

What you needWhere to find it
contact_list_id of an active listGet Contact List (GET /contact/list)
The field IDs of that listGet contact fields (GET /contact/field?contact_list_id=12)
Tag IDs (optional)Get contact tags (GET /contact/tag?contact_list_id=12)
The country code to use (for example IN)Get country codes (GET /global/country-code)
Three fields matter most:
Field nameRequiredWhat to send
Phone NumberAlwaysThe number without the country code, for example 9876543210.
Country CodeAlwaysThe country's short code, for example IN, not +91. Use a value from Get country codes.
First NameIf your list has a First Name fieldA non-empty name.
Find the ID of each field by its name in the Get contact fields response. The IDs in the examples below (101, 102, 103) are samples; yours will differ.
INFO
How the phone number is checked. Chronox checks that the number is a valid mobile number for the country you give, then stores it with the country code and digits only, for example 919876543210. A number that does not match the country, or a landline, is refused.

3. Add contacts#

POST /contact/create-contact
You can add one contact or many in one request. Both use the same address.

Add one contact#

{
  "contact_list_id": 12,
  "contact_data": [
    { "contact_field_id": 101, "contact_data_value": "John" },
    { "contact_field_id": 102, "contact_data_value": "9876543210" },
    { "contact_field_id": 103, "contact_data_value": "IN" }
  ],
  "contact_tag_id": [5, 6]
}
contact_tag_id is optional. Every tag must be one of this list's tags or a built-in tag (see Get contact tags); otherwise the whole request is refused.
You get the saved contact back, inside its list:
{
  "status": true,
  "data": [
    {
      "contact_list_id": 12,
      "contact_list_name": "October customers",
      "contact_list_status_id": 1,
      "contact_list_status_name": "Active",
      "flag_allow_duplicate_contact": false,
      "contact": [
        {
          "contact_id": 5001,
          "contact_phone_number": "919876543210",
          "created_at_timestamp": "2026-01-01T00:00:00.000Z",
          "updated_at_timestamp": null,
          "flag_recent": false,
          "flag_deleted": false,
          "contact_tag_assignment": [
            {
              "contact_tag_assignment_id": 9001,
              "contact_tag_id": 5,
              "contact_tag_name": "VIP",
              "created_at_timestamp": "2026-01-01T00:00:00.000Z",
              "updated_at_timestamp": null
            }
          ],
          "contact_chatbot_assignment_data": [],
          "contact_data": [
            {
              "contact_data_id": 7001,
              "contact_field_id": 101,
              "contact_field_name": "First Name",
              "flag_default": true,
              "contact_data_value_flag_json": false,
              "contact_data_value": "John",
              "created_at_timestamp": "2026-01-01T00:00:00.000Z",
              "updated_at_timestamp": null
            }
          ]
        }
      ]
    }
  ]
}
Keep contact_id (to change or delete the contact) and the contact_data_id values (to change a single value).

Add many contacts at once#

Put the contacts in a contacts array. Tags can be set for everyone at the top level, or for one contact inside its own item.
{
  "contact_list_id": 12,
  "contact_tag_id": [5],
  "contacts": [
    {
      "contact_data": [
        { "contact_field_id": 101, "contact_data_value": "John" },
        { "contact_field_id": 102, "contact_data_value": "9876543210" },
        { "contact_field_id": 103, "contact_data_value": "IN" }
      ]
    },
    {
      "contact_data": [
        { "contact_field_id": 101, "contact_data_value": "Asha" },
        { "contact_field_id": 102, "contact_data_value": "9123456789" },
        { "contact_field_id": 103, "contact_data_value": "IN" }
      ],
      "contact_tag_id": [6]
    }
  ]
}
A bulk request is partly successful: good contacts are created, bad ones are skipped and explained one by one. The index is the position of the contact in your contacts array, starting at 0.
{
  "status": true,
  "total_contacts": 2,
  "created_contacts": 1,
  "failed_contacts": 1,
  "results": [
    { "index": 0, "status": true, "contact_id": 5001 },
    { "index": 1, "status": false, "error": "Invalid phone number" }
  ],
  "data": [ { "contact_list_id": 12, "contact_list_name": "October customers", "contact": [ ] } ]
}
data lists only the contacts that were created. Always check results (or failed_contacts) rather than just status.
Reasons a single contact in a bulk request can fail:
Message in resultsWhat to do
contact_data is requiredSend at least one value.
Phone number is requiredSend the Phone Number field with a value.
Country code is missing or invalidSend the Country Code field with a value from Get country codes.
First name is requiredSend a non-empty First Name.
Invalid contact_field_idThe field ID does not belong to this list. Check Get contact fields.
Invalid contact_tag_idThe tag is not one of this list's tags or a built-in tag. Check Get contact tags.
Invalid phone numberNot a valid mobile number for that country.
Duplicate phone number in requestThe same number appears twice in your request (and the list does not allow duplicates).
Contact already existsThe number is already in the list (and the list does not allow duplicates).
TIP
Send big imports in batches (for example a few hundred contacts per request) so each response stays small and easy to check.

4. Find contacts#

POST /contact
Only contact_list_id is required. With nothing else, you get every contact in the list.
{
  "contact_list_id": 12,
  "contact_id": 5001,
  "contact_tag_id": [5, 6],
  "contact_data": [
    {
      "contact_field_id": 101,
      "contact_field_value": [
        { "contact_data_value": "John" }
      ]
    }
  ]
}
FieldWhat it does
contact_list_idRequired. The list to look in.
contact_idReturn only this contact.
contact_tag_idReturn contacts that have at least one of these tags.
contact_dataReturn contacts whose value for a field matches. Capital letters do not matter. A contact must match every field you list. For one field you can list several values; matching any of them is enough.
The response has the same shape as section 3 (a list with its contact array). A list with no matching contacts returns "contact": [].
NOTE
Each contact has flag_deleted. Ignore any contact where it is true.

5. Change a contact#

PUT /contact
{
  "contact_id": 5001,
  "contact_data": [
    { "contact_data_id": 7001, "contact_data_value": "Johnny" },
    { "contact_field_id": 104, "contact_data_value": "Delhi" }
  ],
  "contact_tag_id": [5, 6]
}
Rules that are easy to get wrong:
To change an existing value, send its contact_data_id (from Find contacts) and the new contact_data_value. Do not also send contact_field_id in the same item.
To add a value for a field the contact does not have yet, send contact_field_id and the value, without contact_data_id. Do not use this for a field that already has a value.
contact_tag_id is the complete list of tags the contact should have. Tags that are missing from your list are removed. If you leave contact_tag_id out, all tags are removed. Always send the full list.
The phone number cannot be changed. Trying to send a different number gives error 9315. Delete the contact and add a new one instead.
The Opt-out Meta tag is set by WhatsApp and cannot be added or removed by you (error 9314).
The contact's list must be active. A contact in an archived list cannot be changed (error 9330).
You get the updated contact back, in the same shape as section 3.

6. Delete contacts#

PUT /contact/delete-contact
This is a PUT with a body, not a DELETE.
{ "contact_id": [5001, 5002] }
contact_id is a list, so you can delete several at once. If any ID is not found in your organization, nothing is deleted and you get error 9001.
{
  "status": true,
  "data": {
    "code": 9064,
    "message": "Contact - '919876543210,919123456789' deleted successfully."
  }
}
You cannot delete contacts from the Master Contact List (error 9309) or from an archived list (error 9330).
Deleting a contact also removes its tags and values. A contact assigned to a chatbot is unassigned first. This cannot be undone from the API.

7. Common errors#

Errors come back with HTTP status 200 and "status": false. See Errors for the general format.
CodeWhat it meansWhat to do
9001The body is wrong: missing list or contact ID, no Phone Number or Country Code, invalid country code or phone number, unknown field or tag, or a contact ID that is not yours.Check every ID against the lookups in section 2.
9270Contact already exists in this list (single add).Update the existing contact instead, or allow duplicates on the list.
9314The Opt-out Meta tag cannot be added or removed by you.Leave that tag out.
9315The phone number cannot be changed.Delete the contact and add a new one.
9309Contacts in the Master Contact List cannot be deleted.Nothing to do.
9330The list is archived, so the action is not allowed.Make the list active first.
9002The list ID is wrong or not yours (find).Check contact_list_id.

8. Quick checklist#

The list is active.
You looked up the field IDs of this list and matched them by name.
Every contact has a Phone Number, a Country Code such as IN, and a First Name if the list has that field.
Tag IDs come from Get contact tags for this list.
After a bulk add you checked failed_contacts and results.
When updating, you sent the full tag list.

What this section doesn't cover#

Creating and managing the lists themselves: see Getting started with contact lists.
Creating tags and custom fields: see the Tags and fields folder.
Sending messages to your contacts: see Getting started with campaigns.
Modified at 2026-11-03 12:46:16
Previous
Delete Contact List
Next
Get Contacts
Built with