Placing a Call
Ring one of the customer's users, then dial the destination and bridge the two.
Click-to-call. You name a user in the customer's domain and a destination; we ring the user first, and when they answer we dial the destination and bridge them together.
That ordering is the thing to design your interface around. From the user's point of view they click a button and their own desk phone rings — so the label you send as callee_id matters, because it is what tells them who they are about to be connected to.
Requires appropriate permissions and an active integration on the domain.
Request
curl -X POST https://partner-api.kricktalk.com/v1/domains/yourcustomer.kricktalk/calls \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"from_extension": "101",
"destination": "+18015551212",
"callee_id": "Dana Reed"
}'| Field | In | Required | Notes |
|---|---|---|---|
domain_id | path | yes | The customer's domain name. |
from_extension | body | yes | Who places the call — their phone rings first. A user_id from Listing users. |
destination | body | yes | A US number in E.164 form (+1XXXXXXXXXX), or a 3–5 digit extension on the same domain. |
callee_id | body | no | Label shown to from_extension while their phone rings. Defaults to destination. Must match [a-zA-Z0-9.#$_\-!]{3,100}. |
caller_id | body | no | The number shown to the person being called. Defaults are almost always what you want — see below. |
Caller ID
Omit caller_id unless you have a specific reason. The defaults are:
- External destination → the domain's configured outbound number, so the call appears to come from the business.
- Internal destination (an extension) →
from_extension, so a colleague sees who is calling.
If you do send one, it has to be consistent with the destination: for an external destination it must be a valid US number in E.164 form that belongs to the customer's phone system; for an internal destination it must equal from_extension. Anything else is a 400.
Response
{
"call_id": "C2C-3f9a2b7c1d4e5f60718293a4b5c6d7e8",
"status": "originating",
"domain_id": "yourcustomer.kricktalk",
"from_extension": "101",
"destination": "+18015551212"
}
200means accepted, not connected
statusisoriginating: the telephony platform took the request and is ringingfrom_extension. It does not mean anyone answered, and the call may still fail — nobody picks up, the destination is busy, the number is unreachable.Do not tell your user "call connected" on this response. "Calling…" is accurate; the outcome arrives later.
destination is echoed back as dialed — normalized to E.164 when it is a number, unchanged when it is an extension.
Learning how the call went
This endpoint tells you the call was accepted. What actually happened — answered, missed, how long it lasted, the recording — arrives later, on the call_log.created webhook KrickTalk sends when the call completes.
Store call_id and match it against payload.origination_call_id on that webhook:
{
"type": "call_log.created",
"payload": {
"origination_call_id": "C2C-3f9a2b7c1d4e5f60718293a4b5c6d7e8",
"status": "answered",
"duration_seconds": 64,
"recording_url": "https://…"
}
}The two values are equal, so a plain string comparison is enough — no prefix matching or trimming.
origination_call_id is null on calls you did not place through this endpoint, which is most of them: anything inbound, or dialed from a handset. It may also carry an id you do not recognize, which means the call was started from KrickTalk's own click-to-call rather than by you. In both cases there is nothing to join to, and that is expected.
Why not match oncall_main_uuid?
call_main_uuididentifies the call in the telephony platform, and a click-to-call is made of two legs — one ringing your user, one dialing the destination. Which leg's identifier ends up incall_main_uuidvaries, so joining on it would match some of your originations and silently miss others.origination_call_idis populated from either leg and is the field to use.
Quote call_id in any support request, too — it is how KrickTalk finds a specific attempt in our logs.
Errors
| Status | Meaning |
|---|---|
400 | A field failed validation, or the domain has no outbound number configured for click-to-call. |
403 | Token missing/invalid/expired, or no active integration on this domain. |
502 | The telephony platform refused the origination. |
Validation errors name the field:
{
"errors": [
{
"destination": [
"Please provide either a valid US number in E.164 format or 3 - 5 digit extension."
]
}
]
}A 502 carries the call_id, so a failed attempt can be traced:
{ "message": "Failed to originate call.", "call_id": "C2C-3f9a2b7c..." }"Integration is not configured for click-to-call"
A 400 with this message means the customer's integration has no outbound number set, so there is no caller ID to present for an external call. It is a configuration gap on our side, not something your request can work around — ask KrickTalk to set the number for that domain.
Calls to an internal extension still work in this state, because they use from_extension as the caller ID and need no outbound number.
Trying it safely
- Pass your demo
domain_idin the URL - Set
destinationto a number you control (your demo domain should have one). - Set
from_extensionto101(demo domain should have a user101). - Set
desintationto an external (e.g. mobile) DID. - Open the KrickTalk portal and log into the webphone as user 101. This is important, since you must have a registered device to intercept the ring.
- Submit the request and answer the web phone when it rings.
Updated 11 days ago
