Skip to main content
POST
Send everything your CRM knows about a contact or company to a single Ringee endpoint. Ringee upserts the record, links it to your externalId, and makes it callable. Pick the event you are sending in the request body above — each one has its own data shape.

Reading the response

The endpoint returns 202 Accepted for any well-formed, authenticated request. The real result is in the JSON body.
A 202 status code only means the transport was accepted. Do not treat it as a successful sync without checking status in the body.

Event examples

Create or update a contact from your CRM’s current state.
Deduplication order: externalId first, then phoneNumber within the same workspace. Sending null, undefined or empty strings does not overwrite existing values — omit a field to leave it untouched.

Sending events well

Sync only when a field Ringee cares about actually changes: name, phone, email, company, job title, owner. Sending an event on every UI update wastes quota and makes your logs unreadable.
Ringee normalizes what it can, but +14155550123 always wins over (415) 555-0123. A number Ringee cannot normalize may fail dedup against an existing contact.
If your CRM record was created or updated by a Ringee webhook, do not send it back. Store a sync_origin marker on those rows and skip them. See Build an integration.
Write the event to a local outbox table first, then attempt delivery. A contact save in your CRM should never fail because Ringee is momentarily unreachable.

Next steps

Click-to-call

Open a secure dialer for a synced contact

Outbound webhooks

Receive call activity back in your CRM

Authorizations

X-Ringee-Api-Key
string
header
required

The cik_live_ secret key of a Custom Integration. Shown once at creation. Server-side only.

Body

application/json

Create or update a contact from your CRM's current state.

event
string
required

The event type.

Allowed value: "contact.upserted"
eventId
string
required

Unique, stable id for this event. Ringee deduplicates on it.

Example:

"crm_01HX5Z7K8MZP1Q4V0G9YJ2RH3T"

occurredAt
string<date-time>
required

When the change happened in your system.

Example:

"2026-05-23T14:30:00.000Z"

data
object
required

Omit a field to leave it untouched. Sending null, undefined or an empty string does not overwrite an existing value.

Response

Accepted. Check status in the body to know whether the event was applied.

status
enum<string>
required

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.

Available options:
processed,
skipped,
failed
eventId
string
required

Echoes the eventId you sent.

message
string

Present on skipped and failed. Surface it in your sync logs.