Sense6
Developers

Sense6 API

Read and act on mail, tasks, contacts, calendar, docs and chat from your own code, Zapier or another AI app. Every request acts as the person whose token it uses, with exactly their access.

  1. In Sense6, open Settings → API tokens and create a token. Choose read only if the app only needs to look.
  2. Send it with every request as a bearer token:
curl -H "Authorization: Bearer $SENSE6_TOKEN" https://sense6.io/api/v1/me

Base URL: https://sense6.io/api/v1 · OpenAPI 3.1

Authentication

Tokens start with s6_ and are shown once, when you make them. A full-access token can do what its owner can: send email, create and change things. A read-only token can only look; changes answer 403 read_only_token. Revoke a token in Settings and every app using it loses access at once, along with its webhooks.

Sense6 stores only a hash of each token. Changes made through the API are recorded in the workspace's audit log as done through the API.

Responses and errors

Everything is JSON. One item comes back as { data }; lists as { data, next_cursor }. To get the next page, send next_cursor back as ?cursor= until it's null.

Each token can make 300 requests a minute. Every response says how many are left in X-RateLimit-Remaining; past the limit you get 429 with Retry-After.

400invalid_requestSomething in the request isn't right; the message says what.
401unauthorizedNo token, or it was revoked.
403read_only_token / forbiddenThe token is read-only, or its owner can't do that.
404not_foundIt doesn't exist, or its owner can't open it.
409conflictIt changed since you read it.
415unsupported_media_typeSend JSON with Content-Type: application/json.
429rate_limitedToo many requests; wait Retry-After seconds.
503ai_unavailableSense6's AI can't answer right now.
{ "error": { "code": "not_found", "message": "Task not found." } }

Account

Who the token acts for.

GET/api/v1/me

Who the token acts for

Returns: Me

curl -H "Authorization: Bearer $SENSE6_TOKEN" \
  "https://sense6.io/api/v1/me"

Mail

Read, send and sort email in the token owner's mailbox.

GET/api/v1/messages

List email

Newest first. Reading the list doesn't mark anything read.

Query
folderstringWhich folder (default inbox). One of: inbox, sent, drafts, archive, deleted, junk, snoozed.
bucketstringOnly what Sense6 sorted this way. One of: needs_you, fyi, done, untriaged.
qstringWords to look for.
unreadbooleanOnly unread email.
sincedate-timeOnly email that arrived after this.
limitintegerHow many to return (default 50, at most 200).
cursorstringnext_cursor from the previous page.

Returns: a page of Message

curl -H "Authorization: Bearer $SENSE6_TOKEN" \
  "https://sense6.io/api/v1/messages"
GET/api/v1/messages/{id}

Get an email

Path
idrequiredstringThe item's id.
Query
includestringhtml adds the HTML body. One of: html.

Returns: Message

curl -H "Authorization: Bearer $SENSE6_TOKEN" \
  "https://sense6.io/api/v1/messages/abc123"
POST/api/v1/messagesFull-access token

Send an email

Sent from the token owner's address, like email written in Sense6. With draft: true it's saved in Drafts instead.

Body (JSON)
torequiredstring[]Recipients.
ccstring[]Copied.
bccstring[]Blind copies.
subjectstringThe subject.
textstringThe message, as plain text.
htmlstringThe message as HTML (the text is made from it).
reply_to_idstringA message this replies to (it joins that conversation).
draftbooleanSave it in Drafts instead of sending.

Returns: SentMessage

curl -X POST -H "Authorization: Bearer $SENSE6_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"to":["[email protected]"],"subject":"Proposal","text":"Hi Dana, here'\''s the proposal."}' \
  https://sense6.io/api/v1/messages
PATCH/api/v1/messages/{id}Full-access token

Mark, move or sort an email

Path
idrequiredstringThe item's id.
Body (JSON)
readbooleanMark it read or unread.
folderstringMove it. One of: inbox, archive, deleted.
bucketstringSort it. One of: needs_you, fyi, done.

Returns: Message

