PT EN
Sign in Sign up →
Model M · Migration

Model M

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.

Download the Postman collection Import it and fill in base_url and api_key — all 34 endpoints come ready to use, with sample bodies.
This model exists for those who already have this integration built. If you are just getting started, use the Full API or OpenDelivery — these are the platform's native integrations, with dedicated sandbox and support.

Base URL

The protocol uses two base URLs — and your system probably already has both configured today, each in its own variable. Replace their values with:

BaseURLUsed 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.

The 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).

Why there are two

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 baseSecondary 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.

Postman collection

The collection is generated from the published endpoints, so it never goes out of date. It comes with two variables:

VariableValue
base_urlPre-filled with https://entregasexpressas.com.br
api_keyEmpty — 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.

Authentication

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.

Key scope

There are two types of key, and the delivery company decides which one you receive:

TypeScope
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.
Keep the key on the server. It grants access to the resources in your scope and must not appear on the client side of the application.

Responses and errors

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:

CodeMeaning
1Invalid credential
2Required attribute missing
5 / 6Invalid identification type / identification not found
24Incorrect input format
25Request not found
27Request not finished
56Courier not found
75 / 76Scheduled request does not exist / is not awaiting dispatch
97Request was grouped (includes solicitacao_agrupadora_id)
101 / 119Duplicate webhook / invalid webhook id

Request

MethodEndpoint
POST/abrirSolicitacaoCreates the request. With data and hora, creates a scheduled one.
GET/estimarSolicitacaoEstimate of price, distance and time. Points in the query string, with the _partida and _desejado suffixes.
GET/solicitacaoList or detail. Maximum window of 30 days.
GET/solicitacaoStatusOnly the current status.
GET/posicaoCondutorLatitude and longitude of the courier.
GET/reciboEntregaAvailable once the request is finished.
GET/obterLinkRastreio/{id}Tracking link and confirmation code.
GET/consultarProgramadaScheduled requests awaiting dispatch.
POST/cancelar
POST/cancelarProgramadaOnly before dispatch.
GET/api/m/v1/request/{id}Details with fields in English.

Opening a request

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" } }
To direct the request to a specific courier, send the condutor block with tipo_identificacao and identificacao. The courier is identified by id (I), CPF (C), phone number (T) or license plate (P).

Company

MethodEndpoint
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).

Driver

MethodEndpoint
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.

Webhook

Register a URL and receive an event on every status change of the request and on every confirmed delivery.

MethodEndpoint
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.

The position webhook is not available yet. Registering tipo: "posicao" returns an error, instead of accepting it and never sending events.

Request statuses

QueryWebhookMeaning
RWAITING_PAYMENTAwaiting payment
LWAITING_RELEASEScheduled or being prepared
DDISTRIBUTINGLooking for a courier
AACCEPTEDAccepted — includes on the way and at the pickup location
—ARRIVED_AT_LOCATIONCourier arrived at the location
EIN_PROGRESSPicked up, in progress
—STOP_FINISHEDA delivery was confirmed
FFINISHEDFinished
CCANCELLEDCanceled
NNOT_SERVEDNot 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.

Payment methods

CodeMethod
FInvoiced
RCredit wallet
XPix
C / BCredit / debit
DCash
P / HPicPay / 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.

Behavior differences

Questions about the migration? Contact the delivery company responsible for your integration.