Internal extensions: dial a colleague, free
Give a SIP credential a four-digit extension and your other devices reach it by dialling it. Those calls bridge directly and are not charged.
If you have two or more devices registered to Sautikit — desk phones, an office PBX, softphones — they can now call each other by extension. Reception dials 1001 and the handset in the back office rings.
Those calls are bridged directly between the two devices and are not charged. They consume no carrier minutes, so there is nothing to bill. They also do not appear in your call log, because they never leave the platform.
An extension is a field on a SIP credential, set when you mint it or changed later:
curl -X POST "https://api.sautikit.com/v1/numbers/{id}/sip-credentials" \
-H "Authorization: Bearer $SAUTIKIT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"label": "Back office", "extension": "1001"}'It is also in the dashboard, on the SIP panel of any number — an Extension column in the credential list, and an editable field in the same place you already change the name and caller reference.
Changing an extension applies immediately and needs no change on the device: it is resolved by Sautikit rather than by the registrar, so the phone never has to know. Pass an empty string to remove it.
Unique per workspace, not per number. The workspace is the namespace people dial within, so 1001 means one device regardless of which of your numbers each was issued against. A clash returns numbers.extension_taken.
Exactly four digits. Fixed length is about dialling, not storage. With a range, 10 is a prefix of 1001 and a handset cannot tell whether you have finished — so it waits out a timeout before placing every internal call. At a fixed length the fourth digit ends the number and the phone dials at once. It also cannot be confused with a real number, since a locally-dialled number is ten digits and an E.164 carries a +. Anything else returns numbers.extension_invalid.
Optional. A credential without one still receives calls from outside and still places them. It simply has no internal number. Revoking a credential frees its extension for reuse, which is what you want when a handset is replaced.
An extension is also a valid forward destination, so an inbound call from the PSTN can ring a desk phone:
{
"forward": {
"destinations": ["1001", "+254700000001"],
"first_answer_wins": true
}
}Mix extensions and phone numbers freely — here the handset and an external mobile ring together, and whichever answers first takes the call.
That one is logged and billed as normal, because one end of it is a carrier. Only calls with a device on both ends are free and unlogged.
The caller hears a short message rather than silence. A switched-off handset is otherwise indistinguishable from a call that simply died, which is a bad experience on a phone with no error surface.
POST /v1/numbers/{id}/sip-credentials accepts extensionPATCH /v1/numbers/{id}/sip-credentials/{credential_id} accepts extension (empty string clears it)GET /v1/numbers/{id}/sip-credentials returns extension on each credentialcreate_sip_credential and update_sip_credential MCP tools take it too, with clear_extension on the updateSee Numbers → Internal extensions for the full reference.