Inbound events
Push contacts and companies from your CRM into Ringee
externalId, and makes it callable.
Pick the event you are sending in the request body above — each one has its own data shape.
The envelope
Every request uses the same four top-level fields:Reading the response
The endpoint returns 202 Accepted for any authenticated request with a complete envelope. The real result is in the JSON body.Warnings
Aprocessed response can also carry a warnings array. The event applied, but something you sent had no effect:
What the endpoint guarantees
An event applies completely or not at all
An event applies completely or not at all
failed response means nothing was created or updated, so you can correct the payload and send it again knowing Ringee holds no half-synced record.One request tells you everything that is wrong
One request tells you everything that is wrong
externalId and a missing phoneNumber come back in the same message:The same eventId is never applied twice
The same eventId is never applied twice
eventId is the idempotency key, scoped to your integration. A transport retry is free: the second delivery returns skipped and changes nothing. That also means a corrected payload needs a new id — the old one is already recorded.Omitting a field never clears it
Omitting a field never clears it
null, undefined and empty strings leave the stored value alone. To blank a field, clear it in Ringee.Event examples
- contact.upserted
- company.upserted
- contact.deleted
- company.deleted
companyName is present.externalId first, then the normalized phoneNumber
within the same workspace.ownerEmail is not used.Phone numbers
Ringee normalizesdata.phoneNumber to E.164 against real numbering plans. That normalized value is what agents dial and what deduplication matches on.
+ is read with United States as the assumed country, and the response tells you so. That assumption is wrong for most of the world, so send E.164.
Adding a contact to a campaign
Includedata.campaignId on contact.upserted and the contact joins that outbound campaign as a lead, in the same request that syncs it.
- The contact is added as a pending lead. If the campaign is already running, the lead is queued for dialing immediately.
- A contact that is already a lead of that campaign is left untouched. Its attempts, status and disposition history survive every re-sync, so a CRM that replays
contact.upsertedon each edit never resets a lead’s progress. - Membership is only ever added. Dropping
campaignIdfrom a later event does not remove the lead — remove it in Ringee.
campaignId that is not a UUID,
matches no campaign, or belongs to another workspace fails the event — and
because validation runs before any write, the contact is not synced either.
Correct it and resend with a new eventId.Sending events well
Do not send on every render or save
Do not send on every render or save
Use E.164 phone numbers
Use E.164 phone numbers
+14155550123 always wins over (415) 555-0123. See Phone numbers for what Ringee does with the difference.Treat warnings as bugs
Treat warnings as bugs
warnings entry.Never re-send what Ringee wrote
Never re-send what Ringee wrote
sync_origin marker on those rows and skip them. See Build an integration.Queue before you send
Queue before you send
Next steps
Click-to-call
Outbound webhooks
Logs and errors
Build an integration
Authorizations
The cik_live_ secret key of a Custom Integration. Shown once at creation. Server-side only.
Body
- contact.upserted
- company.upserted
- contact.deleted
- company.deleted
Create or update a contact from your CRM's current state.
The event type.
"contact.upserted"Unique, stable id for this event. Ringee deduplicates on it.
"crm_01HX5Z7K8MZP1Q4V0G9YJ2RH3T"
When the change happened in your system.
"2026-05-23T14:30:00.000Z"
Omit a field to leave it untouched. Sending null, undefined or an empty string does not overwrite an existing value. The whole payload is validated before anything is written, so a rejected event leaves no partial contact behind.
Response
Accepted. Check status in the body to know whether the event was applied.
processed — applied. skipped — duplicate eventId, already applied earlier; treat as success. failed — accepted but could not be applied; fix and resend with a new eventId.
processed, skipped, failed Echoes the eventId you sent.
Present on skipped and failed. On failed it lists every problem found, separated by ; , so one request is enough to learn what to fix.
Non-fatal remarks about a payload that was applied anyway: an unknown or mistyped field that was ignored, a phone number read with an assumed country, an ownerEmail matching nobody in the workspace. Absent when there is nothing to report.

