Capacity limit
- New
503 server_busy: when one key has too many requests running at once, or the API is at capacity, a request returns503withRetry-After: 1. It did not run and does not count against your rate limit; retry it. Sending up to 100 recipients per template send, instead of one call per recipient, avoids it. See rate limits.
Webhooks
conversation.assignedcarries more: the teammate’s name and email (assignee), how it was assigned (strategy,assigned_by,self_assigned), and aurlto the conversation, so a no-code tool can post a useful alert without calling the API. See the event catalog.
WhatsApp forms
- New webhook event
whatsapp_flow.completed: fires when a customer submits a WhatsApp form, with the answers and what Ciarem saved to the contact. See the event catalog.
Webhooks
Ciarem can now call your server when something changes, so you no longer have to poll. Start with the webhooks guide.
- Webhook endpoints: register up to 10 HTTPS URLs per organization and choose which events each one receives (
/v1/webhook-endpoints: list, create, read, update, delete). Also available to admins in the dashboard under Settings → Webhooks. - Ten event types:
contact.created,contact.updated,contact.deleted,contact.merged,contact.funnel_stage.changed,contact.owner.changed,conversation.created,conversation.assigned,conversation.closed, andmessages.inbound. Contact events carry the full contact. See the event catalog. - Signed requests: every request carries a
Ciarem-Signatureheader, an HMAC-SHA256 made with the endpoint’swhsec_signing secret. See Verify signatures. - Retries and a delivery log: a failed delivery is retried for up to 3 days, and every delivery of the last 30 days can be read with
GET /v1/webhook-endpoints/{id}/deliveriesand sent again withPOST /v1/webhook-deliveries/{id}/redeliver. See Deliveries and retries. - Test events:
POST /v1/webhook-endpoints/{id}/testsends one event right now and returns what your server answered.GET /v1/webhook-event-samplesreturns the sample body of every event type. - Included in the same plans as the API: Growth, Scale, and the free trial.
WhatsApp marketing opt-out
- Contacts gain
marketing_opt_out(boolean, read-only):truewhen the contact opted out of WhatsApp marketing. It cannot be set through the API. See WhatsApp marketing opt-out. POST /v1/templates/{id}/send: a marketing template is not sent to a recipient whosemarketing_opt_outistrue. The request is still accepted and the other recipients are sent; the opted-out recipient is not sent and not charged. Utility and authentication templates are unaffected. Readmarketing_opt_outon the contact to leave those recipients out up front.
The API comes to the Growth plan
- The API is now included in the Growth plan, not only Scale. Growth gets every endpoint on a budget of 10 requests/second; Scale stays at 20 requests/second and the trial at 5 requests/second. Keys created during a trial that continued on Growth work again with no change.
- Breaking:
scale_plan_requiredis nowplan_upgrade_required. The403detail for a live plan without the API (Solo) was renamed, since Scale is no longer the only plan that includes it. If your integration matches on the old string, update it. See Authentication.
Contact date filters take absolute dates
GET /v1/contacts:property_filterno longer accepts relative date presets. A DATE clause takes aYYYY-MM-DDdate, for examplecustom_birthday:gte:2026-09-01. Apreset:value such aspreset:1wnow returns400withinvalid_property_filter. Presets were never documented: they resolve in the timezone of whoever is viewing the dashboard, which an integration cannot control. Compute the dates on your side instead.tzis now documented onGET /v1/contacts: the IANA timezonecreated_from/created_toare read in. It defaults to the organization’s timezone, then UTC.
Free-trial access, per-second limits, and 403s that say what to do
- The API is open during the free trial. A trial organization gets every endpoint, on a smaller budget, so an integration can be built and tested before paying.
- Rate limits are now per second: 20 requests/second on Scale, 5 requests/second during the trial, shared across the organization’s keys. The
X-RateLimit-*headers are unchanged;Retry-Afteron a429is now always1. GET /v1/megainstrial(boolean), which istruewhile the organization is on its free trial.plannow reports the real plan code rather than always"scale".- Clearer
403s.scale_plan_requirednow means only that the organization is on a live plan below Scale and needs to upgrade. Two new details cover the rest:trial_expired(the trial ended without a payment method) andsubscription_required(canceled, or suspended for non-payment). See Authentication.
WhatsApp templates, sends, and broadcasts
The API can now send.
- WhatsApp templates: list, read, create, delete (
/v1/templates). Creating a template also submits it to Meta for approval in the same call, so it comes backPENDING; poll it until Meta flips it toAPPROVEDorREJECTED. GET /v1/templates/{id}/send-requirements: what a template needs filled before it can be sent. It lists the variable tokens, which of them resolve from the contact on their own, catalog slots, dynamic URL buttons, media surfaces, and a reason when a template can never be sent at all. Read this before your first send rather than discovering it through 422s.POST /v1/templates/{id}/send: up to 100 recipients in one call, each addressed bycontact_idorphoneand carrying its ownvariables,url_suffixes,coupon_code,lto_expirationand media.recipientstakes a single object or an array, so sending to one person needs no wrapping. Media headers take a public URL (header_media_url/card_media_urls), fetched server-side. Returns 202 and the broadcast it created.- A
phonethat matches no contact creates one, so a send can grow your CRM. - Send
Idempotency-Keyand a retry is safe: the same key returns the original broadcast for 24 hours instead of sending again. - The request is refused whole (nothing queued, nothing charged) if a variable is missing, a key is one the template does not use, a media URL cannot be fetched, or the batch exceeds what is left of WhatsApp’s rolling 24-hour messaging limit.
- A
- Broadcasts:
GET /v1/broadcastsandGET /v1/broadcasts/{id}for progress (sent/failed/pendingalways sum torequested),GET /v1/broadcasts/{id}/recipientsfor per-recipient outcomes, andPOST /v1/broadcasts/{id}/cancelto abandon the un-sent remainder. Messages already accepted by WhatsApp cannot be recalled. GET /v1/channels/whatsapp/phones: the connected numbers a send can go out from, sochannel_idis discoverable. Optional when your WhatsApp account has exactly one number; required when it has more.
v1 launch
The first public surface of the Ciarem API:
- Contacts: full CRUD (
/v1/contacts). - CRM metadata: properties and funnel stages, full CRUD (
/v1/properties,/v1/funnel-stages). - Conversations: read-only history (
/v1/conversations), each message carrying asenderofcontact,agent,ai, orsystem. /v1/me: organization identity, plan, timezone, and language.- Organization-bound
oak_API keys, 60 requests/minute per organization.