curl --request POST \
--url https://app.thinnest.ai/api/v1/phone-numbers/{number}/move \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"toWorkspace": "org_5c1d7e2a-9b3f-4a6e-8d20-7f4b1c9e3a58"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({toWorkspace: 'org_5c1d7e2a-9b3f-4a6e-8d20-7f4b1c9e3a58'})
};
fetch('https://app.thinnest.ai/api/v1/phone-numbers/{number}/move', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://app.thinnest.ai/api/v1/phone-numbers/{number}/move"
payload = { "toWorkspace": "org_5c1d7e2a-9b3f-4a6e-8d20-7f4b1c9e3a58" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"number": "918041234567",
"source": "rented",
"from": "org_9e4b2c71-3d5a-4f80-b6e1-2a7c0d8f5b93",
"to": "org_5c1d7e2a-9b3f-4a6e-8d20-7f4b1c9e3a58",
"paidThrough": "2026-10"
}{
"error": "`toWorkspace` is required: the `org_…` id of the workspace to move the number to.",
"code": "validation_failed"
}{
"error": "Unauthorized",
"code": "unauthorized"
}{
"error": "Moving a number between workspaces needs a developer's key: from your own workspace, or acting as one of your customers with Thinnest-Workspace.",
"code": "number_move_needs_developer"
}{
"error": "Workspace not found.",
"code": "workspace_not_found"
}{
"error": "That workspace has not sent its business details. An Indian number is held in the name of the business using it, so send them for that workspace first (PUT /api/v1/phone-numbers/business-details with its Thinnest-Workspace).",
"code": "number_move_needs_business_details"
}{
"error": "That workspace was deleted on 2026-10-01 and is erased on 2026-10-31. Restore it before moving a number to it.",
"code": "workspace_deleted"
}{
"error": "Over 240 requests a minute. Slow down and retry.",
"code": "rate_limit_resources",
"limit": {
"name": "resources",
"perMinute": 240
}
}{
"error": "We could not move that number just now. It is still in this workspace, answered by no agent. Try again in a few minutes.",
"code": "number_move_unavailable"
}Move Phone Number
Moves a number, keeping its digits, from the workspace the request runs in to another workspace of the same developer: the developer’s own, or any of its customers. Send it from the developer’s own workspace, or as the customer that holds the number with Thinnest-Workspace; a key minted for one customer cannot. The number leaves every agent and calling pool where it was and arrives answered by nobody — point it with PATCH /phone-numbers/{number} (as the target workspace) once it is there.
Rent continues from the next period on the target. The month already paid is not charged again, and inside one developer both workspaces bill the developer, so no money moves.
An Indian number is held in the name of the business using it: the target workspace’s business details must be approved first (PUT /phone-numbers/business-details as that workspace), and the move re-registers the number to that business.
A brought number (on your own carrier account) moves only when both workspaces have that same account’s keys saved. Refused while the number is on a call. Safe to retry: repeating a move that already succeeded to the same workspace answers the same 200 (for a day). Needs a full key.
curl --request POST \
--url https://app.thinnest.ai/api/v1/phone-numbers/{number}/move \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"toWorkspace": "org_5c1d7e2a-9b3f-4a6e-8d20-7f4b1c9e3a58"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({toWorkspace: 'org_5c1d7e2a-9b3f-4a6e-8d20-7f4b1c9e3a58'})
};
fetch('https://app.thinnest.ai/api/v1/phone-numbers/{number}/move', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://app.thinnest.ai/api/v1/phone-numbers/{number}/move"
payload = { "toWorkspace": "org_5c1d7e2a-9b3f-4a6e-8d20-7f4b1c9e3a58" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"number": "918041234567",
"source": "rented",
"from": "org_9e4b2c71-3d5a-4f80-b6e1-2a7c0d8f5b93",
"to": "org_5c1d7e2a-9b3f-4a6e-8d20-7f4b1c9e3a58",
"paidThrough": "2026-10"
}{
"error": "`toWorkspace` is required: the `org_…` id of the workspace to move the number to.",
"code": "validation_failed"
}{
"error": "Unauthorized",
"code": "unauthorized"
}{
"error": "Moving a number between workspaces needs a developer's key: from your own workspace, or acting as one of your customers with Thinnest-Workspace.",
"code": "number_move_needs_developer"
}{
"error": "Workspace not found.",
"code": "workspace_not_found"
}{
"error": "That workspace has not sent its business details. An Indian number is held in the name of the business using it, so send them for that workspace first (PUT /api/v1/phone-numbers/business-details with its Thinnest-Workspace).",
"code": "number_move_needs_business_details"
}{
"error": "That workspace was deleted on 2026-10-01 and is erased on 2026-10-31. Restore it before moving a number to it.",
"code": "workspace_deleted"
}{
"error": "Over 240 requests a minute. Slow down and retry.",
"code": "rate_limit_resources",
"limit": {
"name": "resources",
"perMinute": 240
}
}{
"error": "We could not move that number just now. It is still in this workspace, answered by no agent. Try again in a few minutes.",
"code": "number_move_unavailable"
}Authorizations
Your API key (ta_live_…) from Settings → API keys, sent as Authorization: Bearer <key>. Keep it on a server: it can message every customer you have. A key is full, build or read-only; a request its level does not allow is refused with 403.
Headers
Developers only: the customer workspace this request acts in — its org_… id from POST /customers. Leave it out to act in your own workspace. Refused with 404 (Workspace not found.) when the id is unknown, is not one of your customers, or is not an org_… id; 410 when that customer was deleted (restore it with POST /customers/{id}/restore until it is erased); 403 when the key belongs to one customer workspace (it cannot act as another); 400 when your workspace is not a developer workspace. /customers/* and GET /customers/usage are your own workspace's and refuse the header with 400: call them without it.
"org_3fKq9TzQ1mN8vB2xR7cLpA"
Path Parameters
The number, in any spelling — compared on its digits (8 to 15 of them). Encode a leading + as %2B, or leave it out.
Body
The org_… id of the workspace to move it to: the developer's own, or one of its customers.
Response
The number moved. It is unassigned in the target workspace.
The number's digits.
rented, brought The workspace it left.
The workspace that holds it now.
The last month (YYYY-MM) already paid, charged to the workspace it left. The target is charged from the next. Null for a brought number.