Activity Log
Your own system, such as a dialer or a CRM, can write activity entries onto a conversation’s Teambox timeline. Log a call, a WhatsApp call, a meeting, an email, an SMS or a note, and your team sees it in the chat next to the messages. These three endpoints add, list and delete those entries.
Internal only
Where it shows
- In the Teambox web chat window, between the messages. Each entry is placed by its
occurredAttime. - In the Assign tab history in the right panel.
- In the assignment-history popover.
- Live in any chat that is open when you add or delete an entry.
Entries are not shown in these places:
- The Teambox mobile app (not yet).
- The dashboard Leads page.
GET /v2.0/conversations/assignment-history. Read them withGET /v2.0/conversations/activityinstead.
How an entry looks
typesets the icon.titleis the bold line.noteis the second line.byshows as “by Rahul Sharma via API”. Without it, the entry shows “via API”.linkUrladds a link. It useslinkLabelas its text, or “Open link” when you leave the label out.
Finding the conversation
Adding and listing entries both need to know which chat. Pass one of these:
conversationId: the id returned byGET /v2.0/chats/conversations.contactId, with optionalchannelandbusinessNumber. Sendiee uses the contact’s number or channel id. If that finds no chat, it falls back to the contact’s newest linked chat on that channel.phone, with optionalchannel(whatsappby default,instagramormessenger) andbusinessNumber.
For phone:
- On WhatsApp, you may leave out
businessNumberonly when the account has exactly one WhatsApp number. Formatting in the phone number (+, spaces, dashes, brackets) is stripped. - On Instagram and Messenger,
businessNumberis required. It is your Instagram or Messenger account id, andphoneis the customer’s Instagram or Messenger id.
This is the same targeting as the other Teambox endpoints, plus contactId. See Targeting a conversation.
Errors when finding the conversation
| Status | Code | Meaning |
|---|---|---|
| 400 | LOCATOR_REQUIRED | None of conversationId, contactId or phone was sent |
| 400 | INVALID_CONVERSATION_ID | conversationId is not a valid id |
| 400 | INVALID_CONTACT_ID | contactId is not a valid id |
| 400 | INVALID_CHANNEL | channel is not whatsapp, instagram or messenger |
| 400 | NO_WHATSAPP_CHANNEL | A WhatsApp phone was given but the account has no active WhatsApp number |
| 400 | CHANNEL_AMBIGUOUS | The account has several WhatsApp numbers. Pass businessNumber |
| 400 | CHANNEL_ID_REQUIRED | Instagram or Messenger was used without businessNumber |
| 404 | NOT_FOUND | “No contact with that id” |
| 404 | NOT_FOUND | “This contact has no conversation on that channel yet” |
The conversation must already exist
404 NOT_FOUND and nothing is created.Add an Activity Entry
Writes one entry onto the conversation’s timeline. Call it when a call ends in your dialer, when a meeting is logged in your CRM, or when your system sends an email or SMS.
Body Parameters
| Parameter | Type | Description |
|---|---|---|
| title | string | Plain text, one line, up to 120 characters. The bold line on the timeline |
| type | string | call | whatsapp_call | meeting | email | sms | note | other. Sets the iconDefault: note |
| note | string | Plain text, up to 500 characters. Line breaks are kept. The second line |
| by | string | Who did it, up to 60 characters. Shown as "by Rahul Sharma via API". Left out, the entry shows "via API" |
| occurredAt | string (ISO 8601) | When it happened. May be in the past. More than 5 minutes in the future is rejectedDefault: now |
| linkUrl | string | An https link, up to 2048 characters, such as a call recording |
| linkLabel | string | Link text, up to 40 characters. Ignored without linkUrlDefault: Open link |
| externalId | string | number | Your own id for the entry, up to 100 characters. Unique per account. See Retries and duplicates |
| conversationId | string | Target conversation id. Send this, contactId or phone |
| contactId | string | Target contact id. Send this, conversationId or phone |
| phone | string | Customer identifier: WhatsApp number, or the Instagram / Messenger id |
| channel | string | whatsapp | instagram | messengerDefault: whatsapp |
| businessNumber | string | Your WhatsApp number, or your Instagram / Messenger account id. Optional only on WhatsApp with exactly one number |
Code Example
curl -X POST "https://api.sendiee.com/v2.0/conversations/activity" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"phone": "919876543210",
"type": "call",
"title": "Outbound call · 4m 12s",
"by": "Rahul Sharma",
"note": "Interested in the 3BHK. Wants a site visit on Sunday morning.",
"occurredAt": "2026-11-01T10:21:00+05:30",
"linkUrl": "https://recordings.example.com/c/8f2a91",
"linkLabel": "Call recording",
"externalId": "call_8f2a91"
}'Response — 201 Created
{
"success": true,
"data": {
"id": "6724a8e19d2b4e0011abc301",
"conversationId": "66c3f0a19d2b4e0011ab9911",
"type": "call",
"title": "Outbound call · 4m 12s",
"note": "Interested in the 3BHK. Wants a site visit on Sunday morning.",
"by": "Rahul Sharma",
"occurredAt": "2026-11-01T04:51:00.000Z",
"linkUrl": "https://recordings.example.com/c/8f2a91",
"linkLabel": "Call recording",
"externalId": "call_8f2a91",
"createdAt": "2026-11-01T04:55:42.310Z",
"duplicate": false
}
}Activity Entry Object
| Parameter | Type | Description |
|---|---|---|
| id | string | The entry id. Use it to delete the entry |
| conversationId | string | The conversation the entry was written to |
| type | string | call, whatsapp_call, meeting, email, sms, note or other |
| title | string | The bold line |
| note | string | The second line, or "" when empty |
| by | string | Who did it, or "" when empty |
| occurredAt | string (ISO 8601) | When it happened. Sets its place on the timeline |
| linkUrl | string | The link, or null |
| linkLabel | string | The link text you sent, or null. The chat shows "Open link" when null |
| externalId | string | Your own id, or null |
| createdAt | string (ISO 8601) | When Sendiee stored the entry |
| duplicate | boolean | POST only. true when this externalId was already logged and nothing new was added |
Retries and duplicates
Send an externalId with every entry, such as your call id. It is unique per account, not per chat. If the same externalId arrives again, Sendiee adds nothing and returns the first entry with duplicate: true and status 200. So you can retry a timed-out request, or replay a webhook from your dialer, without creating a second entry.
Errors
On top of the errors when finding the conversation:
| Status | Code | Meaning |
|---|---|---|
| 400 | INVALID_TYPE | type is not one of the seven types |
| 400 | TITLE_REQUIRED | title is missing or empty |
| 400 | TITLE_TOO_LONG | title is over 120 characters |
| 400 | INVALID_NOTE | note is not text |
| 400 | NOTE_TOO_LONG | note is over 500 characters |
| 400 | INVALID_BY | by is not text |
| 400 | BY_TOO_LONG | by is over 60 characters |
| 400 | INVALID_OCCURRED_AT | occurredAt is not a valid ISO 8601 date-time |
| 400 | OCCURRED_AT_IN_FUTURE | occurredAt is more than 5 minutes in the future |
| 400 | INVALID_LINK_URL | linkUrl is not an https link, or is over 2048 characters |
| 400 | INVALID_LINK_LABEL | linkLabel is not text |
| 400 | LINK_LABEL_TOO_LONG | linkLabel is over 40 characters |
| 400 | INVALID_EXTERNAL_ID | externalId is not text or a number, or is over 100 characters |
Try It — Add an Entry
ISO 8601. Leave empty for now
Use instead of a conversation id
Use instead of a conversation id
List Activity Entries
Returns a conversation’s activity entries, newest first. Only activity entries are returned. Assignment and status history come from Assignment History.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
| conversationId | string | Target conversation id. Send this, contactId or phone |
| contactId | string | Target contact id. Send this, conversationId or phone |
| phone | string | Customer identifier: WhatsApp number, or the Instagram / Messenger id |
| channel | string | whatsapp | instagram | messengerDefault: whatsapp |
| businessNumber | string | Your WhatsApp number, or your Instagram / Messenger account id |
| limit | number | Entries per page, 1 to 100Default: 50 |
| before | string (ISO 8601) | Cursor. Pass nextBefore from the previous page |
Code Example
curl -X GET "https://api.sendiee.com/v2.0/conversations/activity?phone=919876543210&limit=20" \
-H "Authorization: Bearer YOUR_API_KEY"Response — 200 OK
{
"success": true,
"data": {
"conversationId": "66c3f0a19d2b4e0011ab9911",
"activity": [
{
"id": "6724a8e19d2b4e0011abc301",
"conversationId": "66c3f0a19d2b4e0011ab9911",
"type": "call",
"title": "Outbound call · 4m 12s",
"note": "Interested in the 3BHK. Wants a site visit on Sunday morning.",
"by": "Rahul Sharma",
"occurredAt": "2026-11-01T04:51:00.000Z",
"linkUrl": "https://recordings.example.com/c/8f2a91",
"linkLabel": "Call recording",
"externalId": "call_8f2a91",
"createdAt": "2026-11-01T04:55:42.310Z"
},
{
"id": "6721f0b29d2b4e0011abc2f4",
"conversationId": "66c3f0a19d2b4e0011ab9911",
"type": "email",
"title": "Brochure emailed",
"note": "",
"by": "",
"occurredAt": "2026-10-30T09:15:00.000Z",
"linkUrl": null,
"linkLabel": null,
"externalId": null,
"createdAt": "2026-10-30T09:15:03.884Z"
}
],
"hasMore": false,
"nextBefore": null
}
}Entries have the same fields as the POST response, without duplicate. When hasMore is true, pass nextBefore as before to get the next page.
Errors
On top of the errors when finding the conversation:
| Status | Code | Meaning |
|---|---|---|
| 400 | INVALID_CURSOR | before is not a valid ISO 8601 date-time |
Try It — List Entries
Use instead of a conversation id
Use instead of a conversation id
nextBefore from the previous page
Delete an Activity Entry
Removes one activity entry. It disappears from open chats straight away. Only activity entries can be deleted. Assignment and status history can never be removed this way.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
| activityId | string | The entry id from the POST or GET response |
Code Example
curl -X DELETE "https://api.sendiee.com/v2.0/conversations/activity/6724a8e19d2b4e0011abc301" \
-H "Authorization: Bearer YOUR_API_KEY"Response — 200 OK
{
"success": true,
"data": {
"id": "6724a8e19d2b4e0011abc301",
"conversationId": "66c3f0a19d2b4e0011ab9911",
"deleted": true
}
}Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | INVALID_ACTIVITY_ID | activityId is not a valid id |
| 404 | NOT_FOUND | “No activity entry with that id” |
Scopes and other errors
Adding and deleting entries need the activity:write scope. Listing needs activity:read. Keys with full access already have both. See API Key Scopes.
| Status | Code | Meaning |
|---|---|---|
| 403 | INSUFFICIENT_SCOPE | The key lacks the scope named in required_scope |
| 502 | UPSTREAM_ERROR | The inbox backend could not be reached. Retry. It is not a problem with your payload |
| 503 | TEAMBOX_NOT_CONFIGURED | Teambox is not enabled for the environment you are calling |
Errors use the envelope { "error": true, "code": "...", "message": "..." }.