Skip to main content
Every delivery uses the envelope; this page documents data for each object. Updates carry changes, an object keyed by field with the old and new value:
Bookkeeping columns (updated_at, activity counters such as a contact’s submission_count, a deal’s board position) never count as a change on their own. external_ids on contacts, companies and deals holds the record’s id in other systems, one key per system ({ "hubspot": "301", "halo": "u_8812" }), as external_id + external_source set them through the API: an app that links records this way finds its own record straight from the event. custom_fields carries each value in its field type’s shape (a list for multi-select, a member’s user ID for a teammate field, an ISO 8601 UTC instant for a date-time; see Custom fields). Changing a field’s type in a way that rewrites stored values (Dropdown to Multi-select and back) sends an *.updated event for every record that held a value. To subscribe with an API key or an OAuth app, the credential needs webhooks:write plus the object’s read scope listed with each group. Signed-in members creating webhooks in the dashboard are not scoped.

Submissions

Scope: submissions:read. The only events a webhook’s form_id filter applies to.
The submitter’s IP address is never sent.

Contacts

Scope: contacts:read
A contact can be linked to several companies; contact.company_id is its primary company. A contact.association_changed delivery:
Label keys never change (labels are renamed, never re-keyed); GET /api/v1/association-labels lists them. Linking a contact’s first company sends added (is_primary: false) and then updated (it became the primary), in that order; removing the primary sends removed, then updated for the company that took over. A contact or deal created with a company sends no association event for it: contact.created / deal.created already carry company_id. A contact.job_changed delivery:

Companies

Scope: companies:read
A company.merged delivery:

Deals

Scope: deals:read To count closed-won deals, subscribe to deal.won (and deal.reopened) rather than deal.updated: you receive one delivery per win instead of every edit, and deal.closed_at is the moment it closed. GET /api/v1/deals?status=won&closed_after=... lists the same deals for a backfill or a reconciliation. A deal.won delivery (the deal.stage_changed and deal.updated sent for the same move carry the same deal and changes):
The contacts linked to a deal are not embedded; fetch them with GET /api/v1/deals/:id.

Products

Scope: deals:read

Quotes

Scope: deals:read data is { quote_id, quote }, plus changes on quote.updated. quote is the stored quote: number (shown as Q-1001), deal_id, title, status (draft, open, accepted or void; an open quote past expires_at can no longer be accepted), currency, items (a copy of the deal’s line items when the quote was made), subtotal, discount_total, total, terms, expires_at, recipient and sender ({ name, email, company }), include_payment_link, payment_link_url, published_at, first_viewed_at, last_viewed_at, view_count, accepted_at, accepted_name, accepted_email, voided_at. The page’s link itself is never sent in a webhook.

Tasks

Scope: tasks:read
task_type is call, email, todo or a workspace’s own custom_* key (task types). A repeating task has repeat_unit (day, week, month), repeat_interval and repeat_time_zone; completing it sends task.completed for it and task.created for the next one. callback_call_id is the dialer call whose “Call back” outcome created the task. reminder_minutes reminds the assignee that many minutes before due_at (0 at the due time, null none), and remind_at is when. The payload also carries repeat_anchor_at, the date the series counts from. repeat_anchor_at and remind_at move with due_at and reminder_minutes, so they never appear in changes on their own.

Meetings

Scope: meetings:read

Calls

Scope: dialer:read
call.completed carries call only. The recording URL and the transcript text are never sent in a webhook; use GET /api/v1/dialer/calls/:id/recording and GET /api/v1/dialer/calls/:id/insights.

Comments

Scope: notes:read Comments are threads under notes and logged activities (calls, emails, meetings and messages). A comment mentions a member with a token in its text, @[Sam Lee](user:<user id>); mentioned_user_ids lists the members it mentions.
contact_id, company_id and deal_id are the records the comment’s note or activity is on when the event happened (null on comment.deleted when the note or activity was deleted with it). Read a thread with GET /api/v1/comments?note_id= or ?activity_id=.

Lists

Scope: crm:read Static lists hold contacts or companies that people, imports, the API or workflows put in them. The envelope’s object is list and object_id the list; data names the list and carries the record, with the same fields as the contact and company events.
A list of companies sends record_type: "company" with company_id and company instead.

Inbox conversations

Scope: emails:read A conversation is an email thread with a contact in the team Inbox: the 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 a member (or nobody) and is open or closed. reason says who made the change: manual (a member, the API or MCP; the envelope’s actor names them), reply (a new email from the contact reopened it) or round_robin (the team inbox address handed a new conversation to the next member).
channel is shared for mail that arrived on the team inbox address (mailbox_user_id is then null) and personal for a member’s own mail. Read the messages with GET /api/v1/conversations/:id. Next: Webhook Security →