curl -X PATCH -H "Authorization: Bearer $SENSE6_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{}' \
  https://sense6.io/api/v1/messages/abc123

Tasks

Tasks assigned to you, ones you gave others, and finished ones.

GET/api/v1/tasks

List tasks

Query
filterstringmine: assigned to you (default); assigned: ones you gave others; all: every open task you can see. One of: mine, assigned, all.
statusstringopen (default) or done. One of: open, done.
qstringOnly tasks with these words in the title or notes.
limitintegerHow many to return (default 50, at most 200).
cursorstringnext_cursor from the previous page.

Returns: a page of Task

curl -H "Authorization: Bearer $SENSE6_TOKEN" \
  "https://sense6.io/api/v1/tasks"
GET/api/v1/tasks/{id}

Get a task

Path
idrequiredstringThe item's id.

Returns: Task

curl -H "Authorization: Bearer $SENSE6_TOKEN" \
  "https://sense6.io/api/v1/tasks/abc123"
POST/api/v1/tasksFull-access token

Create a task

Body (JSON)
titlerequiredstringWhat to do.
notesstringDetails.
duedateThe day it's due.
assignee_emailstringSomeone in your workspace to give it to (default: you).

Returns: Task

curl -X POST -H "Authorization: Bearer $SENSE6_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"title":"Send the signed lease","due":"2026-10-01"}' \
  https://sense6.io/api/v1/tasks
PATCH/api/v1/tasks/{id}Full-access token

Change or finish a task

Path
idrequiredstringThe item's id.
Body (JSON)
titlestringWhat to do.
notesstringDetails.
duedateThe day it's due (null clears it).
assignee_emailstringGive it to someone else in your workspace.
statusstringdone or open. One of: open, done.

Returns: Task

curl -X PATCH -H "Authorization: Bearer $SENSE6_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{}' \
  https://sense6.io/api/v1/tasks/abc123
DELETE/api/v1/tasks/{id}Full-access token

Delete a task

Path
idrequiredstringThe item's id.

Returns: 204 No Content

curl -X DELETE -H "Authorization: Bearer $SENSE6_TOKEN" \
  https://sense6.io/api/v1/tasks/abc123

Contacts

Your contacts, including the ones synced from connected accounts.

GET/api/v1/contacts

List contacts

Query
qstringName, email, phone, company or tag.
tagstringOnly contacts with this tag.
limitintegerHow many to return (default 50, at most 200).
cursorstringnext_cursor from the previous page.

Returns: a page of Contact

curl -H "Authorization: Bearer $SENSE6_TOKEN" \
  "https://sense6.io/api/v1/contacts"
GET/api/v1/contacts/{id}

Get a contact (with recent activity)

Path
idrequiredstringThe item's id.

Returns: Contact

curl -H "Authorization: Bearer $SENSE6_TOKEN" \
  "https://sense6.io/api/v1/contacts/abc123"
POST/api/v1/contactsFull-access token

Add a contact

With an email address you already have, the details are added to that person (merged: true in the response).

Body (JSON)
namestringTheir name.
emailstringAn email address (or emails: a list).
phonestringA phone number (or phones: a list).
companystringCompany.
job_titlestringJob title.
notesstringNotes.
tagsstring[]Tags.
starredbooleanStar them.

Returns: Contact

curl -X POST -H "Authorization: Bearer $SENSE6_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"Dana Kim","email":"[email protected]"}' \
  https://sense6.io/api/v1/contacts
PATCH/api/v1/contacts/{id}Full-access token

Change a contact

Send only the fields to change (the same ones as when adding). Synced contacts only take notes, tags and the star.

Path
idrequiredstringThe item's id.

Returns: Contact

curl -X PATCH -H "Authorization: Bearer $SENSE6_TOKEN" \
  https://sense6.io/api/v1/contacts/abc123
DELETE/api/v1/contacts/{id}Full-access token

Delete a contact

Path
idrequiredstringThe item's id.

Returns: 204 No Content

