Skip to main content
The same one-to-one email as the composer on a contact’s page: each email goes out from the sending address of the person the credential acts as (the key’s creator, or the person who authorized the app), through your workspace’s verified sending domain, with an unsubscribe link added. The API never sends from the person’s connected Gmail or Outlook mailbox.

Scopes

Endpoints

List Emails

Query parameters: page, per_page (max 100), contact_id, to_email, sent_by (a team member’s user ID), status, since and until (ISO 8601, on the sent time). status is one of queued (being sent), sent, delivered, opened, replied, bounced, complained or failed (the email provider refused it). Emails scheduled from the composer can also be scheduled (waiting for scheduled_at), cancelled (cancelled before they went) or not_sent (stopped at send time; failure_reason says why). While an email waits, sent_at is the time it is due to go. If the person’s record access is limited to their own or their team’s contacts, pass contact_id: they can list the emails sent to a contact they can see, one contact at a time. The person’s email access applies too (Settings → Members → Record access → Emails). With Their team’s or Only theirs, the list holds their own emails and those sent by the people their scope covers; a teammate who keeps their email private is listed only for the emails the person is on. An email they can’t see answers 404 by id.
GET /v1/contact-emails/{id} returns the same fields plus body_html and body_markdown.

Send an Email

POST /v1/contact-emails
Answers 201 with { "data": { "id", "contact_id", "to_email", "status": "sent", "replayed": false } }, or 200 with "replayed": true for a repeated idempotency_key. Sending is refused when:
  • the contact isn’t one the person’s record access shows (404), or it is in Recently deleted;
  • the contact unsubscribed, bounced, reported spam or is blocked, or is marked unsubscribed (409 suppressed);
  • the person’s access to companies or deals is limited and the email uses company or deal merge fields (403): send it from the contact page instead;
  • the workspace has no verified sending domain, or the sender’s address can’t be used (409, with the reason as error);
  • the workspace’s subscription has ended or sending isn’t on its plan (403);
  • a sending cap is reached (429, with Retry-After). The caps are shared with the contact page: 20 emails a minute and 100 an hour per person, and 300 an hour per workspace.
Viewers can’t send. Each email reaches someone outside your workspace and can’t be unsent.

Inbox Conversations

A conversation is an email thread with a contact in the team Inbox: mail forwarded or synced from members’ mailboxes, mail to the workspace’s team inbox address, emails sent from Orbit and the replies to them. Each is assigned to one member (or nobody) and is open or closed. A member’s own mail starts assigned to them; mail to the team inbox address starts unassigned, or with the next member when the workspace uses round robin. A new reply from the contact reopens a closed conversation (automatic replies such as out-of-office notes don’t). GET /v1/conversations query parameters: page, per_page (max 100), status (open or closed), assigned_to (me, unassigned, any or a member’s user ID), contact_id, channel (personal or shared, the team inbox address). A person sees their own conversations (their mailbox’s, and those assigned to them) and the team inbox address’s, never a teammate’s own mailbox; a person whose record access is limited sees only those with contacts they can see. The messages inside follow the person’s email access (see Emails).
GET /v1/conversations/{id} adds messages (oldest first: id, kind (activity for mail captured from a mailbox or the team address, contact_email for mail sent from Orbit), direction, subject, from, to, cc, occurred_at, status, contact_id, member_user_id, body_text, body_html) and history (newest first: kind assigned, unassigned, closed or reopened, actor_user_id, from_user_id, to_user_id, reason manual, reply or round_robin, created_at). PATCH /v1/conversations/{id} takes { "assigned_to": "<member id>" | "me" | null, "status": "open" | "closed" } (either or both) and answers with the conversation. The new assignee is notified. It is refused when:
  • the assignee isn’t a member who can reply (viewers can’t be assigned) (422 invalid_assignee);
  • the assignee’s record access doesn’t include the conversation’s contact (422 assignee_cannot_see_contact): assigning never widens what someone can see;
  • the person the credential acts as is a viewer (403), or can’t see the conversation (404).
Conversation changes are also webhook events.

MCP tools

The same operations as MCP tools

Rate Limits

API rate limit details