Model M reproduces the integration contract your system already uses today, translating it to the Entregas Expressas platform. In most cases the migration is a change of base URL and credential — the rest of your code stays as it is.
base_url and api_key — all 34 endpoints come
ready to use, with sample bodies.
The protocol uses two base URLs — and your system probably already has both configured today, each in its own variable. Replace their values with:
| Base | URL | Used by |
|---|---|---|
| Primary | https://entregasexpressas.com.br/api/m |
All endpoints, except the one in the row below |
| Secondary | https://entregasexpressas.com.br/api/m/v1 |
Only GET request/{id} |
What comes after the base stays identical — {base}/abrirSolicitacao,
{base}/solicitacao and so on. Only the value of the variable changes; the code that
builds the calls stays as it is.
m identifies the model. Other compatibility models use the same pattern
with their own letter, which is why the URLs never clash with each other or with our
own API (/api/v1).
The secondary base is a newer generation of the protocol, which came to coexist with the old one instead of replacing it. It has its own conventions:
| Primary base | Secondary base | |
|---|---|---|
| Fields | Portuguese — id_mch, condutor, paradas |
English — request_id, driver, stops |
| Success | { "success": true, "response": … } |
The object itself, with no envelope |
| Error | { "success": false, "errors": [ … ] } |
{ "error": "…" } |
In other words: GET request/{id} returns the same data as
GET solicitacao, with different names and a different error format. Use whichever
your system already consumes — both remain available.
The collection is generated from the published endpoints, so it never goes out of date. It comes with two variables:
| Variable | Value |
|---|---|
base_url | Pre-filled with https://entregasexpressas.com.br |
api_key | Empty — paste the key provided by the delivery company |
The key lives in the variable rather than being written into the headers: an exported collection with a credential inside ends up in a public repository.
Send your key in the api-key header on every request. The key is provided
by the delivery company, and it is what identifies whose operation it is.
curl https://entregasexpressas.com.br/api/m/solicitacaoStatus?id_mch=1234 \
--header 'api-key: SUA_CHAVE'
If your system also sends HTTP Basic authentication, you can keep sending it: the header is accepted and does not need to be removed from your code.
There are two types of key, and the delivery company decides which one you receive:
| Type | Scope |
|---|---|
| Hub | All resources in the hub — requests, companies and couriers. |
| Company |
Only the company's own data: its requests, its profile, its balance and
its webhooks. All other endpoints respond with 403.
|
All responses are JSON. Success:
{ "success": true, "response": { ... } }
Business error, with a code for your system to branch on:
{ "success": false, "errors": [ { "code": 25, "message": "Solicitacao não encontrada." } ] }
The codes are the same ones your system already handles:
| Code | Meaning |
|---|---|
| 1 | Invalid credential |
| 2 | Required attribute missing |
| 5 / 6 | Invalid identification type / identification not found |
| 24 | Incorrect input format |
| 25 | Request not found |
| 27 | Request not finished |
| 56 | Courier not found |
| 75 / 76 | Scheduled request does not exist / is not awaiting dispatch |
| 97 | Request was grouped (includes solicitacao_agrupadora_id) |
| 101 / 119 | Duplicate webhook / invalid webhook id |
| Method | Endpoint | |
|---|---|---|
| POST | /abrirSolicitacao | Creates the request. With data and hora, creates a scheduled one. |
| GET | /estimarSolicitacao | Estimate of price, distance and time. Points in the query string, with the _partida and _desejado suffixes. |
| GET | /solicitacao | List or detail. Maximum window of 30 days. |
| GET | /solicitacaoStatus | Only the current status. |
| GET | /posicaoCondutor | Latitude and longitude of the courier. |
| GET | /reciboEntrega | Available once the request is finished. |
| GET | /obterLinkRastreio/{id} | Tracking link and confirmation code. |
| GET | /consultarProgramada | Scheduled requests awaiting dispatch. |
| POST | /cancelar | |
| POST | /cancelarProgramada | Only before dispatch. |
| GET | /api/m/v1/request/{id} | Details with fields in English. |
curl --request POST \
https://entregasexpressas.com.br/api/m/abrirSolicitacao \
--header 'api-key: SUA_CHAVE' \
--header 'Content-Type: application/json' \
--data '{
"forma_pagamento": "F",
"empresa_id": 845,
"partida": {
"endereco": "Rua Evandro Câmara, 717",
"bairro": "Monte Carmelo",
"cidade": "Montes Claros",
"estado": "MG",
"lat": "-16.7176723",
"lng": "-43.8341584"
},
"paradas": [
{
"endereco_parada": "Aeroporto de Montes Claros",
"bairro_parada": "Jaraguá",
"cidade_parada": "Montes Claros",
"estado_parada": "MG",
"lat_parada": "-16.7049531",
"lng_parada": "-43.8199862",
"id_externo": "714",
"nome_cliente_parada": "Ralph Wisozk",
"telefone_cliente_parada": "(38) 99999-9999",
"observacao_parada": "Entregar na portaria",
"valor_cobrar": 104.18
}
],
"retorno": false
}'
Response:
{ "success": true, "response": { "id_mch": "1234" } }
condutor block with tipo_identificacao and identificacao.
The courier is identified by id (I), CPF (C),
phone number (T) or license plate (P).
| Method | Endpoint |
|---|---|
| GET | /empresa |
| POST | /cadastrarEmpresa |
| PUT | /atualizarEmpresa/{id} |
| PUT | /atualizarEmpresas |
| GET | /listarAreasAtuacaoEmpresa |
| POST | /saldoCreditosEmpresa |
| POST | /recarregarCreditosEmpresa |
| POST | /sacarCreditosEmpresa |
In the credit endpoints, the company is identified by the empresa block:
id (I), CPF (F), CNPJ (J), phone number (T)
or contract number (C).
| Method | Endpoint |
|---|---|
| GET | /condutor |
| POST | /atualizarCondutor/{id} |
| PUT | /atualizarCondutores |
| POST | /obterDocumentosCadastroCondutor |
| POST | /obterDocumentosCondutor |
| POST | /documentoCondutor/{id} |
| POST | /saldoCreditosCondutor |
| POST | /recarregarCreditosCondutor |
| POST | /sacarCreditosCondutor |
Document upload is multipart/form-data with the tipo and
foto fields. See the accepted types in
/obterDocumentosCadastroCondutor.
Register a URL and receive an event on every status change of the request and on every confirmed delivery.
| Method | Endpoint |
|---|---|
| POST | /cadastrarWebhook |
| GET | /listarWebhook |
| PUT | /atualizarWebhook/{id} |
| DELETE | /deletarWebhook/{id} |
Body sent to your URL:
{
"datetime": "2026-08-26T13:20:05Z",
"event_id": "550e8400-e29b-41d4-a716-446655440000",
"request_id": 1234,
"status_code": "A",
"status_label": "ACCEPTED",
"stop_id": "abc123",
"links": {
"request": "https://entregasexpressas.com.br/api/m/v1/request/1234"
}
}
stop_id appears only in the confirmed delivery event
(STOP_FINISHED). Use event_id to discard resends: in case of
failure, the delivery is retried.
The Signature-V2 and Signature headers carry the HMAC-SHA-512 of the
body, signed with your API key.
tipo: "posicao" returns an error, instead of accepting it and never sending events.
| Query | Webhook | Meaning |
|---|---|---|
R | WAITING_PAYMENT | Awaiting payment |
L | WAITING_RELEASE | Scheduled or being prepared |
D | DISTRIBUTING | Looking for a courier |
A | ACCEPTED | Accepted — includes on the way and at the pickup location |
| — | ARRIVED_AT_LOCATION | Courier arrived at the location |
E | IN_PROGRESS | Picked up, in progress |
| — | STOP_FINISHED | A delivery was confirmed |
F | FINISHED | Finished |
C | CANCELLED | Canceled |
N | NOT_SERVED | Not served |
Arrival at the location is not a status of its own in the query: it is a stage of
A, and only the webhook distinguishes it.
| Code | Method |
|---|---|
F | Invoiced |
R | Credit wallet |
X | Pix |
C / B | Credit / debit |
D | Cash |
P / H | PicPay / WhatsApp |
Whatever is paid on delivery is recorded on the stop and passed on to the courier. When filtering requests by cash, debit or credit, the result includes all those paid on delivery, without separating them by method.
id_mch_programada and id_mch are the same number. The query without an
identifier lists only those still awaiting dispatch.
97 and the
identifier of the request that absorbed the deliveries — query that one instead.