Skip to main content
Every heyBTW tool returns the same envelope. Learn it once and every tool reads the same way. The words on this page are the words on the wire. The docs never use synonyms for them.

The envelope

The sample above is trimmed from a real list_events response.

Partial is an answer

status: partial means heyBTW served what it could and named the rest. A gap with retryable: false will not change on retry. Report the answer, then say what is missing using the gap’s own words. Never treat a missing fact as zero.

The facts vocabulary

Newer tools open data[0] with a facts list and close it with carry and next. Read them in that order. Join keys everywhere: a person by email, a company by company_domain.

crm_context

Every tool that depends on a CRM puts crm_context first. When capability_served is false, the CRM-derived numbers in that response are null with a gap. Use the CRM connector in your client for those questions, joined on email and company_domain. Never put a number of your own under heyBTW’s name.
On CRM-dependent tools, crm_context appears at the top level and again inside data[0]. They are the same block.

Writes: preview, confirm, replay

Write tools share three conventions.
  • Preview first. Tools that import or change many records (record_signups, import_people, save_target_spec, activate_list, the partner invite) return a preview and save nothing. The preview carries a preview_token or import_token, valid for 15 minutes. Confirm by token. Never send the rows again.
  • client_request_id. Every write takes a fresh hyphenated UUID you generate. Retrying with the same id after a timeout replays the first answer (idempotent_replay: true) and never repeats the write. Reusing an id for a different write is refused.
  • Say what it did. Write responses report what changed per row (row_outcomes, counts) and what heyBTW did not do (no sends, no enrichment, no platform writes).

Event tense and the event clock

Event tools say where an event sits on the calendar, read in the collab’s own time zone. Read these as served. Never compute them from dates.

Contract versions

Every tool accepts contract_version. Omit it to get v1, the default. A few reads also serve v2: get_event_details filters, and an opaque event_id on some tools. A version a tool does not serve is refused with invalid_parameter, never silently downgraded. Build on v1 unless a reference page says otherwise.