POST /api/v1/auth/token
Corpo (JSON)
| Campo | Obrigatório | Descrição |
api_key | sim | Chave pública |
api_secret | sim | Segredo em texto plano (não é o hash) |
Resposta 200 (data): access_token, refresh_token, token_type (Bearer), expires_in (segundos), ambiente.
Exemplo — corpo da requisição
{
"api_key": "kbx_demo_api_key_001",
"api_secret": "seu_segredo_em_texto_plano"
}
Exemplo — resposta 200 OK
{
"success": true,
"data": {
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxIiwiY2lkIjoiREVNTzAwMSIsImFtYiI6ImRlc2V2IiwidHlwIjoiYWNjZXNzIiwiaWF0IjoxNzE0MDAwMDAwLCJleHAiOjE3MTQwMDM2MDB9.exemplo_assinatura",
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxIiwidHlwIjoicmVmcmVzaCIsImV4cCI6MTcxNDYwNDgwMH0.exemplo_refresh",
"token_type": "Bearer",
"expires_in": 3600,
"ambiente": "desenv"
},
"error": null
}
Os JWT acima estão truncados/ilustrativos; na prática são strings longas em Base64.
Erros comuns: 400 (campos), 401 (credenciais), 403 (ambiente), 429 (rate limit).
POST /api/v1/auth/refresh
Corpo: refresh_token (JWT tipo refresh).
Resposta 200: access_token, token_type, expires_in, ambiente.
Exemplo — corpo da requisição
{
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxIiwidHlwIjoicmVmcmVzaCIsImV4cCI6MTcxNDYwNDgwMH0.exemplo_refresh"
}
Exemplo — resposta 200 OK
{
"success": true,
"data": {
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxIiwiY2lkIjoiREVNTzAwMSIsImFtYiI6ImRlc2V2IiwidHlwIjoiYWNjZXNzIiwiZXhwIjoxNzE0MDAzNjAwfQ.novo_access",
"token_type": "Bearer",
"expires_in": 3600,
"ambiente": "desenv"
},
"error": null
}
POST /api/v1/solicitacoes
Header: JWT (recomendado X-Kombex-Authorization: Bearer …).
Corpo (principais campos):
termo_aceite — obrigatório aceito (true, 1, "1", "Sim", "sim").
- Origem e destino:
origem_nome, origem_documento, origem_contato, origem_telefone, origem_cep, origem_rua, origem_numero, origem_bairro, origem_cidade, origem_estado e os equivalentes destino_*.
- Opcionais:
origem_complemento, destino_complemento, pagamento_frete, observacao.
itens — array não vazio; cada item com peso, valor_nf, quantidade ou qtde (≥ 1), e:
dimensoes: array de { "altura", "largura", "comprimento" } (cm), ou
metro_cubico > 0 se não houver dimensões válidas.
Resposta 201 (data): id, codigo, status (0 solicitado), valor_frete, metro_cubico_total, empresas_rota, resumo_rota.
Exemplo — corpo da requisição
Campos de origem/destino usam prefixos origem_* e destino_* no JSON (não objetos aninhados).
{
"termo_aceite": true,
"origem_nome": "Empresa A",
"origem_documento": "12.345.678/0001-90",
"origem_contato": "João",
"origem_telefone": "44999990000",
"origem_cep": "87000000",
"origem_rua": "Rua Um",
"origem_numero": "100",
"origem_bairro": "Centro",
"origem_cidade": "MARINGA",
"origem_estado": "PR",
"origem_complemento": "",
"destino_nome": "Empresa B",
"destino_documento": "98.765.432/0001-10",
"destino_contato": "Maria",
"destino_telefone": "44988887777",
"destino_cep": "86000000",
"destino_rua": "Rua Dois",
"destino_numero": "200",
"destino_bairro": "Zona 7",
"destino_cidade": "LONDRINA",
"destino_estado": "PR",
"destino_complemento": "",
"pagamento_frete": "origem",
"observacao": "",
"itens": [
{
"descricao": "SNF",
"quantidade": 1,
"peso": 10,
"valor_nf": 500,
"nf_doc": "NF-001",
"metro_cubico": 0,
"dimensoes": [
{ "altura": 35, "largura": 45, "comprimento": 55 },
{ "altura": 65, "largura": 70, "comprimento": 75 }
]
}
]
}
Exemplo — resposta 201 Created
{
"success": true,
"data": {
"id": 3049,
"codigo": "KMBX20260402123934DEC98C",
"status": 0,
"valor_frete": 118.09,
"metro_cubico_total": 0.428,
"empresas_rota": [
{
"empresa_id": 16,
"empresa_name": "EMPRESA XPTO - LONDRINA X MARINGÁ"
}
],
"resumo_rota": {
"status": "sucesso",
"resumo": "A EMPRESA XPTO - LONDRINA X MARINGÁ fará a coleta em MARINGA e entrega direta em LONDRINA",
"rota": [
{
"empresa_id": 16,
"empresa_name": "EMPRESA XPTO - LONDRINA X MARINGÁ",
"acao": "Coleta/Entrega",
"cidades": ["MARINGA", "LONDRINA"]
}
]
}
},
"error": null
}
Exemplo — erro 422 (frete/rota)
{
"success": false,
"data": {
"detalhes": "Mensagem explicando a regra de frete ou rota que não pôde ser atendida."
},
"error": "Não foi possível calcular o frete."
}
Erros: 400, 401, 422 (data.detalhes com motivo de frete/rota), 429, 500.
GET /api/v1/solicitacoes
Query (opcional):
| Parâmetro | Descrição |
status | Se informado, apenas 0 ou 1 retornam linhas; outros → lista vazia |
data_inicio / data_fim | YYYY-MM-DD, dentro da janela permitida |
page | Página (≥ 1) |
per_page | Itens por página (máximo definido no servidor) |
A listagem considera uma janela temporal retroativa limitada (ex.: últimos 30 dias até o fim do dia atual, conforme configuração). Sem status na query, entram em geral registros com status 0 ou 1.
Resposta 200: solicitacoes, periodo_consulta (data_inicio, data_fim, max_dias_retroativos), pagination (total, page, per_page, total_pages).
Exemplo — resposta 200 OK (GET /api/v1/solicitacoes?status=0&page=1&per_page=20)
{
"success": true,
"data": {
"solicitacoes": [
{
"id": 3049,
"codigo": "KMBX20260402123934DEC98C",
"cliente_id_api": "DEMO001",
"id_usuario_franqueado": 16,
"origem": {
"nome": "Empresa A",
"documento": "12.345.678/0001-90",
"contato": "João",
"telefone": "44999990000",
"cep": "87000000",
"rua": "Rua Um",
"numero": "100",
"complemento": "",
"bairro": "Centro",
"cidade": "MARINGA",
"estado": "PR"
},
"destino": {
"nome": "Empresa B",
"documento": "98.765.432/0001-10",
"contato": "Maria",
"telefone": "44988887777",
"cep": "86000000",
"rua": "Rua Dois",
"numero": "200",
"complemento": "",
"bairro": "Zona 7",
"cidade": "LONDRINA",
"estado": "PR"
},
"itens": [
{
"descricao": "SNF",
"quantidade": 1,
"peso": 10,
"valor_nf": 500,
"nf_doc": "NF-001",
"metro_cubico": 0,
"dimensoes": [
{ "altura": 35, "largura": 45, "comprimento": 55 },
{ "altura": 65, "largura": 70, "comprimento": 75 }
]
}
],
"resumo_rota": {
"status": "sucesso",
"rota": [
{
"empresa_id": 16,
"empresa_name": "EMPRESA XPTO - LONDRINA X MARINGÁ",
"acao": "Coleta/Entrega",
"cidades": ["MARINGA", "LONDRINA"]
}
],
"resumo": "A EMPRESA XPTO - LONDRINA X MARINGÁ fará a coleta em MARINGA e entrega direta em LONDRINA"
},
"data_criacao": "2026-04-02 09:39:34",
"data_atualizacao_status": null,
"status": 0,
"metro_cubico_total": "0.428",
"valor_frete": "118.09",
"pagamento_frete": "origem",
"observacao": "",
"prazo_entrega": "12 horas",
"termo_aceite": "Sim"
}
],
"periodo_consulta": {
"data_inicio": "2026-03-04",
"data_fim": "2026-04-03",
"max_dias_retroativos": 30
},
"pagination": {
"total": 1,
"page": 1,
"per_page": 20,
"total_pages": 1
}
},
"error": null
}
GET /api/v1/solicitacoes/{codigo}
Retorna apenas se a solicitação pertencer ao cliente_id do token.
data inclui: identificação, status, datas, valores, origem / destino aninhados, itens, resumo_rota, etc.
Exemplo — resposta 200 OK (data = um único objeto; mesmo formato de cada item de solicitacoes na listagem)
{
"success": true,
"data": {
"id": 3049,
"codigo": "KMBX20260402123934DEC98C",
"cliente_id_api": "DEMO001",
"id_usuario_franqueado": 16,
"origem": {
"nome": "Empresa A",
"documento": "12.345.678/0001-90",
"contato": "João",
"telefone": "44999990000",
"cep": "87000000",
"rua": "Rua Um",
"numero": "100",
"complemento": "",
"bairro": "Centro",
"cidade": "MARINGA",
"estado": "PR"
},
"destino": {
"nome": "Empresa B",
"documento": "98.765.432/0001-10",
"contato": "Maria",
"telefone": "44988887777",
"cep": "86000000",
"rua": "Rua Dois",
"numero": "200",
"complemento": "",
"bairro": "Zona 7",
"cidade": "LONDRINA",
"estado": "PR"
},
"itens": [
{
"descricao": "SNF",
"quantidade": 1,
"peso": 10,
"valor_nf": 500,
"nf_doc": "NF-001",
"metro_cubico": 0,
"dimensoes": [
{ "altura": 35, "largura": 45, "comprimento": 55 },
{ "altura": 65, "largura": 70, "comprimento": 75 }
]
}
],
"resumo_rota": {
"status": "sucesso",
"rota": [
{
"empresa_id": 16,
"empresa_name": "EMPRESA XPTO - LONDRINA X MARINGÁ",
"acao": "Coleta/Entrega",
"cidades": ["MARINGA", "LONDRINA"]
}
],
"resumo": "A EMPRESA XPTO - LONDRINA X MARINGÁ fará a coleta em MARINGA e entrega direta em LONDRINA"
},
"data_criacao": "2026-04-02 09:39:34",
"data_atualizacao_status": null,
"status": 0,
"metro_cubico_total": "0.428",
"valor_frete": "118.09",
"pagamento_frete": "origem",
"observacao": "",
"prazo_entrega": "12 horas",
"termo_aceite": "Sim"
},
"error": null
}
404 se não existir ou não for do cliente.
PUT /api/v1/solicitacoes/{codigo}/status
Uso restrito. Este endpoint não utiliza JWT do cliente. Exige o header X-Kombex-Internal-Secret com valor fornecido pela Kombex para integrações internas ou parceiros autorizados. Aplicações de cliente devem acompanhar mudanças via consultas ou webhooks.
Corpo: { "status": 2 } (inteiro conforme tabela de status).
Regras: não atualiza se o status atual for terminal — 409. Valores inválidos — 400. Endpoint indisponível se segredo interno não estiver configurado — 503.
Resposta 200: objeto completo da solicitação após atualização (mesmo formato do GET). Pode disparar webhooks de evento status.
Exemplo — corpo da requisição
Exemplo — resposta 200 OK (mesmo formato do GET por código; aqui status passou para 2 — em coleta)
{
"success": true,
"data": {
"id": 3049,
"codigo": "KMBX20260402123934DEC98C",
"cliente_id_api": "DEMO001",
"id_usuario_franqueado": 16,
"origem": {
"nome": "Empresa A",
"documento": "12.345.678/0001-90",
"contato": "João",
"telefone": "44999990000",
"cep": "87000000",
"rua": "Rua Um",
"numero": "100",
"complemento": "",
"bairro": "Centro",
"cidade": "MARINGA",
"estado": "PR"
},
"destino": {
"nome": "Empresa B",
"documento": "98.765.432/0001-10",
"contato": "Maria",
"telefone": "44988887777",
"cep": "86000000",
"rua": "Rua Dois",
"numero": "200",
"complemento": "",
"bairro": "Zona 7",
"cidade": "LONDRINA",
"estado": "PR"
},
"itens": [
{
"descricao": "SNF",
"quantidade": 1,
"peso": 10,
"valor_nf": 500,
"nf_doc": "NF-001",
"metro_cubico": 0,
"dimensoes": [
{ "altura": 35, "largura": 45, "comprimento": 55 },
{ "altura": 65, "largura": 70, "comprimento": 75 }
]
}
],
"resumo_rota": {
"status": "sucesso",
"rota": [
{
"empresa_id": 16,
"empresa_name": "EMPRESA XPTO - LONDRINA X MARINGÁ",
"acao": "Coleta/Entrega",
"cidades": ["MARINGA", "LONDRINA"]
}
],
"resumo": "A EMPRESA XPTO - LONDRINA X MARINGÁ fará a coleta em MARINGA e entrega direta em LONDRINA"
},
"data_criacao": "2026-04-02 09:39:34",
"data_atualizacao_status": "2026-04-02 14:22:10",
"status": 2,
"metro_cubico_total": "0.428",
"valor_frete": "118.09",
"pagamento_frete": "origem",
"observacao": "",
"prazo_entrega": "12 horas",
"termo_aceite": "Sim"
},
"error": null
}
DELETE /api/v1/solicitacoes/{codigo}
Cancela (status 9) se ainda não estiver em estado terminal; caso contrário 409.
Resposta 200 (data): mensagem, codigo, id, status, data_atualizacao_status.
Exemplo — resposta 200 OK (sem corpo na requisição além do JWT no header)
{
"success": true,
"data": {
"mensagem": "Solicitação cancelada com sucesso.",
"codigo": "KMBX20260402123934DEC98C",
"id": 3049,
"status": 9,
"data_atualizacao_status": "2026-04-02 16:05:00"
},
"error": null
}
POST /api/v1/webhooks · GET /api/v1/webhooks
POST — corpo: url (obrigatório), eventos (opcional; padrão status; lista separada por vírgula ou *), secret (opcional, para assinatura HMAC).
POST — resposta 201: id, url, eventos.
GET — resposta 200: webhooks array com itens ativos (id, url, eventos, ativo, created_at).
POST — exemplo de corpo
{
"url": "https://seu-sistema.com/webhook/kombex",
"eventos": "status",
"secret": "opcional_para_hmac_sha256"
}
POST — exemplo de resposta 201 Created
{
"success": true,
"data": {
"id": 12,
"url": "https://seu-sistema.com/webhook/kombex",
"eventos": "status"
},
"error": null
}
GET — exemplo de resposta 200 OK
{
"success": true,
"data": {
"webhooks": [
{
"id": 12,
"url": "https://seu-sistema.com/webhook/kombex",
"eventos": "status",
"ativo": "Sim",
"created_at": "2026-04-01 10:00:00"
}
]
},
"error": null
}