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.

Where it shows

  • In the Teambox web chat window, between the messages. Each entry is placed by its occurredAt time.
  • 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:

How an entry looks

  • type sets the icon.
  • title is the bold line.
  • note is the second line.
  • by shows as “by Rahul Sharma via API”. Without it, the entry shows “via API”.
  • linkUrl adds a link. It uses linkLabel as 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 by GET /v2.0/chats/conversations.
  • contactId, with optional channel and businessNumber. 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 optional channel (whatsapp by default, instagram or messenger) and businessNumber.

For phone:

  • On WhatsApp, you may leave out businessNumber only when the account has exactly one WhatsApp number. Formatting in the phone number (+, spaces, dashes, brackets) is stripped.
  • On Instagram and Messenger, businessNumber is required. It is your Instagram or Messenger account id, and phone is 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

StatusCodeMeaning
400LOCATOR_REQUIREDNone of conversationId, contactId or phone was sent
400INVALID_CONVERSATION_IDconversationId is not a valid id
400INVALID_CONTACT_IDcontactId is not a valid id
400INVALID_CHANNELchannel is not whatsapp, instagram or messenger
400NO_WHATSAPP_CHANNELA WhatsApp phone was given but the account has no active WhatsApp number
400CHANNEL_AMBIGUOUSThe account has several WhatsApp numbers. Pass businessNumber
400CHANNEL_ID_REQUIREDInstagram or Messenger was used without businessNumber
404NOT_FOUND“No contact with that id”
404NOT_FOUND“This contact has no conversation on that channel yet”

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.

POST/v2.0/conversations/activity

Body Parameters

ParameterTypeDescription
titlestringPlain text, one line, up to 120 characters. The bold line on the timeline
typestringcall | whatsapp_call | meeting | email | sms | note | other. Sets the iconDefault: note
notestringPlain text, up to 500 characters. Line breaks are kept. The second line
bystringWho did it, up to 60 characters. Shown as "by Rahul Sharma via API". Left out, the entry shows "via API"
occurredAtstring (ISO 8601)When it happened. May be in the past. More than 5 minutes in the future is rejectedDefault: now
linkUrlstringAn https link, up to 2048 characters, such as a call recording
linkLabelstringLink text, up to 40 characters. Ignored without linkUrlDefault: Open link
externalIdstring | numberYour own id for the entry, up to 100 characters. Unique per account. See Retries and duplicates
conversationIdstringTarget conversation id. Send this, contactId or phone
contactIdstringTarget contact id. Send this, conversationId or phone
phonestringCustomer identifier: WhatsApp number, or the Instagram / Messenger id
channelstringwhatsapp | instagram | messengerDefault: whatsapp
businessNumberstringYour 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

ParameterTypeDescription
idstringThe entry id. Use it to delete the entry
conversationIdstringThe conversation the entry was written to
typestringcall, whatsapp_call, meeting, email, sms, note or other
titlestringThe bold line
notestringThe second line, or "" when empty
bystringWho did it, or "" when empty
occurredAtstring (ISO 8601)When it happened. Sets its place on the timeline
linkUrlstringThe link, or null
linkLabelstringThe link text you sent, or null. The chat shows "Open link" when null
externalIdstringYour own id, or null
createdAtstring (ISO 8601)When Sendiee stored the entry
duplicatebooleanPOST 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:

StatusCodeMeaning
400INVALID_TYPEtype is not one of the seven types
400TITLE_REQUIREDtitle is missing or empty
400TITLE_TOO_LONGtitle is over 120 characters
400INVALID_NOTEnote is not text
400NOTE_TOO_LONGnote is over 500 characters
400INVALID_BYby is not text
400BY_TOO_LONGby is over 60 characters
400INVALID_OCCURRED_AToccurredAt is not a valid ISO 8601 date-time
400OCCURRED_AT_IN_FUTUREoccurredAt is more than 5 minutes in the future
400INVALID_LINK_URLlinkUrl is not an https link, or is over 2048 characters
400INVALID_LINK_LABELlinkLabel is not text
400LINK_LABEL_TOO_LONGlinkLabel is over 40 characters
400INVALID_EXTERNAL_IDexternalId is not text or a number, or is over 100 characters

Try It — Add an Entry

Try it — API Playground

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.

GET/v2.0/conversations/activity

Query Parameters

ParameterTypeDescription
conversationIdstringTarget conversation id. Send this, contactId or phone
contactIdstringTarget contact id. Send this, conversationId or phone
phonestringCustomer identifier: WhatsApp number, or the Instagram / Messenger id
channelstringwhatsapp | instagram | messengerDefault: whatsapp
businessNumberstringYour WhatsApp number, or your Instagram / Messenger account id
limitnumberEntries per page, 1 to 100Default: 50
beforestring (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:

StatusCodeMeaning
400INVALID_CURSORbefore is not a valid ISO 8601 date-time

Try It — List Entries

Try it — API Playground

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.

DELETE/v2.0/conversations/activity/:activityId

Path Parameters

ParameterTypeDescription
activityIdstringThe 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

StatusCodeMeaning
400INVALID_ACTIVITY_IDactivityId is not a valid id
404NOT_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.

StatusCodeMeaning
403INSUFFICIENT_SCOPEThe key lacks the scope named in required_scope
502UPSTREAM_ERRORThe inbox backend could not be reached. Retry. It is not a problem with your payload
503TEAMBOX_NOT_CONFIGUREDTeambox is not enabled for the environment you are calling

Errors use the envelope { "error": true, "code": "...", "message": "..." }.