curl --request POST \
--url https://api.salvy.com.br/api/v3/phone-accounts/mobile-did \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"areaCode": 11,
"name": "Maria - Vendas",
"costCenterId": "0198c2f1-3815-45b7-9e60-8e137cad845c",
"employeeId": "0197aa3e-3815-45b7-9e60-8e137cad845c",
"customFields": [
{
"label": "Departamento",
"value": "Vendas"
}
]
}
'import requests
url = "https://api.salvy.com.br/api/v3/phone-accounts/mobile-did"
payload = {
"areaCode": 11,
"name": "Maria - Vendas",
"costCenterId": "0198c2f1-3815-45b7-9e60-8e137cad845c",
"employeeId": "0197aa3e-3815-45b7-9e60-8e137cad845c",
"customFields": [
{
"label": "Departamento",
"value": "Vendas"
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
areaCode: 11,
name: 'Maria - Vendas',
costCenterId: '0198c2f1-3815-45b7-9e60-8e137cad845c',
employeeId: '0197aa3e-3815-45b7-9e60-8e137cad845c',
customFields: [{label: 'Departamento', value: 'Vendas'}]
})
};
fetch('https://api.salvy.com.br/api/v3/phone-accounts/mobile-did', 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://api.salvy.com.br/api/v3/phone-accounts/mobile-did",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'areaCode' => 11,
'name' => 'Maria - Vendas',
'costCenterId' => '0198c2f1-3815-45b7-9e60-8e137cad845c',
'employeeId' => '0197aa3e-3815-45b7-9e60-8e137cad845c',
'customFields' => [
[
'label' => 'Departamento',
'value' => 'Vendas'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.salvy.com.br/api/v3/phone-accounts/mobile-did"
payload := strings.NewReader("{\n \"areaCode\": 11,\n \"name\": \"Maria - Vendas\",\n \"costCenterId\": \"0198c2f1-3815-45b7-9e60-8e137cad845c\",\n \"employeeId\": \"0197aa3e-3815-45b7-9e60-8e137cad845c\",\n \"customFields\": [\n {\n \"label\": \"Departamento\",\n \"value\": \"Vendas\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.salvy.com.br/api/v3/phone-accounts/mobile-did")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"areaCode\": 11,\n \"name\": \"Maria - Vendas\",\n \"costCenterId\": \"0198c2f1-3815-45b7-9e60-8e137cad845c\",\n \"employeeId\": \"0197aa3e-3815-45b7-9e60-8e137cad845c\",\n \"customFields\": [\n {\n \"label\": \"Departamento\",\n \"value\": \"Vendas\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.salvy.com.br/api/v3/phone-accounts/mobile-did")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"areaCode\": 11,\n \"name\": \"Maria - Vendas\",\n \"costCenterId\": \"0198c2f1-3815-45b7-9e60-8e137cad845c\",\n \"employeeId\": \"0197aa3e-3815-45b7-9e60-8e137cad845c\",\n \"customFields\": [\n {\n \"label\": \"Departamento\",\n \"value\": \"Vendas\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "0198c2f1-3815-45b7-9e60-8e137cad845c",
"companyId": "0198c2f1-3815-45b7-9e60-8e137cad845c",
"productType": "mobile",
"simType": "esim",
"name": "Maria - Vendas",
"phoneNumber": "+5541999887766",
"redirectPhoneNumber": "+5541999887766",
"redirectExpiresAt": "2026-09-01T00:00:00Z",
"status": "active",
"dataBalanceGB": 32.5,
"dataBalanceUpdatedAt": "2026-08-03T14:00:00Z",
"activatedAt": "2026-05-10T13:22:04Z",
"canceledAt": "2026-07-15T09:00:00Z",
"createdAt": "2026-05-08T11:02:33Z",
"costCenter": {
"id": "0198c2f1-3815-45b7-9e60-8e137cad845c",
"name": "TI-Curitiba"
},
"employee": {
"id": "0197aa3e-3815-45b7-9e60-8e137cad845c",
"fullName": "Maria de Souza",
"workEmail": "maria.souza@empresa.com.br"
},
"customFields": [
{
"label": "<string>",
"type": "text",
"value": "<string>"
}
],
"plan": {
"id": "0198c2f1-3815-45b7-9e60-8e137cad845c",
"name": "Plano 20GB",
"priceCents": 4500,
"availableDataAmountGB": 20
}
}{
"code": "idempotency-parameters-mismatch-error",
"message": "<string>"
}{
"code": "unauthorized",
"message": "<string>"
}{
"code": "forbidden",
"message": "<string>"
}{
"code": "resource-not-found",
"message": "<string>"
}{
"code": "did-area-code-out-of-stock",
"message": "<string>"
}{
"code": "payload-too-large",
"message": "<string>"
}{
"code": "input-validation-error",
"message": "<string>",
"details": [
{
"key": "<string>",
"message": "<string>"
}
]
}{
"code": "unknown",
"message": "<string>"
}Criar linha móvel (DID)
Cria uma nova linha móvel (mobile-did). A linha já nasce disponível para uso, com a cobrança começando apenas quando o número for validado em algum app (ex.: WhatsApp).
curl --request POST \
--url https://api.salvy.com.br/api/v3/phone-accounts/mobile-did \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"areaCode": 11,
"name": "Maria - Vendas",
"costCenterId": "0198c2f1-3815-45b7-9e60-8e137cad845c",
"employeeId": "0197aa3e-3815-45b7-9e60-8e137cad845c",
"customFields": [
{
"label": "Departamento",
"value": "Vendas"
}
]
}
'import requests
url = "https://api.salvy.com.br/api/v3/phone-accounts/mobile-did"
payload = {
"areaCode": 11,
"name": "Maria - Vendas",
"costCenterId": "0198c2f1-3815-45b7-9e60-8e137cad845c",
"employeeId": "0197aa3e-3815-45b7-9e60-8e137cad845c",
"customFields": [
{
"label": "Departamento",
"value": "Vendas"
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
areaCode: 11,
name: 'Maria - Vendas',
costCenterId: '0198c2f1-3815-45b7-9e60-8e137cad845c',
employeeId: '0197aa3e-3815-45b7-9e60-8e137cad845c',
customFields: [{label: 'Departamento', value: 'Vendas'}]
})
};
fetch('https://api.salvy.com.br/api/v3/phone-accounts/mobile-did', 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://api.salvy.com.br/api/v3/phone-accounts/mobile-did",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'areaCode' => 11,
'name' => 'Maria - Vendas',
'costCenterId' => '0198c2f1-3815-45b7-9e60-8e137cad845c',
'employeeId' => '0197aa3e-3815-45b7-9e60-8e137cad845c',
'customFields' => [
[
'label' => 'Departamento',
'value' => 'Vendas'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.salvy.com.br/api/v3/phone-accounts/mobile-did"
payload := strings.NewReader("{\n \"areaCode\": 11,\n \"name\": \"Maria - Vendas\",\n \"costCenterId\": \"0198c2f1-3815-45b7-9e60-8e137cad845c\",\n \"employeeId\": \"0197aa3e-3815-45b7-9e60-8e137cad845c\",\n \"customFields\": [\n {\n \"label\": \"Departamento\",\n \"value\": \"Vendas\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.salvy.com.br/api/v3/phone-accounts/mobile-did")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"areaCode\": 11,\n \"name\": \"Maria - Vendas\",\n \"costCenterId\": \"0198c2f1-3815-45b7-9e60-8e137cad845c\",\n \"employeeId\": \"0197aa3e-3815-45b7-9e60-8e137cad845c\",\n \"customFields\": [\n {\n \"label\": \"Departamento\",\n \"value\": \"Vendas\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.salvy.com.br/api/v3/phone-accounts/mobile-did")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"areaCode\": 11,\n \"name\": \"Maria - Vendas\",\n \"costCenterId\": \"0198c2f1-3815-45b7-9e60-8e137cad845c\",\n \"employeeId\": \"0197aa3e-3815-45b7-9e60-8e137cad845c\",\n \"customFields\": [\n {\n \"label\": \"Departamento\",\n \"value\": \"Vendas\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "0198c2f1-3815-45b7-9e60-8e137cad845c",
"companyId": "0198c2f1-3815-45b7-9e60-8e137cad845c",
"productType": "mobile",
"simType": "esim",
"name": "Maria - Vendas",
"phoneNumber": "+5541999887766",
"redirectPhoneNumber": "+5541999887766",
"redirectExpiresAt": "2026-09-01T00:00:00Z",
"status": "active",
"dataBalanceGB": 32.5,
"dataBalanceUpdatedAt": "2026-08-03T14:00:00Z",
"activatedAt": "2026-05-10T13:22:04Z",
"canceledAt": "2026-07-15T09:00:00Z",
"createdAt": "2026-05-08T11:02:33Z",
"costCenter": {
"id": "0198c2f1-3815-45b7-9e60-8e137cad845c",
"name": "TI-Curitiba"
},
"employee": {
"id": "0197aa3e-3815-45b7-9e60-8e137cad845c",
"fullName": "Maria de Souza",
"workEmail": "maria.souza@empresa.com.br"
},
"customFields": [
{
"label": "<string>",
"type": "text",
"value": "<string>"
}
],
"plan": {
"id": "0198c2f1-3815-45b7-9e60-8e137cad845c",
"name": "Plano 20GB",
"priceCents": 4500,
"availableDataAmountGB": 20
}
}{
"code": "idempotency-parameters-mismatch-error",
"message": "<string>"
}{
"code": "unauthorized",
"message": "<string>"
}{
"code": "forbidden",
"message": "<string>"
}{
"code": "resource-not-found",
"message": "<string>"
}{
"code": "did-area-code-out-of-stock",
"message": "<string>"
}{
"code": "payload-too-large",
"message": "<string>"
}{
"code": "input-validation-error",
"message": "<string>",
"details": [
{
"key": "<string>",
"message": "<string>"
}
]
}{
"code": "unknown",
"message": "<string>"
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Headers
Idempotency key for this request. Will return the same response if the same request is made again with the same key. Fails if parameters are different.
Body
Código de área (DDD) da linha.
11
Nome da linha, definido pelo cliente para facilitar a gestão.
"Maria - Vendas"
ID do centro de custo da linha; consultável em GET /cost-centers.
"0198c2f1-3815-45b7-9e60-8e137cad845c"
ID do colaborador associado à linha. Deve pertencer à mesma empresa da chave de API.
"0197aa3e-3815-45b7-9e60-8e137cad845c"
Campos customizados associados à linha. Os campos devem ser criados previamente no dashboard da Salvy; labels inexistentes serão ignorados.
Show child attributes
Show child attributes
[
{
"label": "Departamento",
"value": "Vendas"
}
]
Response
Identificador único da linha.
"123e4567-e89b-12d3-a456-426614174000"
"123e4567-e89b-12d3-a456-426614174001"
ID da empresa dona da linha.
"123e4567-e89b-12d3-a456-426614174000"
"123e4567-e89b-12d3-a456-426614174001"
Tipo do produto da linha. Novos tipos poderão ser adicionados sem mudança de versão — cheque este campo ao consumir.
mobile, mobile-did, global "mobile"
Tipo de chip da linha: "physical" (chip físico), "esim" (eSIM) ou "virtual" (linhas de número virtual, como as do tipo mobile-did). Novos valores poderão ser adicionados sem mudança de versão — cheque este campo ao consumir.
physical, esim, virtual "esim"
Nome da linha, definido pelo cliente para facilitar a gestão.
"Maria - Vendas"
Número que o cliente reconhece como sendo dessa linha, formatado conforme o padrão internacional E.164. Nulo enquanto a linha ainda não tem número definido.
"+5541999887766"
Número para o qual as chamadas recebidas nesta linha são redirecionadas. Nulo quando a linha não tem redirecionamento configurado.
"+5541999887766"
Data e hora em que o redirecionamento configurado para esta linha expira. Nulo quando não há expiração definida ou quando a linha não tem redirecionamento configurado.
^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$"2026-09-01T00:00:00Z"
Status público da linha. "available" indica uma linha disponível para uso, com a cobrança iniciando após a ativação. Novos valores podem ser adicionados a este enum sem uma mudança de versão da API — trate qualquer valor não reconhecido como "blocked".
pending, available, active, partial-block, blocked, canceled "active"
Saldo de dados restante, em GB. Nulo quando a linha não está ativa ou o valor ainda não pôde ser medido. Nunca use 0 como indicador de ausência de valor: um 0 real significa linha ativa, medida, com dados esgotados.
32.5
Data e hora da última atualização do saldo de dados. Nulo quando não há saldo medido.
^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$"2026-08-03T14:00:00Z"
Data e hora de ativação da linha. Nulo enquanto a linha ainda não foi ativada.
^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$"2026-05-10T13:22:04Z"
Data e hora de cancelamento da linha. Nulo enquanto a linha não foi cancelada.
^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$"2026-07-15T09:00:00Z"
Data e hora de criação da linha.
^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$"2026-05-08T11:02:33Z"
Centro de custo da linha; detalhes em GET /cost-centers/{id}. Nulo quando a linha não tem centro de custo definido.
Show child attributes
Show child attributes
Colaborador associado à linha; detalhes em GET /employees/{id}. Nulo quando a linha não tem colaborador associado.
Show child attributes
Show child attributes
Campos customizados associados à linha.
Show child attributes
Show child attributes
Plano contratado pela linha. Toda linha tem um plano; o nulo é excepcional, mas trate o campo como opcional mesmo assim.
Show child attributes
Show child attributes