curl -X DELETE -H "Authorization: Bearer $SENSE6_TOKEN" \
  https://sense6.io/api/v1/contacts/abc123

Calendar

Meetings and events from Sense6 and connected calendars, with their notes.

GET/api/v1/events

List meetings and events

Query
fromdate-timeStart of the range (default now).
todate-timeEnd of the range (default 30 days after from).
limitintegerHow many to return (default 50, at most 200).
cursorstringnext_cursor from the previous page.

Returns: a page of Event

curl -H "Authorization: Bearer $SENSE6_TOKEN" \
  "https://sense6.io/api/v1/events"
GET/api/v1/events/{id}

Get an event with its notes and transcript

Path
idrequiredstringThe item's id.

Returns: Event

curl -H "Authorization: Bearer $SENSE6_TOKEN" \
  "https://sense6.io/api/v1/events/abc123"
POST/api/v1/eventsFull-access token

Create a meeting

People in the workspace are added to it. With send_invites (the default when there are attendees), calendar invitations go out from the owner's connected Microsoft 365 or Google calendar.

Body (JSON)
titlestringIts title.
startrequireddate-timeWhen it starts.
endrequireddate-timeWhen it ends.
attendeesstring[]Email addresses to invite.
locationstringWhere.
descriptionstringThe agenda.
send_invitesbooleanSend calendar invitations.
online_meetingbooleanAdd a Teams or Meet link to the invitation.

Returns: Event

curl -X POST -H "Authorization: Bearer $SENSE6_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"title":"Kickoff","start":"2026-10-01T15:00:00Z","end":"2026-10-01T15:30:00Z"}' \
  https://sense6.io/api/v1/events
DELETE/api/v1/events/{id}Full-access token

Delete an event

It's deleted from the calendar it came from too; upcoming ones are cancelled for the guests. Events on someone else's calendar are only hidden for you.

Path
idrequiredstringThe item's id.

Returns: Event

curl -X DELETE -H "Authorization: Bearer $SENSE6_TOKEN" \
  https://sense6.io/api/v1/events/abc123

Docs

Documents you can open, and new ones from Markdown.

GET/api/v1/docs

List documents

Query
wikibooleanOnly the workspace wiki.
limitintegerHow many to return (default 50, at most 200).
cursorstringnext_cursor from the previous page.

Returns: a page of Doc

curl -H "Authorization: Bearer $SENSE6_TOKEN" \
  "https://sense6.io/api/v1/docs"
GET/api/v1/docs/{id}

Get a document with its text

Path
idrequiredstringThe item's id.

Returns: Doc

curl -H "Authorization: Bearer $SENSE6_TOKEN" \
  "https://sense6.io/api/v1/docs/abc123"
POST/api/v1/docsFull-access token

Create a document

Body (JSON)
titlestringIts title.
textstringIts content, as Markdown.
wikibooleanPut it in the workspace wiki (everyone can read it).

Returns: Doc

curl -X POST -H "Authorization: Bearer $SENSE6_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"title":"Meeting notes","text":"# Notes\n\n- Ship Friday"}' \
  https://sense6.io/api/v1/docs

Chat

Channels and direct messages.

GET/api/v1/channels

List channels

Query
limitintegerHow many to return (default 50, at most 200).
cursorstringnext_cursor from the previous page.

Returns: a page of Channel

curl -H "Authorization: Bearer $SENSE6_TOKEN" \
  "https://sense6.io/api/v1/channels"
GET/api/v1/channels/{id}/messages

Latest messages in a channel

Path
idrequiredstringThe item's id.
Query
limitintegerHow many (default 50, at most 200).

Returns: a page of ChatMessage

curl -H "Authorization: Bearer $SENSE6_TOKEN" \
  "https://sense6.io/api/v1/channels/ch_123/messages"
POST/api/v1/channels/{id}/messagesFull-access token

Post a message

Path
idrequiredstringThe item's id.
Body (JSON)
textrequiredstringWhat to say.
parent_idstringReply in this message's thread.

Returns: ChatMessage

