Cancelar linha
⚠️ Efeito colateral real — NÃO é uma simulação, inclusive pelo playground. Cancela a linha e responde com a linha como ela fica depois. O que acontece depende do status:
status antes | Resultado | Resposta |
|---|---|---|
ACTIVE | Cancelada no fim do período, sem estorno. A linha continua ACTIVE e totalmente utilizável — inclusive para códigos de ativação — até currentPeriodEnd; ela não é renovada e passa a CANCELED quando o período termina. | 200, status: "ACTIVE", cancelAtPeriodEnd: true |
ACTIVE, já cancelada | Nada muda — chamar de novo é seguro. | 200, a mesma linha |
PAYMENT_PENDING, SUSPENDED | Devolvida à operadora imediatamente — IRREVERSÍVEL. Não resta período pago. | 200, status: "RETURNED" |
RETURNED, CANCELED | A chamada é recusada — a linha já está encerrada. | 409 NOT_CANCELABLE |
Um número devolvido deixa de ser seu: nada desfaz uma devolução, e não há garantia de que ele possa ser comprado de volta — ele volta para o estoque da operadora, onde qualquer pessoa pode alugá-lo. A conta do WhatsApp ativada nele continua vinculada a esse número. O histórico de códigos da linha — códigos e gravações das ligações — é apagado. Cancelar uma linha em atraso faz isso na hora, sem período de carência. Desfazer um cancelamento agendado de uma linha ACTIVE só é possível no painel (Proprietário).
Se a devolução da mesma linha em atraso já estiver em andamento (execução horária do faturamento, ou o Escolher quais linhas manter do painel), a chamada responde 200 com a linha como ela está — possivelmente ainda PAYMENT_PENDING ou SUSPENDED — e esse processo conclui a devolução. Eventos: phone_line.canceled quando uma linha cancelada no fim do período passa a CANCELED; phone_line.returned com reason: "canceled_by_customer" na hora, para uma linha em atraso devolvida por esta chamada.
Permissões: com um token OAuth / MCP, só o Proprietário do workspace pode cancelar (phone_lines:cancel) — caso contrário, 403 PERMISSION_DENIED.
Todo endpoint /v1/phone-lines aceita só uma chave com escopo de tenant: a linha pertence ao workspace, não a um número de WhatsApp, então uma chave com escopo de número (ou uma concessão OAuth por número) recebe 403 NUMBER_SCOPE_NOT_ALLOWED antes de qualquer verificação de papel. Um 403 PERMISSION_DENIED / WORKSPACE_MEMBERSHIP_REQUIRED é enviado com Cache-Control: no-store.
Requer uma chave com escopo de tenant.
curl --request DELETE \
--url https://pilotstatus.com.br/v1/phone-lines/{id} \
--header 'x-api-key: <api-key>'import requests
url = "https://pilotstatus.com.br/v1/phone-lines/{id}"
headers = {"x-api-key": "<api-key>"}
response = requests.delete(url, headers=headers)
print(response.text)const options = {method: 'DELETE', headers: {'x-api-key': '<api-key>'}};
fetch('https://pilotstatus.com.br/v1/phone-lines/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://pilotstatus.com.br/v1/phone-lines/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "DELETE",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://pilotstatus.com.br/v1/phone-lines/{id}"
req, _ := http.NewRequest("DELETE", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.delete("https://pilotstatus.com.br/v1/phone-lines/{id}")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://pilotstatus.com.br/v1/phone-lines/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Delete.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"line": {
"id": "cmg5k2l1n0001pl8example9x",
"name": "Suporte SP",
"number": "551148637200",
"display": "(11) 4863-7200",
"ddd": "11",
"status": "ACTIVE",
"price": 33.9,
"currency": "BRL",
"purchasedAt": "2026-10-01T14:03:11.000Z",
"currentPeriodEnd": "2026-11-01T14:03:11.000Z",
"cancelAtPeriodEnd": true,
"paymentPendingSince": null,
"suspendedAt": null,
"returnedAt": null,
"canceledAt": null,
"activationCount": 1,
"amountDue": null
}
}ACTIVE é cancelada no fim do período, sem reembolso. Uma linha em atraso (PAYMENT_PENDING, SUSPENDED) é devolvida à operadora na hora, sem garantia de que possa ser comprada de volta, e o histórico de códigos é apagado. Veja Cancelar uma linha.Esta página foi útil?
curl --request DELETE \
--url https://pilotstatus.com.br/v1/phone-lines/{id} \
--header 'x-api-key: <api-key>'import requests
url = "https://pilotstatus.com.br/v1/phone-lines/{id}"
headers = {"x-api-key": "<api-key>"}
response = requests.delete(url, headers=headers)
print(response.text)const options = {method: 'DELETE', headers: {'x-api-key': '<api-key>'}};
fetch('https://pilotstatus.com.br/v1/phone-lines/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://pilotstatus.com.br/v1/phone-lines/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "DELETE",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://pilotstatus.com.br/v1/phone-lines/{id}"
req, _ := http.NewRequest("DELETE", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.delete("https://pilotstatus.com.br/v1/phone-lines/{id}")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://pilotstatus.com.br/v1/phone-lines/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Delete.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"line": {
"id": "cmg5k2l1n0001pl8example9x",
"name": "Suporte SP",
"number": "551148637200",
"display": "(11) 4863-7200",
"ddd": "11",
"status": "ACTIVE",
"price": 33.9,
"currency": "BRL",
"purchasedAt": "2026-10-01T14:03:11.000Z",
"currentPeriodEnd": "2026-11-01T14:03:11.000Z",
"cancelAtPeriodEnd": true,
"paymentPendingSince": null,
"suspendedAt": null,
"returnedAt": null,
"canceledAt": null,
"activationCount": 1,
"amountDue": null
}
}