Help Docs Developer Resources Webhooks

Webhooks

Syncable Events

There are several types of events that we can sync:

All events are sent via the POST method with a Content-Type: application/json header and JSON in the body. The API supports sending events over HTTPS and will retry for 24 hours in case your remote URL is temporarily unavailable.

Configuration

You can set up your webhook by going to Tools > Integrations > Webhooks in the portal.

You must provide the URL of your webhook and select at least one event in order to enable the synchronization.

You may optionally provide a username and password for authentication. Providing a username and password will set Basic authorization but if you only provide a username then that will be the value of the Bearer authentication header. For example, if you enter the value “3PvwJaEg” in the username field and leave the password empty, the following header will be a part of each webhook request: Authorization: Bearer 3PvwJaEg.

You can also set conditions (in JSON format) based on certain values. For example, if you only want to sync contacts if/when they have the “special” tag applied, you can enter the following in this field: { "flags": "special" }.

Webhooks payload format

All events use the same format:

  • type - event type
  • ctime - epoch time in milliseconds for when the event was sent
  • data - a JSON payload
{
  "type": "TYPE",
  "ctime": TIMESTAMP,              
  "data": {....}
}

Contact Updated Event


This event is fired every time a contact in your account has been updated. Event is sent to you in real time. The data payload format is the Contact Object.

{
  "type": "CONTACT_UPDATED",
  "ctime": 1619552282398,              
  "data": {
      "cid": "c_k123g456c789",  
      "flags": ["new","optin","yes"],   
      "name": "John Smith",
      "first_name": "John",
      "last_name": "Smith",
      "phone": "2025551234",
      "group": ["1"],                    
      "create_time": "02/01/2025 01:13AM EST",
      "update_time": "02/01/2025 02:13AM EST",
      "sent_time": "02/01/2025 10:13AM EST"
  }
}

Message Received Event


This event is fired every time a contact in your account has responded. Event is sent to you in real time. The data payload format is the Message Log Object.

Special cases:

  • opt-out happens when a contact sends STOP keyword, once detected we add the dnd tag to the flags list. Only the system can add this tag so this is reliable indicator of out-out use case.
  • bad number happens when we dectect a complaint about wrong number, mistake or other common conditions about the message sent to wrong destination. In this case, we add tag bad to the flags list.
  • rude tag is applied if we detect offensive or curse words in the message, we detect most common English and Spanish curse words.
{
  "type": "MESSAGE_RECEIVED",
  "ctime": 1619552282398,                  
  "data": {
      "cid": "c_k123g456c789",
      "phone": "5555555555",
      "name": "John Smith",
      "proxy": "8443035634",
      "logid": "rl_1234.....",
      "flags": ["dnd"],
      "text": "STOP",
      "sent_time": "02/04/2025 02:35PM EST",
      "action": "1",
      "contact_flags": ["dnd","replied","voter"],
      "contact_source": "123456"
  }
}

Delivery Receipt Event


This event is fired every time we receive a confirmation of delivery from a carrier, the status field indicates how the text has been delivered. To receive these events your system must have capability for processing a large number of simultaneous requests, we forward such events in real time as soon as we receive it from carriers.

The data payload format is the Message Log Object.

Note: If we never received any confirmation from carriers, we do not generate any receipts on our own.

Delivered event:


{
  "type": "DELIVERY_RECEIPT",
  "ctime": 1619552282398,
  "data": {
      "cid": "c_k123g456c789",
      "phone": "5555555555",
      "name": "John Smith",
      "proxy": "8443035634",
      "logid": "rl_1234.....",
      "flags": [],
      "text": "Hey, would you like to take a short survey?",
      "sent_time": "02/04/2025 02:35PM EST",
      "update_time": "02/04/2025 02:36PM EST",
      "action": "1", 
      "status": "delivered"
  }
}

Undelivered event:


The status can be either undelivered or failed.

{
  "type": "DELIVERY_RECEIPT",
  "ctime": 1619552282398, 
  "data": {
      "cid": "c_k123g456c789",
      "phone": "5555555555",
      "name": "John Smith",
      "proxy": "8443035634",
      "logid": "rl_1234.....",
      "flags": [],
      "text": "Hey, would you like to take a short survey?",
      "sent_time": "02/04/2025 02:35PM EST",
      "update_time": "02/04/2025 02:36PM EST",
      "action": "1",                                      
      "status": "undelivered",
      "error_code": "landline",                             
      "error_text": "Undelivered destination",         
      "status_code": "12345"                                    
  }
}
Proxy provisioned event

This webhook is fired once a TCR proxy has been provisioned, i.e. the status became ok. The data property will contain a list of proxies ready to be used.

{
  "type": "PROXY_PROVISIONED",
  "ctime": 1619552282398, 
  "data": [
          {
               "cid": "c_example123",
               "proxy": "1234567890",
               "create_time": "04/20/2025 10:30AM EST",
               "update_time": "04/20/2025 10:35AM EST",
               "referenceId": "5eb6cfcd4f5647c9983fea0b4b0bed4b",
               "campaignId": "C12345",
               "campaignName": "Campaign name",
               "brandId": "B12345",
               "brandName": "Brand name",
               "status": "ok"
          }                            
   ]
}

Deprecated Events

These events will be removed in the future but still supported

  • contact.updated - now CONTACT_UPDATED
  • contact.responded - now MESSAGE_RECEIVED
  • delivery.report - now DELIVERY_RECEIPT