The full machine-readable spec is published at /openapi.yaml. Personal API tokens (csk_…) are accepted on the endpoints listed below; the complete spec also contains native app endpoints with different authentication and response contracts. Unlisted routes are not part of this supported personal messaging contract.
Conversation IDs and content
Personal-token responses contain readable names and message text. No decryption workflow or bootstrap request is needed. id androomId both identify the Matrix conversation, for example!conversation:matrix.chesly.app. Use roomId for lookup, message history, and sending. URL-encode it in paths.
senderId and recipientId are stable network identities represented as Matrix IDs. direction is incoming or outgoing and includes your linked account identities. A display name or phone label does not prove a real-world identity. For groups or unknown partners, recipientId is null; review the conversation and its member IDs.
Room lists can omit recipient and member IDs because the inbox lazy-loads them. Call GET /api/rooms/:roomId before approval to refresh current joined members and resolve the direct recipient. If a direct recipient is still null, verify the conversation in Chesly before sending.
Rooms
GET /List connected conversations with readable namesapi/ rooms GET /Get one conversation and its recipient identityapi/ rooms/ :roomId POST /Send approved text with content and txnIdapi/ rooms/ :roomId/ messages
Room lists accept limit (1 to 100), sortBy(recent or unread), and archived (false, true, or all). Default: 50 recent non-archived rooms, with pinned rooms first. Pass nextCursor as cursor with the same filters until null. The inbox can change during pagination; deduplicate by roomId.
Messages
GET /Read history with optional roomId, cursor, and limitapi/ messages
With roomId, messages are newest first in that conversation. Without it, scans walk conversations by ID, each newest first; each page belongs to one conversation. This is not a global chronological feed. Follow nextCursor even after an empty page. Keep the roomId filter unchanged. Personal tokens use opaque cursors, not timestamps.
Each message includes eventId, roomId,senderId, text, content,direction, isMine, and a timestamp in milliseconds. Redacted messages have empty text. Search these pages in your local client. Legacy native encrypted archives are a separate response contract.
Real-time sync
GET /Conversation change notifications. Refresh the affected room and message history through the readable routes; reconnects should trigger a fresh scanapi/ sync
GET /List threadsapi/ email/ threads GET /Get a messageapi/ email/ messages/ :id POST /Send, reply, or forwardapi/ email/ compose PUT /Read, star, archive, and delete actionsapi/ email/ threads/ :id POST /api/email/labels,signaturesFull read and write
Reminders
GET /Listapi/ reminders POST /Createapi/ reminders PUT /Updateapi/ reminders/ :id DELETE /Deleteapi/ reminders/ :id
Bridges (read-only)
GET /List connected accountsapi/ bridges GET /Available platformsapi/ bridges/ configured GET /Health and connection statusapi/ bridges/ dashboard GET /Visible non-archived conversation counts, matching GET /api/roomsapi/ bridges/ chat-counts
For the full schema (request and response shapes, error envelopes, date formats), parse /openapi.yaml with your tool of choice: Postman, Insomnia, Bruno, or any OpenAPI-compatible client.