Skip to main content
Tell the dialer who the agent is looking at. The bundled UIs show the name and avatar, prefill the destination, and Ringee attributes the call to the right contact.

Fields

contactId or externalContactId?

You need one, not both.

contactId

Use it when you already know the internal Ringee UUID — for example because your app reads Ringee data directly.

externalContactId

Use it when your Custom Integration maps a CRM id to a Ringee contact.
externalContactId is the same value you send as data.externalId in contact.upserted. Sync contacts through the Public API first and Ringee resolves the link automatically.
Keeping externalContactId consistent is what makes the loop close: the call comes back to your CRM in call.completed carrying data.contact.externalId, so you can attach the activity to the right record without matching phone numbers.

Prefill just a number

When there is no contact record — a manual dial, an inbound lookup:

Start a call directly

Floating can skip straight to dialing:
In Headless:

Phone number format

Destinations must be E.164 — a +, the country code, then the number, with no extension:
Anything else fails with INVALID_PHONE_NUMBER. Normalize in your CRM before passing it in; the SDK validates locally before it reaches the network.

Keeping it in sync

Call setContact() whenever the selected record changes. It is cheap and idempotent:
To detach the current record — the user closed the panel, navigated away, deselected — pass null:

After the call

The SDK emits ended with a call snapshot in the browser, but the durable record of what happened arrives through your outbound webhooks: Write your CRM activity from the webhooks — they are signed, retried and idempotent. Use the browser events for live UI only.

Next steps

Sync contacts to Ringee

Establish the externalId link

Receive call activity

Close the loop back into your CRM