curl -X POST -H "Authorization: Bearer $SENSE6_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"text":"Deploy is done ✅"}' \
  https://sense6.io/api/v1/channels/ch_123/messages

Pipeline

Deals in the workspace's sales pipeline.

GET/api/v1/deals

List deals

Query
stagestringOnly deals in this stage (its id).
qstringWords in the name, company, people or next step.
emailstringOnly deals with this person.
minebooleanOnly deals you own.
limitintegerHow many to return (default 50, at most 200).
cursorstringnext_cursor from the previous page.

Returns: a page of Deal

curl -H "Authorization: Bearer $SENSE6_TOKEN" \
  "https://sense6.io/api/v1/deals"
GET/api/v1/deals/{id}

Get a deal

Path
idrequiredstringThe item's id.

Returns: Deal

curl -H "Authorization: Bearer $SENSE6_TOKEN" \
  "https://sense6.io/api/v1/deals/abc123"
POST/api/v1/dealsFull-access token

Add a deal

Shared with the workspace unless private.

Body (JSON)
titlerequiredstringIts name.
valueintegerIts value, in cents.
currencystringThree-letter code (default USD).
stagestringA stage id (default: the first open stage).
companystringThe company.
peoplestring[]Email addresses of the people involved.
owner_idstringWho owns it (default: you).
close_datedateExpected close date.
next_stepstringThe next step.
notesstringNotes.
privatebooleanOnly you and the owner see it.

Returns: Deal

curl -X POST -H "Authorization: Bearer $SENSE6_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"title":"123 Main St listing","value":45000000,"people":["[email protected]"]}' \
  https://sense6.io/api/v1/deals
PATCH/api/v1/deals/{id}Full-access token

Move or change a deal

Send only what changes (the same fields as when adding, plus lost_reason). Changing stage fires deal.stage_changed (and deal.won or deal.lost).

Path
idrequiredstringThe item's id.

Returns: Deal

curl -X PATCH -H "Authorization: Bearer $SENSE6_TOKEN" \
  https://sense6.io/api/v1/deals/abc123
DELETE/api/v1/deals/{id}Full-access token

Delete a deal

Path
idrequiredstringThe item's id.

Returns: 204 No Content

curl -X DELETE -H "Authorization: Bearer $SENSE6_TOKEN" \
  https://sense6.io/api/v1/deals/abc123

Webhooks

Get a signed POST when something happens (how Zapier triggers work).

GET/api/v1/hooks

List this token's webhooks

Returns: a page of Hook

curl -H "Authorization: Bearer $SENSE6_TOKEN" \
  "https://sense6.io/api/v1/hooks"
POST/api/v1/hooks

Subscribe to events

Works with read-only tokens too: a subscription only hears about what the token's owner can see.

Body (JSON)
urlrequiredstringAn https URL to POST events to.
eventsrequiredstring[]Events to hear (see the list below).

Returns: Hook

curl -X POST -H "Authorization: Bearer $SENSE6_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com/sense6","events":["task.created"]}' \
  https://sense6.io/api/v1/hooks
DELETE/api/v1/hooks/{id}

Unsubscribe

Path
idrequiredstringThe item's id.

Returns: 204 No Content

curl -X DELETE -H "Authorization: Bearer $SENSE6_TOKEN" \
  https://sense6.io/api/v1/hooks/abc123

Objects

Me

The person a token acts for.

Fields
idstringTheir user id.
namestringTheir name.
emailstringTheir email address.
rolestringmember, admin or guest.
time_zonestringIANA time zone, like America/New_York.
workspaceobjectThe workspace: { id, name }.
tokenobjectThis token: { scope: "read" | "write" }.

Message

An email.

