ioZen Docs

Changelog

API changes and updates.

2026-10-27

Cases include tags, contacts, and records

  • Case pages and the card.phase_changed and card.assigned webhooks now include description, tags, comment_count, and linked contacts and records.
  • A key with read:cases gets the link ids. Contact details need read:contacts. Record values need read:records. Case webhooks always include both.
  • updated_after also matches tag changes and edits to a linked record or contact.
  • Contact phone is null when WhatsApp hides the number.
  • Adding a tag does not send a webhook. Tag the case before you move it, or read the tag from the API.
  • See Export a Process Board.

Process Boards, contacts, and records

  • GET /process-boards and GET /process-boards/{id}/cards read Process Boards and cases with the read:cases scope. Case pages include phase history, assignment history, and the amount as a decimal string.
  • GET /contacts and GET /contacts/{id} read contacts with read:contacts.
  • GET /record-types and GET /record-types/{id}/records read Record Types and records with read:records.
  • See Export a Process Board to page a board into a CSV file.

Contact and ad click IDs on submissions

  • Submission list and detail now return contact_id and contact_phone. The phone is the contact's number in E.164. It is null when there is no contact, no phone, or WhatsApp hides the number.
  • attribution now includes ctwa_clid, gad_campaignid, and gad_source. First-touch attribution includes gad_campaignid and gad_source. Like the rest of attribution, they are null on plans without marketing attribution.
  • List submissions with is_test=true or is_test=false. Omit is_test to return every submission for the Intake Bot.

First reply and waiting time

  • Submission list and detail, case pages, and the card.phase_changed and card.assigned webhooks now return first_human_reply_at and awaiting_reply_since. Both track the WhatsApp conversation.
  • first_human_reply_at is when a person on your team first replied to the customer, from the inbox or the WhatsApp Business app. Bot messages do not count. It is set once and never changes. Null until that reply, and when there is no WhatsApp conversation.
  • awaiting_reply_since is when the customer started waiting for a person, counted from the first unanswered message. Null while the bot is handling the conversation, after a person replies, when the conversation goes back to the bot or is marked as attended, and when there is no WhatsApp conversation.
  • On a case, both come from the conversations of its linked submissions: the earliest first reply and the longest current wait.
  • The submission CSV export adds the matching columns First human reply at and Waiting since.

Case webhooks

  • New webhook events card.phase_changed and card.assigned: one signed delivery each time a case moves to another phase or its owners change, manually or by an assignment rule. Payloads include the case, the phases or owners involved, the actor and occurred_at.
  • Intake Bot filters apply to case events through the case's origin bot (the bot of its earliest linked submission). Cases created by hand reach only endpoints without a filter. Test cases never send case events.
  • contact.created now fires for every new contact: web forms, WhatsApp conversations, inbox Create contact, marketing opt-in, API sends and manual creation. CSV import still does not send it.

2026-10-14

Clearer credit breakdown and complete WhatsApp delivery records

  • WhatsApp messages read the moment they arrive record Meta's delivery pricing like every other delivered message, so a Meta fee applies when Meta bills it. A sent message whose only receipt is the read one still carries its message fee once.
  • The credits breakdown in Settings → Usage names the billing period, counts AI conversation in AI turns rather than settlement batches, and shows how much of WhatsApp is Meta fees. Prices are unchanged.

Conversation billing for every workspace

  • Intake Bot conversations on the web and WhatsApp are billed per visitor message processed with AI: from 0.5 credits per message, whatever the number of model calls behind it. Messages handled without AI are free.
  • Charges settle in batches and appear as AI conversation in Settings → Usage and in each submission's Credits tab. Test submissions keep per-call pricing.

2026-10-13

WhatsApp fee for bot buttons and lists

  • Bot messages sent with buttons or a list carry the same WhatsApp message fee as every other sent message. Messages sent before this change are not charged retroactively.

Submission credits match Recent operations

  • A submission's Credits tab lists credits by line with the same labels as Settings → Usage: AI conversation, AI content blocks, AI processing, WhatsApp and integration actions. Each line adds up to that submission's rows in Recent operations.
  • Recent operations show the submission behind each charge, with test submissions marked. The Credits tab links to Usage filtered to that submission.
  • Pricing is unchanged.

Case pricing and live usage history

  • The case Credits tab shows AI turn counts and per-message pricing only for workspaces billed per AI turn, using the workspace minimum charge. Counts read correctly in the singular.
  • Usage history, its operation total and recent operations refresh when workspace credit updates arrive, so new charges appear once without reloading the page.

Complete AI cost attribution for cases

  • New AI-generated content blocks, document extraction, calculations, routing and post-completion intelligence carry verified case ownership, so case credits include these ordinary AI charges alongside conversation turns.
  • Public case attribution verifies the bot, workspace and visitor session. Billing rates and settlement behavior are unchanged.

2026-10-10

Credits for each case

  • Case details show charged credits, credits awaiting settlement, and AI turn counts, with costs attributed to AI conversation turns, WhatsApp bridge and Meta delivery fees, and integration tools.
  • Open case totals refresh when workspace credit updates arrive, including after settlement. Compact case tabs keep every section accessible in the detail panel.
  • Earlier channel costs that cannot be attributed to a case are marked as incomplete. Billing usage and recent operations count each settled conversation charge once.
  • AI processing, from 0.5 credits per message. Conversation billing remains limited to selected workspaces during staged rollout.

2026-03-10

Content Blocks & Template Variables

  • Content blocks in intake bot schema — The GET /intake-bots/:id response now includes content block items alongside question fields in schema.fields. Content blocks have kind: "content" and do not accept user input; they display content between questions during the intake flow. See the Schema Items guide for how to handle both item types.
  • Template variables — Question labels, helper text, and content block bodies can contain {{field_name}} references that resolve to the respondent's previous answers at runtime. When reading a schema via the API, these placeholders appear as-is. See the Template Variables guide for the syntax and scoping rules.
  • AI-generated content blocks — Content blocks with content_type: "ai_generated" are generated at runtime during the intake session. The body field in the schema contains the author's prompt, not the generated output. Generated content is stored per-submission in the conversation history.
  • v1 API schema response updated — schema.fields now uses a union type: items are either a field object (has type) or a content block object (has kind: "content"). Existing integrations that only read field objects are unaffected — unknown kind values should be skipped.

2026-02-25

v1 API Launch

  • Initial release of the ioZen Public API v1
  • Endpoints: Intake Bots, Submissions, Webhooks
  • API key authentication with scopes
  • Rate limiting per plan tier
  • Webhook event delivery via QStash
  • Interactive API documentation at /docs

On this page