API Completa (Full)
Esta API é o acesso amplo à operação da empresa de entregas — pedidos, clientes, entregadores, tipos de veículo, webhooks. Use quando seu sistema integra com uma empresa de entregas específica que te forneceu uma API key (ex.: ERP/painel interno conectado à operação dela). Endpoints em português, payload e respostas em JSON.
Introdução
A integração Full dá acesso ao mesmo conjunto de operações que a empresa de entregas usa no próprio painel admin: criação de pedidos, acompanhamento de status, gestão dos clientes que pedem entrega, consulta de tipos de veículo disponíveis e subscrição a webhooks. Diferente da OpenDelivery, que é multi-cliente e usa OAuth, a Full é 1-pra-1: uma API key emitida pela própria empresa de entregas, fixa, com permissão sobre a operação dela.
Fluxo típico:
- A empresa de entregas te entrega a API key (Bearer token).
- Você usa POST /v1/orders/calcular para simular preço/distância antes do consumidor confirmar.
- Cria o pedido com POST /v1/orders (ou tudo em um único call com POST /v1/chamar-entregador).
- Acompanha em tempo real via webhook, assinando os eventos que usa, ou polling do GET /v1/orders/{id}.
URL base
Todos os endpoints abaixo são relativos a esta base, no domínio da empresa de entregas:
https://entregasexpressas.com.br/api/v1
🔑 Autenticação
Todas as chamadas exigem o header Authorization: Bearer <sua-api-key>.
A key é estática (não expira por tempo); só muda se for regerada manualmente. Trate como senha — não exponha em
código de front-end. Regerar pode ser feito a qualquer momento na aba Credenciais do app no portal.
Sempre envie também Accept: application/json e Content-Type: application/json nos
requests com body.
Dois tipos de chave
A empresa de entregas pode emitir dois tipos de API key, e o que cada uma alcança é diferente:
| Chave | O que alcança |
|---|---|
| Chave da praça | A operação inteira daquela praça: pedidos de todos os contratantes, cadastro de usuários, entregadores, lançamentos na carteira e bloqueios. |
| Chave de um contratante | Só o que é dele: os próprios pedidos, o próprio cadastro e o próprio saldo. Mexer em dinheiro, bloquear e consultar entregadores respondem 403. |
A separação existe porque as duas coisas não são a mesma: quem lê o próprio saldo não pode creditá-lo, e a equipe de entregadores é da empresa, não de quem contrata a entrega.
// 403 — a credencial não alcança o recurso
{"mensagem": "Esta credencial não tem acesso a este recurso"}
Exemplo cURL
curl https://entregasexpressas.com.br/api/v1/tipos-veiculos \
-H "Authorization: Bearer <sua-api-key>" \
-H "Accept: application/json"
Calcular valor
Antes de enviar o pedido você pode simular o valor enviando os dados da entrega — devolve distância, preço bruto e descrições formatadas. Não cria nada no sistema.
Corpo do request
| Campo | Tipo | Descrição |
|---|---|---|
tipo_veiculo_id obrigatório | integer | ID do Tipo de Veículo (consulte /v1/tipos-veiculos). |
categoria_id | integer | ID da Categoria do tipo de veículo (/v1/tipos-veiculos/{id}/categorias). |
endereco_coleta obrigatório | object | Objeto endereço de coleta — ver schema abaixo. |
endereco_coleta.endereco obrigatório | string | Descrição textual do endereço. Se latitude/longitude não vierem, geocodificamos a partir daqui. |
endereco_coleta.latitude | number | Latitude. Obrigatório se não enviar o endereço textual. |
endereco_coleta.longitude | number | Longitude. Obrigatório se não enviar o endereço textual. |
endereco_coleta.nome | string | Nome do responsável na coleta. |
endereco_coleta.telefone | string | Telefone do responsável. |
enderecos_entrega obrigatório | object[] | Array de endereços de entrega, mínimo 1. |
enderecos_entrega[].endereco obrigatório | string | Descrição do endereço de entrega. |
enderecos_entrega[].latitude | number | Latitude do endereço. |
enderecos_entrega[].longitude | number | Longitude do endereço. |
enderecos_entrega[].nome | string | Nome do recebedor. |
enderecos_entrega[].telefone | string | Telefone do recebedor. |
cliente_id | integer | ID do Cliente (obrigatório se não for enviado o objeto cliente). |
dimensoes_pacote | object | Dimensões do pacote — pode ser obrigatório em alguns tipos de veículo. |
dimensoes_pacote.peso | number | Peso do pacote. |
dimensoes_pacote.largura | number | Largura do pacote. |
dimensoes_pacote.altura | number | Altura do pacote. |
dimensoes_pacote.comprimento | number | Comprimento do pacote. |
retorno_necessario | boolean | Se o entregador deve retornar ao local de coleta depois da última entrega. |
prova_entrega_necessaria | boolean | Se o entregador deve coletar assinatura e documento em cada entrega. |
Exemplo
curl -X POST https://entregasexpressas.com.br/api/v1/orders/calcular \
-H "Authorization: Bearer <sua-api-key>" \
-H "Content-Type: application/json" \
-d '{
"tipo_veiculo_id": 1,
"categoria_id": 3,
"cliente_id": 3,
"endereco_coleta": {
"endereco": "Rua teste, 123 - Teste, São Paulo - SP, 00000-000",
"latitude": -23.570914,
"longitude": -46.645079,
"nome": "João",
"telefone": "(11) 99999-9923"
},
"enderecos_entrega": [
{
"endereco": "Rua teste, 33 - Teste 2, São Paulo - SP, 00000-000",
"latitude": -23.585292,
"longitude": -46.655723,
"nome": "Maria",
"telefone": "(11) 12131-9923"
}
],
"dimensoes_pacote": { "peso": 15, "largura": 15, "altura": 15, "comprimento": 15 },
"retorno_necessario": true,
"prova_entrega_necessaria": false
}'
Resposta 200
| Campo | Tipo | Descrição |
|---|---|---|
preco | number | Valor do pedido (bruto). |
distancia | number | Distância em km do endereço de coleta até o último endereço de entrega (ou retorno, se aplicável). |
precoDescricao | string | Valor formatado em R$. |
distanciaDescricao | string | Distância formatada (ex.: 5,42 km). |
{
"preco": 12.50,
"distancia": 5.42,
"precoDescricao": "R$ 12,50",
"distanciaDescricao": "5,42 km"
}
Novo pedido
Cria um pedido de entrega. Os endereços de coleta e entrega devem conter latitude/longitude,
ou o endereço textual para geocodificação automática. Pré-requisito: o cliente existe (use cliente_id) ou
envie o objeto cliente aninhado.
Corpo do request
| Campo | Tipo | Descrição |
|---|---|---|
tipo_veiculo_id obrigatório | integer | ID do Tipo de Veículo. |
categoria_id | integer | ID da Categoria. |
endereco_coleta obrigatório | object | Mesmo schema do /calcular, mais external_id (string). |
endereco_coleta.external_id | string | ID externo do endereço no seu sistema. |
enderecos_entrega obrigatório | object[] | Mesmo schema do /calcular, mais external_id e order_display_id. |
enderecos_entrega[].external_id | string | ID externo do endereço de entrega. |
enderecos_entrega[].order_display_id | string | ID de exibição do pedido associado ao endereço (visível quando exibição de ID externo está habilitada). |
cliente_id | integer | ID do Cliente. Obrigatório se não enviar o objeto cliente. |
cliente | object | Cria o usuário inline. Obrigatório se não enviar cliente_id. |
cliente.nome obrigatório com cliente | string | Nome do cliente. |
cliente.email obrigatório com cliente | string | Email do cliente. |
cliente.telefone obrigatório com cliente | string | Telefone do cliente. |
cliente.senha obrigatório com cliente | string | Senha (mínimo 6 caracteres). |
external_id | string | ID externo do pedido para referência no seu sistema. Aparece em todos os webhooks subsequentes. |
dimensoes_pacote | object | Dimensões do pacote: peso, largura, altura, comprimento (ver /calcular). |
retorno_necessario | boolean | Retorno ao local de coleta após última entrega. |
prova_entrega_necessaria | boolean | Coletar foto/assinatura/documento em cada entrega. |
observacao | string | Observação livre do pedido (entregador vê no app). |
metodo_pagamento | enum | faturadocarteira — default: faturado. |
status_inicial | enum | pendingpreparing — pending busca entregador imediatamente; preparing mantém em preparo. Default: pending. |
agendamento_segundos | integer | Segundos a partir de agora para agendar o pedido. Quando enviado, ignora status_inicial e o pedido entra como scheduled. |
pending → accepted →
arrived_pickup_location → collected → delivered → completed.
Casos especiais: scheduled, preparing, waiting, cancelled. Use
webhooks pra acompanhar sem polling.
Listar pedidos
Lista os pedidos paginados. Também é possível buscar pedidos específicos por id ou external_id.
Query string
| Param | Tipo | Descrição |
|---|---|---|
page | integer | Número da página (default: 1). |
limit | integer | Itens por página (máx: 100, default: 50). |
id | integer | Filtrar por ID do pedido (busca direta sem paginação). |
public_id | string | Filtrar pelo número do pedido (public_id, busca direta sem paginação). |
external_id | string | Filtrar por ID externo do pedido (busca direta sem paginação). |
Resposta 200
Retorna a paginação padrão do Laravel com data[] contendo um objeto Pedido por item — schema completo em
Objeto Pedido.
{
"current_page": 1,
"data": [ /* objetos Pedido */ ],
"first_page_url": "...",
"from": 1,
"last_page": 4,
"last_page_url": "...",
"limit": 50,
"next_page_url": "...",
"path": "https://entregasexpressas.com.br/api/v1/orders",
"prev_page_url": null,
"to": 50,
"total": 187
}
Obter pedido
Busca os dados de um pedido específico pelo seu ID.
URL params
| Param | Tipo | Descrição |
|---|---|---|
order obrigatório | integer | string | ID do pedido ou o public_id. Exemplo: 127 ou A7K2. |
Resposta 200
Retorna o objeto Pedido completo — ver Objeto Pedido.
// 404
{"mensagem": "Pedido não encontrado"}
Cancelar pedido
Cancela um pedido. Disponível apenas para pedidos que ainda não foram aceitos
(pending, waiting, scheduled ou preparing).
Respostas
// 200 OK
{"mensagem": "Pedido cancelado"}
// 400 — status atual não permite cancelamento
{"mensagem": "O pedido não pode ser cancelado"}
// 404
{"mensagem": "Pedido não encontrado"}
Chamar entregador (one-shot)
Cria um pedido do tipo chamar entregador, onde os endereços de entrega serão definidos pelo entregador no
momento da coleta. É necessário informar a quantidade de locais de entrega (num_locais_entrega).
Também cria o usuário inline se cliente_id não for enviado.
Corpo do request
| Campo | Tipo | Descrição |
|---|---|---|
cliente_id | integer | ID do Cliente. Obrigatório se não enviar o objeto cliente. |
cliente | object | Cria o usuário inline. Obrigatório se não enviar cliente_id. |
cliente.nome obrigatório com cliente | string | Nome do cliente. |
cliente.email obrigatório com cliente | string | Email do cliente. |
cliente.telefone obrigatório com cliente | string | Telefone do cliente. |
cliente.senha obrigatório com cliente | string | Senha (mínimo 6 caracteres). |
endereco_coleta obrigatório | object | Endereço de coleta com endereco, latitude e longitude obrigatórios. |
num_locais_entrega obrigatório | integer | Quantidade de locais de entrega que o entregador vai informar. |
tipo_veiculo_id | integer | ID do Tipo de Veículo. |
retorno_necessario | boolean | Retorno ao local de coleta. |
prova_entrega | boolean | Coletar prova de entrega. |
observacao | string | Observação do pedido. |
metodo_pagamento | enum | faturadocarteira_digital |
status_inicial | enum | pendingpreparing — default pending. |
agendamento_segundos | integer | Segundos a partir de agora para agendar. Quando enviado, ignora status_inicial. |
Resposta 201 — exemplo
{
"id": 128,
"order_status": "pending",
"status": "Pendente",
"total_value": 0,
"distance": 0,
"pickup_location_data": {
"endereco": "Rua teste, 123 - Teste, São Paulo - SP, 00000-000",
"latitude": -23.570914,
"longitude": -46.645079
},
"delivery_locations_data": [
{"endereco": "Endereço de Entrega #1 (Definido no momento da entrega)", "latitude": null, "longitude": null, "delivered": false},
{"endereco": "Endereço de Entrega #2 (Definido no momento da entrega)", "latitude": null, "longitude": null, "delivered": false}
]
}
Schema completo da resposta em Objeto Pedido.
Usuários (clientes)
CRUD dos usuários (clientes) que disparam pedidos pela empresa. Cada usuário pertence a uma central (praça) — o ID da central vem implícito no API key.
Listar / buscar usuários
| Query param | Tipo | Descrição |
|---|---|---|
email | string | Filtrar por email do usuário. |
external_id | string | Filtrar por ID externo do usuário. |
Obter usuário
// 404
{"mensagem": "Usuário não encontrado"}
Cadastrar usuário
| Campo | Tipo | Descrição |
|---|---|---|
nome obrigatório | string | Nome do usuário (máx 191). |
email obrigatório | string | Email (único por cliente). |
senha obrigatório | string | Senha (mínimo 6, máx 191). |
telefone obrigatório | string | Telefone (máx 191). |
external_id | string | ID externo do usuário no seu sistema (máx 191). |
// Request
{
"nome": "Novo Usuário",
"email": "[email protected]",
"senha": "0346nlkasd",
"telefone": "(11) 12532-1234",
"external_id": "12516"
}
// 400 — validação
{"mensagem": "Erro de validação", "errors": {"email": ["O email informado está em uso"]}}
Editar usuário
Atualiza os dados de um usuário existente. Apenas os campos enviados são atualizados.
| Campo | Tipo | Descrição |
|---|---|---|
nome | string | Novo nome. |
telefone | string | Novo telefone. |
external_id | string | Novo ID externo. |
senha | string | Nova senha (mínimo 6). |
bloqueado | boolean | Bloqueia ou desbloqueia o contratante. Só vale quando o campo é enviado — omitir mantém o estado atual. Ver Bloquear / desbloquear. |
// 404
{"mensagem": "Usuário não encontrado"}
Objeto Usuário (resposta)
| Campo | Tipo | Descrição |
|---|---|---|
data.id | integer | ID do usuário. |
data.nome | string | Nome do usuário. |
data.email | string | Email do usuário. |
data.telefone | string | Telefone do usuário. |
data.external_id | string | ID externo no seu sistema. |
data.faturamento | boolean | Indica se o usuário tem faturamento habilitado. |
data.saldo | number | Saldo da carteira digital. |
data.bloqueado | boolean | Indica se o contratante está bloqueado de lançar pedidos. |
data.has_media | boolean | Indica se o usuário tem imagem. |
data.media | object[] | Imagens do usuário. |
data.data_criacao | string | Data de criação do cadastro. |
Gerar token de acesso
Gera um token de acesso para um usuário. Se o usuário não existir, ele é criado automaticamente com os dados enviados — por isso todos os campos do cadastro são obrigatórios.
| Campo | Tipo | Descrição |
|---|---|---|
nome obrigatório | string | Nome do usuário. |
email obrigatório | string | Email do usuário. |
senha obrigatório | string | Senha do usuário. |
telefone obrigatório | string | Telefone do usuário. |
// 201
{"token": "aB3dEf4gHi5jKl6mNo7pQr8sTu9vWx0yZ1aB2cD3eF4gH5iJ6kL7mN8oP9q"}
// 400 — validação
{"mensagem": "Erro de validação", "errors": {"email": ["O campo email é obrigatório"]}}
Bloquear / desbloquear contratante
Bloquear corta a entrada: o contratante deixa de lançar pedido, pelo portal e pela API. Não cancela nem interrompe o que já está em andamento — pedido na rua continua sendo operado normalmente.
Os dois devolvem o objeto Usuário atualizado, com o campo
bloqueado. Nenhum corpo é necessário.
O mesmo estado também pode ser enviado no PUT /v1/usuarios/{id}, no campo opcional
bloqueado — é a mesma coisa, para quem sincroniza o cadastro inteiro numa chamada só. Omitir o campo
mantém o estado atual.
curl -X POST https://entregasexpressas.com.br/api/v1/usuarios/3/bloqueio \
-H "Authorization: Bearer <sua-api-key>" \
-H "Accept: application/json"
// 200
{"data": {"id": 3, "nome": "Loja Centro", "bloqueado": true, "saldo": 152.40}}
Carteira (saldo, extrato e lançamentos)
A carteira digital é o saldo pré-pago que a empresa de entregas mantém para cada contratante e para cada entregador. Estes endpoints leem o saldo, leem o extrato e fazem os lançamentos manuais — os mesmos que o painel faz nas telas "Adicionar saldo" e "Remover saldo".
| Endpoint | O que faz |
|---|---|
GET /v1/usuarios/{id}/carteira | Saldo atual do contratante. |
GET /v1/usuarios/{id}/carteira/transacoes | Extrato do contratante, paginado. |
POST /v1/usuarios/{id}/carteira/creditos | Acrescenta saldo. |
POST /v1/usuarios/{id}/carteira/debitos | Retira saldo. |
POST /v1/usuarios/{id}/carteira/recargas | Registra uma recarga já paga, com taxa. |
GET /v1/entregadores/{id}/carteira | Saldo atual do entregador. |
GET /v1/entregadores/{id}/carteira/transacoes | Extrato do entregador, paginado. |
POST /v1/entregadores/{id}/carteira/creditos | Acrescenta saldo. |
POST /v1/entregadores/{id}/carteira/debitos | Retira saldo. |
POST /v1/entregadores/{id}/carteira/recargas | Registra um depósito do entregador. |
Reenvio seguro (external_id)
Todo lançamento aceita um external_id — o identificador daquele lançamento no seu
sistema. Ele existe por um motivo prático: timeout de rede é o caso comum de uma integração, e sem uma
chave de idempotência a retentativa de um POST de dinheiro credita duas vezes.
- Primeira chamada: 201 com
"duplicada": false. - Reenvio com o mesmo
external_id: 200 com"duplicada": truee o mesmo lançamento — nada é criado, nada é somado.
A chave é única por carteira. Use um valor que o seu sistema saiba reproduzir na retentativa (o id do
movimento no seu ERP, por exemplo) — um valor sorteado a cada tentativa não protege de nada. Sem
external_id, cada chamada é um lançamento novo.
Consultar saldo
// 200
{"data": {"usuario_id": 3, "saldo": 152.40}}
usuario_id é o dono da carteira. Quando o id consultado é de um subusuário, a
resposta traz o do titular: subusuário não tem carteira própria, ele gasta a da loja.
Extrato
| Query param | Tipo | Descrição |
|---|---|---|
operacao | enum | creditodebito |
external_id | string | Localiza o lançamento pela sua chave de idempotência — é como conferir se um POST que deu timeout entrou. |
por_pagina | integer | 1 a 200. Padrão 50. |
pagina | integer | Padrão 1. |
// 200
{
"data": [
{
"id": 8813,
"uuid": "1f0a…",
"operacao": "credito",
"tipo": "adicao_saldo",
"valor": 200.00,
"descricao": "Recarga via Pix — comprovante 8812",
"status": "concluido",
"external_id": "erp-recarga-4410",
"forma_pagamento": "pix",
"referencia_id": null,
"data_criacao": "2026-09-09T14:02:11.000000Z"
}
],
"meta": {"pagina": 1, "por_pagina": 50, "total": 137, "saldo": 448.90}
}
Acrescentar saldo
Crédito manual — o mesmo lançamento que o painel faz em "Adicionar saldo".
| Campo | Tipo | Descrição |
|---|---|---|
valor obrigatório | number | Maior que zero. Duas casas decimais. |
descricao | string | Texto que aparece no extrato (máx 191). Em branco, vira -. |
external_id | string | Chave de idempotência (máx 191). Ver acima. |
curl -X POST https://entregasexpressas.com.br/api/v1/usuarios/3/carteira/creditos \
-H "Authorization: Bearer <sua-api-key>" \
-H "Content-Type: application/json" \
-d '{"valor": 100.50, "descricao": "Bônus de campanha", "external_id": "erp-credito-9931"}'
// 201
{
"data": {"id": 8812, "operacao": "credito", "tipo": "adicao_saldo", "valor": 100.50, "status": "concluido", "external_id": "erp-credito-9931"},
"saldo": 252.90,
"duplicada": false
}
Retirar saldo
| Campo | Tipo | Descrição |
|---|---|---|
valor obrigatório | number | Maior que zero. |
descricao | string | Texto que aparece no extrato. |
external_id | string | Chave de idempotência. |
permitir_saldo_negativo | boolean | Padrão true, como no painel. Com false, a chamada é recusada quando o saldo não cobre o valor. |
// 400 — só quando permitir_saldo_negativo = false
{"mensagem": "Saldo insuficiente para o débito"}
Registrar recarga
Registra uma recarga que o contratante já pagou. É o mesmo crédito de
carteira/creditos, com duas diferenças:
- a forma de pagamento é obrigatória e fica gravada no extrato;
- a taxa de recarga configurada pela empresa de entregas é aplicada por padrão — a mesma que incide quando o pagamento chega pelo gateway. Ela vira um débito próprio, ligado à recarga, e aparece no extrato como "Taxa de recarga".
| Campo | Tipo | Descrição |
|---|---|---|
valor obrigatório | number | Maior que zero. |
forma_pagamento obrigatório | enum | pixboletocredit_carddinheirotransferenciaoutro |
descricao | string | Texto que aparece no extrato. |
external_id | string | Chave de idempotência. |
aplicar_taxa | boolean | Padrão true. Com false, credita o valor cheio e não lança taxa nenhuma. |
A taxa só existe para pix, boleto e credit_card, e só quando a empresa de
entregas a configurou — nas demais formas, e onde ela não está configurada, o valor entra cheio e o bloco
taxa não aparece na resposta.
// 201
{
"data": {"id": 8813, "operacao": "credito", "tipo": "adicao_saldo", "valor": 200.00, "forma_pagamento": "pix"},
"taxa": {"valor": 4.00, "transacao_id": 8814},
"saldo": 448.90,
"duplicada": false
}
Carteira do entregador
Os mesmos quatro endpoints existem para o entregador, trocando usuarios por
entregadores e o id do contratante pelo id do entregador (o id devolvido
por /v1/entregadores).
- O saldo do entregador fica negativo no uso normal da operação — é assim que a comissão do app é cobrada dele. Por isso o débito não confere saldo por padrão.
- Em
carteira/recargasdo entregador não há taxa: a taxa de recarga é configurada para o contratante e não descreve o depósito de um entregador.forma_pagamentocontinua obrigatória, para o extrato dizer de onde veio o dinheiro.
Entregadores
Consulta da equipe de entregadores da empresa, situação em tempo real, bloqueio de acesso e bloqueio só de saque. A carteira deles está na seção Carteira.
Listar entregadores
| Query param | Tipo | Descrição |
|---|---|---|
email | string | Filtrar por e-mail. |
telefone | string | Filtrar por telefone. |
cpf | string | Filtrar por documento. |
placa | string | Filtrar pela placa do veículo. |
ativo | boolean | Em operação no app agora. |
bloqueado | boolean | Bloqueados ou não bloqueados. |
aprovado | boolean | Cadastro aprovado ou não. |
por_pagina | integer | 1 a 200. Padrão 50. |
pagina | integer | Padrão 1. |
Objeto Entregador (resposta)
| Campo | Tipo | Descrição |
|---|---|---|
id | integer | ID do entregador — é o que os endpoints de carteira e bloqueio recebem. |
nome | string | Nome do entregador. |
email | string | E-mail. |
telefone | string | Telefone. |
cpf | string | Documento. |
ativo | boolean | Se ele está em operação no app agora. Quem liga e desliga isso é ele, no aplicativo. |
aprovado | boolean | Se o cadastro foi aprovado pela empresa. |
bloqueado | boolean | Se ele está bloqueado. |
bloqueado_ate | string | Data do desbloqueio automático, quando houver. |
veiculo | object | modelo, cor e placa. |
tipos_servico | object[] | Tipos de serviço que ele atende (id, nome). |
saldo | number | Saldo da carteira dele. |
saque_bloqueado | boolean | Se os saques da carteira estão bloqueados. Ver Bloquear saque. |
data_criacao | string | Data de criação do cadastro. |
// 200
{
"data": [
{
"id": 12,
"nome": "João Souza",
"email": "[email protected]",
"telefone": "(11) 99999-8888",
"cpf": "000.000.000-00",
"ativo": true,
"aprovado": true,
"bloqueado": false,
"bloqueado_ate": null,
"veiculo": {"modelo": "Honda CG 160", "cor": "Vermelho", "placa": "ABC1D23"},
"tipos_servico": [{"id": 1, "nome": "Moto"}],
"saldo": -18.70,
"saque_bloqueado": false,
"data_criacao": "2026-03-02T11:20:00.000000Z"
}
],
"meta": {"pagina": 1, "por_pagina": 50, "total": 34}
}
Entregadores online
Só os entregadores online agora, do que mandou posição mais recentemente para o mais antigo, com a mesma paginação da listagem. Cada item é um objeto Courier completo; os eventos de entregador do webhook trazem um recorte dele.
| Query param | Tipo | Descrição |
|---|---|---|
status | string | available ou busy. Sem ele, vêm os dois. |
por_pagina | integer | 1 a 200. Padrão 50. |
pagina | integer | Padrão 1. |
Obter entregador
Bloquear / desbloquear entregador
Bloquear tira o entregador de operação: ele deixa de receber oferta de pedido e não consegue aceitar o que já estava na tela dele. Não interrompe pedido em andamento — bloquear no meio do expediente não pode deixar entrega órfã na rua; ele conclui o que está com ele.
| Campo | Tipo | Descrição |
|---|---|---|
bloqueado_ate | string | Data/hora do desbloqueio automático (ISO 8601), no futuro. Sem ela, o bloqueio vale até alguém desbloquear. |
bloqueado: false e ativo como estava.
curl -X POST https://entregasexpressas.com.br/api/v1/entregadores/12/bloqueio \
-H "Authorization: Bearer <sua-api-key>" \
-H "Content-Type: application/json" \
-d '{"bloqueado_ate": "2026-09-20T18:00:00-03:00"}'
// 200
{"data": {"id": 12, "nome": "João Souza", "ativo": false, "bloqueado": true, "bloqueado_ate": "2026-09-20T21:00:00.000000Z"}}
Bloquear / desbloquear saque
Bloqueia só os saques e as antecipações da carteira. O entregador continua online, recebendo, aceitando e
entregando pedidos normalmente. A resposta é o objeto Entregador, com saque_bloqueado atualizado.
curl -X POST https://entregasexpressas.com.br/api/v1/entregadores/12/bloqueio-saque \
-H "Authorization: Bearer <sua-api-key>"
// 200
{"data": {"id": 12, "nome": "João Souza", "ativo": true, "saque_bloqueado": true, ...}}
Tipos de veículo & categorias
Cada empresa configura quais tipos de veículo opera (moto, carro etc.) e, opcionalmente, categorias dentro de cada tipo (ex.: "Moto com bag" vs "Moto sem bag"). Use estes endpoints pra montar os pickers do seu sistema e pra descobrir limites de peso/dimensão antes de enviar o pedido.
Listar tipos de veículo
| Query param | Tipo | Descrição |
|---|---|---|
nome | string | Filtra pelo nome do tipo de veículo (busca LIKE). |
Campos da resposta
| Campo | Tipo | Descrição |
|---|---|---|
id | integer | ID do tipo de veículo. |
nome | string | Nome do tipo de veículo. |
peso_e_dimensoes | boolean | Indica se o tipo de veículo exige peso/dimensões do pacote. |
limitar_peso_e_dimensoes | boolean | Indica se limita peso/dimensões (rejeita pedido acima dos máximos). |
altura_maxima | number | Altura máxima permitida para o pacote. |
largura_maxima | number | Largura máxima permitida. |
comprimento_maximo | number | Comprimento máximo permitido. |
peso_maximo | number | Peso máximo permitido. |
has_media | boolean | Indica se o tipo de veículo tem imagem. |
media | object[] | Imagens do tipo de veículo. |
Obter tipo de veículo
// 200
{"id": 1, "nome": "Moto"}
// 404
{"mensagem": "Tipo de veículo não encontrado"}
Listar categorias do tipo de veículo
| Query param | Tipo | Descrição |
|---|---|---|
nome | string | Filtra pelo nome da categoria (busca LIKE). |
Campos da resposta
| Campo | Tipo | Descrição |
|---|---|---|
id | integer | ID da categoria. |
nome | string | Nome da categoria. |
has_media | boolean | Indica se a categoria tem imagem. |
media | object[] | Imagens da categoria. |
// 404
{"message": "Tipo de veículo não encontrado"}
Webhooks
Em vez de fazer polling de /orders/{id}, cadastre uma URL de webhook
com a lista de eventos que ela deve receber. A cada evento, a
Plataforma envia um POST JSON para essa URL, com o nome do evento em event. A URL é
configurada pelos endpoints abaixo ou no painel da empresa de entregas.
200 ou
201 de forma recorrente leva à desativação da URL de webhook.
Eventos
Assine só o que sua integração usa. Cada URL recebe exatamente os eventos da lista eventos, que pode
ser alterada a qualquer momento pelo PATCH /v1/webhooks/{id}.
| Evento | Quando é enviado |
|---|---|
ORDER_CREATED | Pedido criado. |
ORDER_SEARCHING_COURIER | Pedido passou a procurar entregador (pending), na criação ou quando volta para a busca. |
ORDER_ACCEPTED | Entregador aceitou o pedido (accepted). |
COURIER_ASSIGNED | O entregador do pedido foi trocado depois do aceite. No aceite em si, sai só o ORDER_ACCEPTED. |
ORDER_ARRIVED_AT_PICKUP | Entregador chegou ao local de coleta (arrived_pickup_location). |
ORDER_COLLECTED | Pedido coletado (collected). |
ORDER_COMPLETED | Pedido concluído (completed). |
ORDER_CANCELLED | Pedido cancelado (cancelled). |
ORDER_UPDATED | Qualquer outra alteração do pedido: dados, valores, paradas e os status sem evento próprio (delivered, preparing…). Alterações em sequência podem chegar juntas em um envio só. |
ORDER_DELETED | Pedido excluído. |
COURIER_ONLINE plano | Entregador ficou online. |
COURIER_OFFLINE plano | Entregador ficou offline, inclusive por bloqueio (aí o status vem blocked). |
COURIER_LOCATION_UPDATED plano | Posição do entregador. Sai aproximadamente a cada 1 minuto por entregador, e só quando ele se moveu desde o último envio. |
courier.
Cabeçalhos enviados na entrega
| Cabeçalho | Valor |
|---|---|
Content-Type | application/json |
Accept | application/json |
webhook-security | Código de segurança configurado em codigo_seguranca (se definido). Use pra validar que veio da Plataforma. |
Status do pedido (order_status)
| Status | Descrição |
|---|---|
waiting | Pedido com pagamento online aguardando pagamento (só em pedidos com pagamento online). |
scheduled | Pedido agendado pra entrar futuramente em pending. |
preparing | Pedido em preparo (apenas quando a opção está ativa para a praça). |
pending | Buscando entregador. |
accepted | Aceito por um entregador. |
arrived_pickup_location | Entregador no local de coleta. |
collected | Pedido coletado. |
delivered | Todas as entregas concluídas; entregador em retorno (só em pedidos com retorno). |
completed | Pedido finalizado com sucesso. |
cancelled | Pedido cancelado. |
delivery_locations_data vem com delivery_failed = true. Se o pedido não tinha retorno
(need_return_to_pickup_location = false) e a configuração de "retorno em caso de falha" está ativa,
need_return_to_pickup_location é automaticamente alterado para true.
Listar webhooks
Obter webhook
Cadastrar webhook
| Campo | Tipo | Descrição |
|---|---|---|
url obrigatório | string | URL HTTPS que vai receber os POSTs. Única por praça. |
codigo_seguranca | string | Código de segurança que será enviado no header webhook-security em cada POST. Máx 191. Use-o pra validar a origem da request. |
eventos recomendado | string[] | Eventos que a URL vai receber (ver Eventos). Sem este campo, a URL é cadastrada no formato legado. |
// Request
{
"url": "https://entregas-expressas.teste",
"codigo_seguranca": "Aas#asdg@fngasd",
"eventos": ["ORDER_ACCEPTED", "ORDER_COLLECTED", "ORDER_COMPLETED", "ORDER_CANCELLED", "COURIER_LOCATION_UPDATED"]
}
// 400 — validação
{"mensagem": "Erro de validação", "errors": {"url": ["Uma URL de webhook com este endereço já existe"]}}
// 403 — evento de entregador fora do plano
{"mensagem": "Eventos de entregador estão disponíveis nos planos Premium e Platina"}
Alterar webhook
Troca os eventos ou o código de segurança de uma URL já cadastrada. Só os campos enviados mudam. É também o
caminho para migrar uma URL do formato legado: basta enviar a lista de eventos.
// Request
{"eventos": ["ORDER_CREATED", "ORDER_CANCELLED", "COURIER_ONLINE", "COURIER_OFFLINE"]}
Remover webhook
// 200
{"mensagem": "Webhook removido com sucesso"}
// 404
{"mensagem": "Webhook não encontrado"}
Objeto Webhook (resposta)
| Campo | Tipo | Descrição |
|---|---|---|
id | integer | ID da URL de webhook. |
url | string | URL configurada. |
codigo_seguranca | string | Código de segurança (vai no header webhook-security). |
eventos | string[]|null | Eventos assinados. null indica uma URL no formato legado. |
Payload entregue na sua URL
Nos eventos de pedido, o envio é um POST com event + objeto Pedido completo (ver
Objeto Pedido). Use o order_status e os campos de data
do pedido como fonte da verdade: a ordem de chegada entre dois eventos não é garantida.
{
"event": "ORDER_ACCEPTED",
"order": {
"id": 1234,
"public_id": "A7K2",
"uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"external_id": null,
"user_id": 10,
"started_at": "2025-01-15 10:30:00",
"pickup_location": "Rua Exemplo, 100 - Centro",
"pickup_location_data": {
"latitude": -23.5505,
"longitude": -46.6333,
"endereco": "Rua Exemplo, 100 - Centro"
},
"delivery_locations_data": [
{
"id": "abc123",
"latitude": -23.5605,
"longitude": -46.6433,
"endereco": "Rua Destino, 200 - Bairro",
"rua": "Rua Destino",
"numero": "200",
"bairro": "Bairro",
"cidade": "Sao Paulo",
"estado": "SP",
"complemento": "Apto 101",
"cep": "01001-000",
"nome": "Joao Silva",
"telefone": "(11) 99999-9999",
"external_id": "123",
"order_display_id": "PED-001",
"delivered": false,
"delivered_date": null,
"delivery_failed": false,
"evidence": {
"photo": "https://exemplo.com/foto.jpg",
"photos": ["https://exemplo.com/foto.jpg"],
"signature": null,
"document": "123.456.789-00",
"name": "Joao Silva",
"observation": null
}
}
],
"need_return_to_pickup_location": false,
"need_delivery_proof": false,
"distance": 5.2,
"return_distance": 0,
"total_value": 15.50,
"customer_observation": "Pedido via integração",
"valor_pedidos": 89.90,
"offline_payment_method_id": null,
"pagamento_faturado": false,
"payment_gateway": "carteira_digital",
"gateway_method": null,
"payment_code": null,
"payment_base64": null,
"payment_expiration_date": null,
"payment_url": null,
"payment_status": "paid",
"order_status": "accepted",
"type": "delivery",
"status_observation": null,
"category_id": 1,
"vehicle_type_id": 1,
"height": null,
"length": null,
"width": null,
"weight": null,
"created_at": "2025-01-15T10:30:00.000000Z",
"updated_at": "2025-01-15T10:35:00.000000Z",
"accepted_at": "2025-01-15T10:35:00.000000Z",
"arrived_pickup_location_at": null,
"arrived_limit_date": null,
"picked_up_at": null,
"finished_at": null,
"collect_limit_date": null,
"pickup_code": "1234",
"status": "Aceito",
"courier": "Carlos Entregador",
"courier_data": {
"id": 5,
"name": "Carlos Entregador",
"location": {
"latitude": -23.5510,
"longitude": -46.6340
}
},
"category": {"id": 1, "name": "Alimentação"},
"vehicle_type": {"id": 1, "name": "Moto"},
"user": {
"id": 10,
"email": "[email protected]",
"name": "Restaurante Exemplo",
"external_id": null
},
"tracking_url": "https://entregasexpressas.com.br/tracking/a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}
}
Payload dos eventos de entregador
event + um recorte do objeto Courier em
courier, igual nos três eventos, com a situação e a posição do momento do envio:
id, name, online, status, last_seen_at,
location e active_orders. Veículo, telefone e tipos de serviço ficam em
/v1/entregadores/online.
COURIER_LOCATION_UPDATED sai
aproximadamente a cada 1 minuto por entregador, e só quando ele se moveu desde o último envio: entregador
parado não gera evento. Use o last_seen_at para saber de quando é a posição.
{
"event": "COURIER_LOCATION_UPDATED",
"courier": {
"id": 12,
"name": "João Souza",
"online": true,
"status": "busy",
"last_seen_at": "2026-09-28T14:02:11.000000Z",
"location": {"latitude": -23.5505, "longitude": -46.6333},
"active_orders": [{"id": 48213, "external_id": "PED-001", "order_status": "collected"}]
}
}
Formato legado
URLs cadastradas sem eventos ("eventos": null na resposta) seguem funcionando como
antes, por compatibilidade: recebem ORDER_CREATED, ORDER_UPDATED (qualquer mudança de
status ou de dados do pedido) e ORDER_DELETED de todos os pedidos, com o mesmo objeto Pedido.
Não recebem eventos de entregador.
eventos no PATCH /v1/webhooks/{id}. Quem quer o
mesmo volume de antes assina todos os eventos de pedido.
Objeto Pedido (schema completo)
Schema da resposta dos endpoints POST /v1/orders,
GET /v1/orders (em data[]),
GET /v1/orders/{id},
POST /v1/chamar-entregador e do payload do
webhook (em order).
Campos principais
| Campo | Tipo | Descrição |
|---|---|---|
id | integer | ID do pedido, para as chamadas à API. |
public_id | string | Número do pedido como ele aparece para as pessoas na plataforma (ex.: "A7K2"). É o número para mostrar no seu sistema. |
uuid | string | Identificador único universal do pedido. |
central_id | integer | ID da central/praça do pedido. |
external_id | string | ID externo do pedido para referência no seu sistema. |
user_id | integer | ID do cliente que abriu o pedido. |
started_at | string | Data/hora em que o pedido começou a ser processado. |
order_status | enum | waitingscheduledpreparingpendingacceptedarrived_pickup_locationcollecteddeliveredcompletedcancelled |
order_status_date | string | Data/hora da última mudança de status. |
status | string | Descrição traduzida do status (ex.: "Aceito"). |
status_observation | string | Observação sobre o status (ex.: motivo de cancelamento). |
tracking_url | string | URL pública de rastreamento (mostre ao consumidor final). |
pickup_code | string? | Código que o entregador apresenta na coleta (se habilitado pelo administrador). Nullable. |
customer_observation | string | Observação livre do consumidor. |
Endereços
| Campo | Tipo | Descrição |
|---|---|---|
pickup_location | string | Descrição textual do endereço de coleta. |
pickup_location_data | object | Endereço de coleta estruturado. |
pickup_location_data.endereco | string | Descrição do endereço. |
pickup_location_data.latitude | number | Latitude. |
pickup_location_data.longitude | number | Longitude. |
pickup_location_data.nome | string | Nome do responsável. |
pickup_location_data.telefone | string | Telefone do responsável. |
pickup_location_data.external_id | string | ID externo do endereço. |
delivery_locations_data | object[] | Lista dos endereços de entrega. |
delivery_locations_data[].id | string | ID único da parada (gerado pela Plataforma). |
delivery_locations_data[].latitude | number | Latitude. |
delivery_locations_data[].longitude | number | Longitude. |
delivery_locations_data[].endereco | string | Endereço completo. |
delivery_locations_data[].rua | string | Logradouro. |
delivery_locations_data[].numero | string | Número. |
delivery_locations_data[].bairro | string | Bairro. |
delivery_locations_data[].cidade | string | Cidade. |
delivery_locations_data[].estado | string | UF. |
delivery_locations_data[].complemento | string | Complemento. |
delivery_locations_data[].cep | string | CEP. |
delivery_locations_data[].nome | string | Nome do recebedor. |
delivery_locations_data[].telefone | string | Telefone do recebedor. |
delivery_locations_data[].external_id | string | ID externo do endereço de entrega. |
delivery_locations_data[].order_display_id | string | ID de exibição do pedido nesse endereço. |
delivery_locations_data[].codigo_confirmacao | string | Código de confirmação do endereço (Se habilitado pelo administrador). |
delivery_locations_data[].delivered | boolean | Se o endereço já foi entregue. |
delivery_locations_data[].delivered_date | string | Data/hora da entrega. |
delivery_locations_data[].delivery_failed | boolean | Se houve falha. Aciona auto-flip de need_return_to_pickup_location quando aplicável (ver callout em Webhooks). |
delivery_locations_data[].evidence | object | Prova de entrega coletada. |
delivery_locations_data[].evidence.photo | string | URL da foto. |
delivery_locations_data[].evidence.photos | string[] | URLs de todas as fotos (a primeira também vem em photo). |
delivery_locations_data[].evidence.signature | string | URL da assinatura. |
delivery_locations_data[].evidence.document | string | Documento do recebedor (ex.: CPF). |
delivery_locations_data[].evidence.name | string | Nome do recebedor informado. |
delivery_locations_data[].evidence.observation | string | Observação deixada pelo entregador. |
need_return_to_pickup_location | boolean | Indica retorno ao local de coleta. Pode ser alterado automaticamente para true caso uma entrega falhe e a configuração de "retorno em caso de falha" esteja ativa. |
need_delivery_proof | boolean | Se o entregador deve coletar assinatura/documento em cada entrega. |
distance | number | Distância total do pedido (km). |
return_distance | number | Distância do retorno ao local de coleta (km). |
Pacote e veículo
| Campo | Tipo | Descrição |
|---|---|---|
category_id | integer | ID da categoria. |
vehicle_type_id | integer | ID do tipo de veículo. |
category | object | Objeto categoria expandido: { id, name }. |
vehicle_type | object | Objeto tipo de veículo expandido: { id, name }. |
height | number | Altura do pacote. |
length | number | Comprimento do pacote. |
width | number | Largura do pacote. |
weight | number | Peso do pacote. |
Pagamento
| Campo | Tipo | Descrição |
|---|---|---|
total_value | number | Valor total do pedido. |
valor_pedidos | number | Valor declarado das mercadorias. |
pagamento_faturado | boolean | Se o pagamento é faturado pela empresa de entregas. |
offline_payment_method_id | integer | ID do método de pagamento offline (quando aplicável). |
payment_gateway | string | Gateway de pagamento utilizado (ex.: carteira_digital). |
gateway_method | string | Método específico do gateway. |
payment_code | string | Código de pagamento (ex.: copia-e-cola PIX). |
payment_base64 | string | Dados do pagamento em base64 (ex.: QR Code PIX). |
payment_url | string | URL de pagamento. |
payment_expiration_date | string | Data de expiração do pagamento. |
payment_status | string | Status do pagamento. |
Timestamps de ciclo
| Campo | Tipo | Descrição |
|---|---|---|
created_at | string | Data de criação. |
updated_at | string | Data da última atualização. |
accepted_at | string | Quando o entregador aceitou. |
arrived_pickup_location_at | string | Quando o entregador chegou na coleta. |
arrived_limit_date | string | Data limite para chegada na coleta antes de cobranças adicionais (se configurado). |
picked_up_at | string | Quando o pedido foi coletado. |
finished_at | string | Quando o pedido foi finalizado. |
collect_limit_date | string | Data limite para coleta antes de cobranças adicionais (se configurado). |
Entregador
| Campo | Tipo | Descrição |
|---|---|---|
courier | string | Nome do entregador (atalho). |
courier_data | object | Objeto entregador expandido. |
courier_data.id | integer | ID do entregador. |
courier_data.name | string | Nome do entregador. |
courier_data.location | object | Localização em tempo real do entregador. Enviado apenas enquanto o pedido está em andamento. |
courier_data.location.latitude | number | Latitude do entregador. |
courier_data.location.longitude | number | Longitude do entregador. |
Cliente do pedido (user)
| Campo | Tipo | Descrição |
|---|---|---|
user.id | integer | ID do cliente. |
user.name | string | Nome. |
user.email | string | Email. |
user.external_id | string | ID externo do cliente no seu sistema. |
Objeto Courier (entregador)
Cada item de /v1/entregadores/online traz o objeto
completo; os eventos de entregador do webhook trazem um recorte dele em courier (ver
quais campos). Os nomes seguem o objeto
Pedido: id, name e location são os mesmos do courier_data,
e cada pedido em active_orders usa order_status.
| Campo | Tipo | No webhook | Descrição |
|---|---|---|---|
id | integer | sim | ID do entregador, o mesmo de courier_data.id no pedido. |
name | string | sim | Nome do entregador. |
phone | string | — | Telefone. |
online | boolean | sim | Se ele está online no app agora. |
status | string | sim | available (online, sem pedido), busy (online, com pedido em andamento), offline ou blocked (bloqueado pela empresa; pedido que ele ainda está terminando continua em active_orders). |
last_seen_at | string | sim | Data da última localização enviada pelo app. |
location | object|null | sim | Posição atual ou a última conhecida (latitude, longitude). |
vehicle | object | — | model, color e plate. |
vehicle_types | object[] | — | Tipos de serviço que ele atende (id, name), como o vehicle_type do pedido. |
active_orders | object[] | sim | Pedidos em andamento com ele (id, external_id, order_status). Vazio quando não há. |
updated_at | string | — | Data da última alteração do cadastro ou da posição. |
{
"id": 12,
"name": "João Souza",
"phone": "(11) 99999-8888",
"online": true,
"status": "busy",
"last_seen_at": "2026-09-28T14:02:11.000000Z",
"location": {"latitude": -23.5505, "longitude": -46.6333},
"vehicle": {"model": "Honda CG 160", "color": "Vermelho", "plate": "ABC1D23"},
"vehicle_types": [{"id": 1, "name": "Moto"}],
"active_orders": [{"id": 48213, "external_id": "PED-001", "order_status": "collected"}],
"updated_at": "2026-09-28T14:02:11.000000Z"
}
Códigos de erro
| HTTP | Quando |
|---|---|
| 200/201 | Sucesso. 201 em criação. |
| 400 | Request malformada (JSON inválido, campos obrigatórios ausentes). |
| 401 | API key ausente, inválida ou desativada. |
| 403 | API key válida mas sem permissão pra esse recurso (ex.: sub-user com permissão restrita). |
| 404 | Pedido/usuário/recurso não encontrado. |
| 422 | Validação de regra de negócio falhou (ex.: cancelar pedido já entregue, status inválido). |
| 500 | Erro interno — tente novamente com backoff. |
Respostas de erro seguem o padrão da Plataforma — mensagem em mensagem (não message):
{
"mensagem": "Erro de validação",
"errors": {
"tipo_veiculo_id": ["O campo tipo_veiculo_id é obrigatório"]
}
}
Em rotas de busca o not-found vem como {"mensagem": "Pedido não encontrado"} (idem para usuário, webhook, tipo de veículo). Já o endpoint de categorias usa message ({"message": "Tipo de veículo não encontrado"}) — pequena inconsistência herdada.
Usar o painel do desenvolvedor
O ciclo completo de teste acontece no portal. Cada app Full recebe automaticamente:
- Uma praça sandbox (Central) isolada da operação real.
- Um usuário admin dessa praça que você pode acessar via botão Acessar plataforma sandbox do app (no topo da página do app ou na aba Credenciais) — útil pra ver pelos olhos do administrador como as coisas estão.
- Um token de teste de admin, válido apenas dentro dessa praça.
- Aba Inspeção com cada request que você fizer (body, response, headers, status).
Passo a passo
- Crie um app Full no painel.
- Aba Credenciais: copie o
Bearer Tokene use-o no headerAuthorization. - Aba Webhook: cole sua URL HTTPS pra receber eventos durante os testes.
- Faça chamadas pelo seu sistema/cURL/Postman. Cada request aparece em Inspeção em segundos.
- Use o botão Acessar plataforma sandbox do app pra ver o pedido criado pelo lado da empresa (mapa, atribuição, financeiro) — útil pra debugar comportamentos que dependem de regras configuradas pela empresa.