Criar um endereço
Cria um novo endereço e o vincula ao contexto autenticado (o cliente ou a empresa dona da chave de API). Use esta operação para registrar endereços de entrega, cobrança ou cadastro a partir de um chec
Cria um novo endereço e o vincula ao contexto autenticado (o cliente ou a empresa dona da chave de API). Use esta operação para registrar endereços de entrega, cobrança ou cadastro a partir de um checkout, de um formulário de perfil ou de uma importação do seu CRM/ERP.
POST /v1/addresses
Como funciona
Quando você envia um POST /v1/addresses, o servidor:
- Valida o corpo: confere os campos obrigatórios (
countryepostcode), o formato do CEP e os limites de tamanho dos demais campos. - Normaliza os dados: o CEP é gravado sem máscara (
01310-100vira01310100) e o endereço é montado em linhas formatadas (line,line1,line2,line3) e em umalinecompleta para exibição. - Vincula o endereço ao dono determinado pelo contexto da sua
SelectKey. Na resposta, isso aparece comoownerType(ex.:customer) eownerId(ex.:cus_01hqzvabc) — você não envia esse vínculo no corpo; ele é resolvido pelo servidor. - Persiste e devolve
201 Createdcom o objeto completo do endereço, incluindo oidrecém-gerado (prefixoaddr_), o blocomerchante os links HATEOAS (_links) para as próximas operações.
A criação é síncrona: quando você recebe 201, o endereço já existe e pode ser lido, atualizado ou deletado imediatamente pelo id retornado.
Idempotência
Criar é uma operação de escrita. Envie o cabeçalho X-Idempotency-Key para que uma repetição segura (ex.: timeout de rede + retry) não crie endereços duplicados. Veja Idempotência.
Quando usar
- Checkout / e-commerce: registrar o endereço de entrega ou cobrança no momento da compra.
- Cadastro de cliente: capturar o endereço durante o registro inicial.
- Perfil do usuário: permitir que o usuário adicione um novo endereço à sua conta.
- Importação: sincronizar endereços vindos do seu CRM/ERP.
Quando NÃO usar: se o endereço já existe e você só quer alterá-lo, use Atualizar (PUT) em vez de criar um novo. Para apenas consultar um endereço existente, use Ler ou Listar.
Requisição
Headers
| Cabeçalho | Obrigatório | Valor |
|---|---|---|
SelectKey | Sim | Sua chave de API. Produção: sl_live_...; sandbox: sl_test_.... Nunca use Authorization: Bearer/Basic. Veja Autenticação. |
Content-Type | Sim | application/json |
X-Idempotency-Key | Recomendado | Chave única para tornar o retry seguro. Veja Idempotência. |
Corpo
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
country | string | Sim | Código do país (ISO, 2–3 letras), ex.: "BR". |
postcode | string | Sim | CEP no formato brasileiro. Aceita 01310-100 (com hífen) ou 01310100. Padrão: ^\d{5}-?\d{3}$. |
street | string | Não | Logradouro (rua/avenida), ex.: "Av. Paulista". |
number | string | Não | Número, ex.: "1000". É string, não inteiro. |
complement | string | Não | Complemento (apto, sala, bloco), ex.: "Apt 42". |
district | string | Não | Bairro/distrito, ex.: "Bela Vista". |
city | string | Não | Cidade, ex.: "São Paulo". |
state | string | Não | Estado/província, ex.: "SP". |
Importante
O vínculo do endereço (a quem ele pertence) não vai no corpo: é resolvido pelo contexto da sua SelectKey e devolvido na resposta como ownerType/ownerId. Da mesma forma, campos como primary, latitude, longitude e metadata aparecem na resposta (preenchidos pelo servidor quando aplicável), mas não fazem parte do corpo de criação deste contrato.
Exemplo curl
curl -X POST https://api.selectwin.io/v1/addresses \
-H "SelectKey: sl_live_aBcDeFgHiJkLmNoPqRsTuVwXyZ" \
-H "Content-Type: application/json" \
-H "X-Idempotency-Key: 2f1c9a7e-checkout-001" \
-d '{
"street": "Av. Paulista",
"number": "1000",
"complement": "Apt 42",
"district": "Bela Vista",
"city": "São Paulo",
"state": "SP",
"country": "BR",
"postcode": "01310-100"
}'Corpo mínimo
Apenas os campos obrigatórios:
{
"country": "BR",
"postcode": "01310-100"
}Resposta
201 Created — o corpo é o objeto completo do endereço no nível raiz, acrescido de merchant e _links.
{
"id": "addr_01hqzvabc",
"ownerType": "customer",
"ownerId": "cus_01hqzvabc",
"street": "Av. Paulista",
"number": "1000",
"complement": "Sala 1",
"district": "Bela Vista",
"city": "São Paulo",
"state": "SP",
"country": "BR",
"postcode": "01310100",
"latitude": null,
"longitude": null,
"primary": true,
"line": "Av. Paulista, 1000 - Bela Vista, São Paulo - SP, 01310100",
"line1": "Av. Paulista",
"line2": "1000",
"line3": "Bela Vista",
"metadata": null,
"updatedAt": "2026-04-12T17:56:33.000Z",
"createdAt": "2026-04-12T17:56:33.000Z",
"merchant": {
"name": "Seller Name",
"merchantId": "bus_1234567890",
"isSubAccount": false
},
"_links": {
"self": {
"href": "https://api.selectwin.io/v1/addresses/addr_01hqzvabc",
"method": "GET",
"description": "Read a address."
},
"create": {
"href": "https://api.selectwin.io/v1/addresses",
"method": "POST",
"description": "Create a new address."
},
"update": {
"href": "https://api.selectwin.io/v1/addresses/addr_01hqzvabc",
"method": "PUT",
"description": "Update the address."
},
"delete": {
"href": "https://api.selectwin.io/v1/addresses/addr_01hqzvabc",
"method": "DELETE",
"description": "Delete the address."
},
"list": {
"href": "https://api.selectwin.io/v1/addresses",
"method": "GET",
"description": "List all addresses."
}
}
}Campos-chave da resposta
| Campo | Tipo | Descrição |
|---|---|---|
id | string | Identificador público do endereço (prefixo addr_). Trate como opaco — não faça parsing. |
ownerType | string | Tipo do dono (ex.: customer). |
ownerId | string | ID do dono (ex.: cus_01hqzvabc). |
street / number / complement | string | Logradouro, número e complemento. |
district / city / state / country | string | Bairro, cidade, estado e país. |
postcode | string | CEP normalizado, sem máscara (ex.: 01310100). |
latitude / longitude | number | null | Coordenadas, quando disponíveis; null caso contrário. |
primary | boolean | Indica se este é o endereço principal do dono. |
line | string | Endereço completo formatado em uma linha (para exibição). |
line1 / line2 / line3 | string | Componentes do endereço em linhas separadas. |
metadata | object | null | Metadados livres associados ao endereço. |
createdAt / updatedAt | string (ISO 8601 UTC) | Datas de criação e última atualização. |
merchant | object | Dados do lojista: name, merchantId, isSubAccount. |
_links | object | Links HATEOAS para as próximas operações (self, create, update, delete, list). |
Dica
Em vez de montar URLs na mão, use _links para navegar. Por exemplo, _links.update.href já aponta para o endpoint de atualização deste endereço. Veja o padrão HATEOAS nas Convenções.
Entrada vs. saída: você envia o CEP com ou sem hífen (
01310-100); a resposta devolve normalizado (01310100). Não compare strings de CEP cruamente entre o que enviou e o que recebeu.
Erros
Em caso de falha, a API devolve o envelope padrão com error.code estável. Trate sempre pelo error.code, nunca pela message.
error.code | HTTP | Quando ocorre |
|---|---|---|
invalidParameters | 400 | Falha de validação: faltou country/postcode, CEP fora do padrão ^\d{5}-?\d{3}$, ou campo acima do limite. Veja error.params para o detalhe por campo. |
unauthorized | 401 | SelectKey ausente, inválida ou revogada. |
forbidden | 403 | Autenticado, mas sem permissão para esta operação. |
unprocessableEntity | 422 | Regra de negócio impede a criação. |
tooManyRequests | 429 | Limite de requisições excedido — respeite error.retryAfterMinutes e aplique backoff. |
serverError | 500 | Erro interno — repita com backoff; se persistir, contate o suporte. |
O recurso Addresses expõe
addressIdNotFound(404) nas operações que recebem umaddressId(ler, atualizar, deletar). Na criação não há ID na URL, então esse código não se aplica aqui. Veja o Catálogo de Códigos de Erro e o Tratamento de Erros.
Exemplo de erro de validação (400)
{
"error": {
"code": "invalidParameters",
"statusCode": 400,
"category": "validation",
"message": "Validation errors occurred.",
"params": [
{ "country": "This field is required." },
{ "postcode": "Postcode must match the format 00000-000." }
]
}
}Boas práticas
- Normalize antes de comparar. A API grava o CEP sem máscara. Se você guarda o CEP localmente, padronize o formato para evitar duplicidades aparentes.
- Sempre envie
X-Idempotency-Keyem criações disparadas por ações do usuário (checkout). Um retry após timeout não deve gerar dois endereços. Veja Idempotência. - Valide
countryepostcodeno cliente antes doPOST. São os únicos campos obrigatórios e a causa mais comum de400 invalidParameters. - Guarde o
idretornado (string completa, opaca) para ler, atualizar ou deletar o endereço depois. Não tente reconstruir o ID a partir de partes. - Use
_linkspara as próximas ações em vez de hardcodar URLs — isso deixa sua integração resiliente a mudanças de roteamento. - Reaproveite os campos
line/line1..3para exibir o endereço já formatado, em vez de concatenar os campos manualmente. - Trate
429e5xxcom backoff e odefaultda sua lógica de erro peloerror.statusCode, não pelamessage.
Veja também
- Visão geral de Endereços — o modelo do objeto e o ciclo de vida.
- Ler endereço — buscar um endereço pelo
id. - Atualizar endereço — substituir os dados de um endereço (
PUT). - Listar endereços — paginar e filtrar endereços.
- Deletar endereço — remover um endereço.
- Convenções · Autenticação · Idempotência · Catálogo de Códigos de Erro
How is this guide?