Fields
idstringThe message id.
thread_idstringThe conversation it belongs to.
folderstringinbox, sent, drafts, archive, deleted or junk.
subjectstringThe subject line.
fromobject{ name, email }.
toobject[]Recipients: [{ name, email }].
ccobject[]Copied: [{ name, email }].
received_atdate-timeWhen it arrived (or was sent).
is_readbooleanWhether it's been read.
bucketstringHow Sense6 sorted it: needs_you, fyi or done. Can be null.
snippetstringThe start of the text.
has_attachmentsbooleanWhether it has files attached.
attachmentsobject[][{ name, content_type, size }].
textstringThe full text (one message only).
htmlstringThe HTML body, with ?include=html (one message only). Can be null.
urlstringOpens it in Sense6.

SentMessage

What happened to an email you sent.

Fields
idstringThe sent message (or the draft).
statusstringsent, draft or failed (an outside address didn't accept it).
deliverystringHow outside delivery went. Can be null.
externalstring[]Recipients outside the workspace.

Task

A task.

Fields
idstringThe task id.
titlestringWhat to do.
notesstringDetails.
statusstringopen or done.
duedateThe day it's due. Can be null.
assigneeobject{ id, name } of who it's for. Can be null.
created_byobject{ id, name } of who made it. Can be null.
created_atdate-timeWhen it was made.
completed_atdate-timeWhen it was finished. Can be null.
urlstringOpens it in Sense6.

Contact

A person in your contacts.

Fields
idstringThe contact id.
namestringTheir name.
emailsobject[][{ address, label }].
phonesobject[][{ number, label }].
companystringCompany.
job_titlestringJob title.
addressesstring[]Postal addresses.
websitesstring[]Websites.
birthdaystringBirthday. Can be null.
notesstringYour notes.
tagsstring[]Your tags.
starredbooleanStarred.
sourcesstring[]Where it comes from: sense6, google, m365, icloud…
editablebooleanAll fields can be changed (false: synced, only notes, tags and the star).
colleaguebooleanSomeone in your workspace.
urlstringOpens it in Sense6.

Event

A meeting or calendar event.

Fields
idstringThe event id.
titlestringIts title.
startdate-timeWhen it starts.
enddate-timeWhen it ends.
all_daybooleanAn all-day event.
locationstringWhere.
join_urlstringThe video call link. Can be null.
sourcestringsense6, or calendar (from a connected calendar).
organizerobject{ name, email }. Can be null.
attendeesobject[][{ name, email, response, guest }].
descriptionstringAgenda or description.
has_notesbooleanSense6 wrote notes for it.
notesobject{ summary, decisions, action_items } (one event only). Can be null.
transcriptstringThe transcript (one event only). Can be null.
urlstringOpens it in Sense6.

Doc

A document.

Fields
idstringThe document id.
titlestringIts title.
wikibooleanIn the workspace wiki.
created_atdate-timeWhen it was made.
updated_atdate-timeWhen it last changed.
textstringIts text, as Markdown (one document only).
urlstringOpens it in Sense6.

Channel

A chat channel or direct message.

Fields
idstringThe channel id.
kindstringchannel or dm.
visibilitystringpublic or private.
namestringIts name.
titlestringHow it's shown: #name, or the people in a direct message.
topicstringIts topic.
unreadintegerMessages you haven't read.
last_message_atdate-timeThe latest message. Can be null.
urlstringOpens it in Sense6.

ChatMessage

A chat message.

Fields
idstringThe message id.
channel_idstringIts channel.
textstringWhat it says.
authorobject{ id, name }.
sent_atdate-timeWhen it was posted.
edited_atdate-timeWhen it was last edited. Can be null.
parent_idstringThe thread it replies to. Can be null.
reply_countintegerReplies in its thread.
reactionsobjectEmoji → the ids of who reacted.

Deal

A deal in the pipeline.

Fields
idstringThe deal id.
titlestringIts name.
stageobject{ id, name, kind (open, won or lost), probability }.
valueintegerIts value, in cents.
currencystringThree-letter currency code.
companystringThe company.
peoplestring[]Email addresses of the people involved.
ownerobject{ id, name }.
close_datedateExpected close date. Can be null.
next_stepstringThe next step.
notesstringNotes.
privatebooleanOnly its creator and owner see it.
lost_reasonstringWhy it was lost. Can be null.
suggestionobjectWhat Sense6 suggests from recent email and meetings: { stage, next_step, close_date, summary }. Can be null.
stage_changed_atdate-timeWhen it last changed stage.
closed_atdate-timeWhen it was won or lost. Can be null.
created_atdate-timeWhen it was added.
updated_atdate-timeWhen it last changed.
urlstringOpens it in Sense6.

SearchHit

Something search found.

Fields
idstringThe item's id.
kindstringmessage, document, sheet, meeting, task, person or file.
titlestringIts title.
snippetstringWhere the words were found.
urlstringOpens it in Sense6. Can be null.

Answer

Sense6's answer.

Fields
answerstringThe answer, as Markdown.
linksobject[]What it used or made: [{ label, href }].
approvals_waitingintegerActions waiting for the person's approval in Sense6.

Hook

A webhook subscription.

Fields
idstringThe subscription id.
urlstringWhere events are sent.
eventsstring[]The events it hears.
created_atdate-timeWhen it was made.
secretstringThe signing secret (only when it's made).

Webhook events

Subscribe with POST /api/v1/hooks. Sense6 then POSTs each event to your URL as JSON, and only tells you about what the token's owner can see. A delivery that fails is retried with backoff, up to 8 times over about a day. Workspace admins can also send every event in the workspace to an endpoint from Admin → Webhooks.

mail.receivedMail arrived in someone's inbox
mail.sentSomeone sent mail
task.createdA task was created
task.completedA task was completed
meeting.createdA meeting was created
meeting.notes_readyMeeting notes were generated
doc.createdA document was created
approval.requestedAn agent action is waiting for approval
chat.messageA chat message was posted
member.joinedSomeone joined the workspace
form.responseSomeone answered a form
booking.createdSomeone booked a time through a booking link
contact.createdSomeone added a contact
deal.createdA deal was added to the pipeline
deal.stage_changedA deal moved to another stage
deal.wonA deal was won
deal.lostA deal was lost

Each delivery looks like this. data holds the event's details and the item's id: fetch the item from the API for everything else.

{
  "id": "evt_3f2a…",
  "event": "task.created",
  "createdAt": "2026-10-01T15:04:05.000Z",
  "workspace": "tenant_…",
  "data": {
    "id": "task_…",
    "title": "Send the signed lease",
    "assigneeId": "user_…",
    "due": "2026-10-03",
    "createdBy": "user_…"
  }
}

Headers: X-Sense6-Event, X-Sense6-Delivery, X-Sense6-Timestamp and X-Sense6-Signature. Check the signature with the secret you got when subscribing:

import { createHmac, timingSafeEqual } from "node:crypto";

// rawBody: the request body exactly as received (before JSON.parse).
export function isFromSense6(headers, rawBody, secret) {
  const ts = headers["x-sense6-timestamp"];
  const sig = headers["x-sense6-signature"] ?? "";
  if (Math.abs(Date.now() / 1000 - Number(ts)) > 300) return false; // older than 5 minutes
  const expected = "sha256=" + createHmac("sha256", secret).update(`${ts}.${rawBody}`).digest("hex");
  return sig.length === expected.length && timingSafeEqual(Buffer.from(sig), Buffer.from(expected));
}

Zapier

Connect Sense6 to thousands of apps without code. Triggers: new email, new or finished task, new meeting, meeting notes ready, new document, new contact, new deal or deal stage change, new chat message and new form response. Actions: send an email, create a task, contact, meeting, deal or document, update a deal, post in chat, and ask Sense6.

The Sense6 app for Zapier is on its way. Until then, use Zapier's Webhooks and API request steps with a token.

MCP

AI apps that speak the Model Context Protocol (Claude, ChatGPT, Cursor and others) can use Sense6's tools directly, with the same tokens. Anything they would send or post waits for approval in Sense6.

{
  "mcpServers": {
    "sense6": {
      "url": "https://sense6.io/api/mcp",
      "headers": {
        "Authorization": "Bearer s6_…"
      }
    }
  }
}

Trust center · Terms of service