---
title: 'Internal extensions: dial a colleague, free'
description: >-
  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.
summary: >-
  Four-digit internal extensions on SIP credentials — device-to-device calls
  that bridge directly, cost nothing, and work as forward destinations.
date: 2026-08-14T00:00:00.000Z
type: changelog
---


## What's new

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.

## Assigning one

An extension is a field on a SIP credential, set when you mint it or changed later:

```bash
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.

## Three rules worth knowing

**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`](/developers/errors/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`](/developers/errors/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.

## Forwarding an outside call to a handset

An extension is also a valid forward destination, so an inbound call from the PSTN can ring a desk phone:

```json
{
  "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.

## If the device is off

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.

## API and MCP

- `POST /v1/numbers/{id}/sip-credentials` accepts `extension`
- `PATCH /v1/numbers/{id}/sip-credentials/{credential_id}` accepts `extension` (empty string clears it)
- `GET /v1/numbers/{id}/sip-credentials` returns `extension` on each credential
- The `create_sip_credential` and `update_sip_credential` MCP tools take it too, with `clear_extension` on the update

See [Numbers → Internal extensions](/developers/concepts/numbers#internal-extensions) for the full reference.
