Contacts
Want to tie conversations across messaging channels to a single contact? Airy allows you to do that and then sync these contacts to your existing CRM solutions.
This feature is disabled by default. To enable it you need to set the integration.contacts.enabled
field in
your airy.yaml config to true
.
Enabling the contacts component allows for this typical flow:
- For every existing conversation we automatically create a contact that references the conversation
- Contacts can then also be manually created, updated, fetched and importantly: merged
See the create contact response payload for an example of what the schema looks like.
Create contact
POST /contacts.create
Sample request
All request fields are optional, but an empty payload will not be accepted.
{
"display_name": "Barabara Liskov",
"avatar_url": "https://example.org/avatar.jpg",
"title": "Professor",
"timezone": "",
// relative to GMT
"gender": "female",
// female, male or any other value
"locale": "en_US",
"organization_name": "Massachusetts Institute of Technology",
"via": {
"phone": "+1234567",
"email": "b.liskov@mit.org",
"key": "value"
// allows for any additional key and value (arrays are prohibited)
},
"address": {
"organization_name": "Massachusetts Institute of Technology",
"address_line1": "77 Massachusetts Ave",
"address_line2": "building A",
"postcode": "02139",
"city": "Cambridge",
"state": "MA",
"country": "USA"
},
"conversations": {
// Automatically created contacts will always have a single conversation that is linked here
"ea1cba21-2bd6-477c-9a40-59cd9bb96bef": "facebook",
"8904adee-38b4-493b-a4d8-272e2e5a6815": "twilio.sms"
},
"metadata": {
"facebook": {
"psid": "1234567890",
"page_id": "9876543210"
},
"salesforce_id": "ABC123",
"zendesk_id": "XYZ789",
"key": "value"
// allows for any additional key and value (arrays are prohibited)
}
}
(201) Success Response Payload
{
"id": "6b80b10c-ae6e-4995-844d-c56c4da11623", // automatically generated
"display_name": "Barabara Liskov",
"avatar_url": "https://example.org/avatar.jpg",
"title": "Professor",
"timezone": "", // relative to GMT
"gender": "female", // female, male or any other value
"locale": "en_US",
"organization_name": "Massachusetts Institute of Technology",
"via": {
"phone": "+1234567",
"email": "b.liskov@mit.org",
"key": "value" // allows for any additional key and value (arrays are prohibited)
},
"address": {
"organization_name": "Massachusetts Institute of Technology",
"address_line1": "77 Massachusetts Ave",
"address_line2": "building A",
"postcode": "02139",
"city": "Cambridge",
"state": "MA",
"country": "USA"
},
"conversations": {
// Automatically created contacts will always have a single conversation that is linked here
"ea1cba21-2bd6-477c-9a40-59cd9bb96bef": "facebook",
"8904adee-38b4-493b-a4d8-272e2e5a6815": "twilio.sms"
},
"metadata": {
"facebook": {
"psid": "1234567890",
"page_id": "9876543210"
},
"salesforce_id": "ABC123",
"zendesk_id": "XYZ789",
"key": "value" // allows for any additional key and value (arrays are prohibited)
},
"created_at": "2021-11-16T13:21:03.580Z" // ISO 8601
}
List recent messages
POST /contacts.recent-messages
Sample request
{
"contact_id": "id of the contact to query",
"include_sources": ["salesforce_history"],
// (optional) inclusive OR filter of sources to show
"page_size": 20, // (optional) pagination size
"cursors": {
// (optional)
"conversation-id": "conversation message list cursor"
// allows scrolling within the messages of a conversation
}
}
Sample response
{
"conversation-id-1": {
"source": "salesforce_history",
"data": [],
// Same as for paginated message list https://airy.co/docs/core/api/endpoints/messages#list
"pagination_data": {}
},
"conversation-id-2": {}
// ...
}
Import contacts
POST /contacts.import
Creates contacts in a bulk.
Sample request
[
{
"display_name": "Barabara Liskov",
"avatar_url": "https://example.org/avatar.jpg",
"title": "Professor"
},
{
"display_name": "Eleanor B. Garcia",
"avatar_url": "https://example.org/avatar.jpg",
"title": "Estimator project manager"
},
{
"display_name": "Marie R. Lemelin",
"avatar_url": "https://example.org/avatar.jpg",
"title": "Accountant"
},
{
"display_name": "Lori L. Carter",
"avatar_url": "https://example.org/avatar.jpg",
"title": "Occupational health and safety technician"
}
]
(201) Success Response Payload
{
"data": [
{
"display_name": "Barabara Liskov",
"avatar_url": "https://example.org/avatar.jpg",
"title": "Professor"
},
{
"display_name": "Eleanor B. Garcia",
"avatar_url": "https://example.org/avatar.jpg",
"title": "Estimator project manager"
},
{
"display_name": "Marie R. Lemelin",
"avatar_url": "https://example.org/avatar.jpg",
"title": "Accountant"
},
{
"display_name": "Lori L. Carter",
"avatar_url": "https://example.org/avatar.jpg",
"title": "Occupational health and safety technician"
}
]
}
List contacts
POST /contacts.list
This is a paginated endpoint.
Sample request
{
"cursor": "next-page-uuid",
"page_size": 2
}
Sample response
{
"data": [
{
"id": "6b80b10c-ae6e-4995-844d-c56c4da11623",
"display_name": "Barabara Liskov",
"title": "Professor",
"created_at": "2021-11-16T13:21:03.580Z"
},
{
"id": "c564cea4-a96f-4ebb-a220-3fb81b6ad522",
"display_name": "Grace Hopper",
"created_at": "2021-11-16T13:45:52.433Z"
}
],
"pagination_data": {
"previous_cursor": null,
"next_cursor": "2",
"total": 200
}
}
Get contact
Get a single contact by contact or conversation id.
POST /contacts.info
Sample request by contact id
{
"id": "6b80b10c-ae6e-4995-844d-c56c4da11623"
}
Sample request by conversation id
{
"conversation_id": "ea1cba21-2bd6-477c-9a40-59cd9bb96bef"
}
Sample response
{
"id": "6b80b10c-ae6e-4995-844d-c56c4da11623", // automatically generated
"display_name": "Barabara Liskov",
"avatar_url": "https://example.org/avatar.jpg",
"title": "Professor",
"timezone": "", // relative to GMT
"gender": "female", // female, male or any other value
"locale": "en_US",
"organization_name": "Massachusetts Institute of Technology",
"via": {
"phone": "+1234567",
"email": "b.liskov@mit.org",
"key": "value" // allows for any additional key and value (arrays are prohibited)
},
"address": {
"organization_name": "Massachusetts Institute of Technology",
"address_line1": "77 Massachusetts Ave",
"address_line2": "building A",
"postcode": "02139",
"city": "Cambridge",
"state": "MA",
"country": "USA"
},
"conversations": {
// Automatically created contacts will always have a single conversation that is linked here
"ea1cba21-2bd6-477c-9a40-59cd9bb96bef": "facebook",
"8904adee-38b4-493b-a4d8-272e2e5a6815": "twilio.sms"
},
"metadata": {
"facebook": {
"psid": "1234567890",
"page_id": "9876543210"
},
"salesforce_id": "ABC123",
"zendesk_id": "XYZ789",
"key": "value" // allows for any additional key and value (arrays are prohibited)
},
"created_at": "2021-11-16T13:21:03.580Z" // ISO 8601
}
Update contact
POST /contacts.update
All fields set on the creation request can be updated. To remove a field set it to the empty
string ""
.
Sample request
{
"id": "6b80b10c-ae6e-4995-844d-c56c4da11623",
"display_name": "Barbara Liskov"
//
}
Sample response 202 (Accepted)
Delete contact
Sample request
{
"id": "6b80b10c-ae6e-4995-844d-c56c4da11623"
}
(202) Sample response
Merge contacts
POST /contacts.merge
Merge the source contact into the destination one, only the fields that are not present on the destination contact will be merged, a copy of the source contact will be saved in the merge history
Sample request
{
"source_id": "6b80b10c-ae6e-4995-844d-c56c4da11623",
"destination_id": "c564cea4-a96f-4ebb-a220-3fb81b6ad522"
}
(200) Success Response Payload
{
"display_name": "Barabara Liskov",
"avatar_url": "https://example.org/avatar.jpg",
"title": "Estimator project manager",
"organization_name": "Airy.co",
"merge_history": [
{
"display_name": "Eleanor B. Garcia",
"avatar_url": "https://example.org/avatar.jpg",
"title": "Estimator project manager",
"organization_name": "Airy.co"
}
]
}