Skip to main content
The Integration API exposes Daysync chat for reading only, and only for channels and group chats.
1:1 direct messages are never available through this API. They are filtered out of every list and search, and requesting one by ID returns 404. There is no way to reach a DM through the Integration API or the MCP server.There is also no chat.write scope. You cannot post, edit, delete, pin, or react to messages.
Everything below is additionally bounded by the authenticated user’s own access: their conversation membership, their history cutoff if they joined a channel late, and per-viewer redaction of mentions pointing at items they cannot see. The API never widens what that user could see in the app. All endpoints require the standard authentication headers and the chat.read scope.

Is chat enabled?

Chat is switched on per tour. Call this first — the other endpoints return nothing useful on a tour with chat disabled. Response data: the tour’s chat configuration.

List conversations

Every channel and group chat on the tour that the user belongs to. Response data
dmsAndGroups keeps its name for backwards compatibility but contains group chats only through this API — DMs are removed. type values are lowercase: channel, group_chat.
totalUnread counts only the conversations this API returns. It is the sum of unread_count across favourites, channels and dmsAndGroups, so it always reconciles with the payload you received — but it will be lower than the unread badge the same user sees in the Daysync app, because the app counts direct messages and this API never exposes them. Muted conversations count as 0 in both.Don’t treat a difference from the in-app number as missing data.
This endpoint is not paged; it returns the tour’s full list.

Get a conversation

Response data: { id, type, name, description, is_public, is_archived, created_by_user_id, member_count, created_at }

List its members

Response data: array of members with their user record and chat role.

Read messages

Returns messages newest first. Query parameters
Paging here is cursor-based on message ID, not limit/offset like the rest of the API. Pass the nextCursor from the previous response back as cursor to walk backwards through history.
Response data
A few things to expect:
  • Thread replies are not in this feed. Use the thread endpoint below.
  • A message deleted by its author is omitted; one removed by an admin comes back as a tombstone with content: null.
  • Attachments blocked by moderation are stripped from the response.
  • Voice notes carry is_voice_note, duration_seconds, and waveform_data.

Read a thread

Replies to a threaded message, oldest first.
The cursor runs in the opposite direction to messages: threads page forwards, the main feed pages backwards.

Pinned messages

Often the most useful single call on a channel — pins are where load-in details, addresses, and running orders end up. Response data: array of { pin_id, pinned_by_user_id, pinned_at, message }.

Reactions

Response data: [{ "emoji": "👍", "count": 3, "reactors": [{ "userId": "cdd1…", "name": "Jane Doe", "isYou": false }] }]

Search messages

Searches every channel and group chat the user is in. Response data: { messages: [...], nextCursor }. Each hit carries the conversation it came from. Hits in DMs are removed.

Search files

Files and images shared in a conversation, matched by name.

Not available

Deliberately not exposed: read receipts, presence, mention candidates, report reasons, and any write operation. If your integration needs one of these, get in touch.
See also: Tours, Scopes & Permissions.