Farmatch API

Pedidos

Criação, consulta e atualização de pedidos autenticados por x-api-key.

Visão geral

Os endpoints de pedidos operam com isolamento por tenant e permitem controle de idempotência para evitar duplicações.

  • A criação (POST /orders) valida catálogo, disponibilidade na loja e estoque.
  • A listagem e a consulta retornam apenas pedidos da loja autenticada.
  • A atualização de status registra evento de timeline internamente.

POST/api/v1/orders

Cria pedido externo para a loja autenticada com controle de idempotência por provedor.

Headers

Headers aceitos para criação de pedido.

NomeTipoObrigatórioDescrição
x-api-keystringSimChave pública da loja.
x-idempotency-keystringNãoOpcional. Se enviado, deve ter no máximo 120 caracteres.
content-typeapplication/jsonSimTipo do payload enviado.

Body: campos de topo

Estrutura principal do payload.

NomeTipoObrigatórioDescrição
providerstringSimOrigem do pedido (2..64, permitido: letras, números, . _ -).
externalOrderIdstringNãoIdentificador externo do pedido (recomendado para idempotência).
sourceChannelstringNãoCanal de origem do pedido.
customerobjectNãoCliente do pedido. Quando enviado: name e phone são obrigatórios.
paymentMethodstringSimForma de pagamento.
changeFornumberNãoTroco em centavos (>= 0).
itemsarraySimLista de itens com EAN13 e quantidade.
deliveryobjectSimBloco de entrega (inclui taxa em centavos).

Body: itens

Regras para cada item do array items.

NomeTipoObrigatórioDescrição
items[].ean13stringSimEAN13 com mínimo de 8 caracteres.
items[].quantitynumberSimQuantidade inteira positiva.

Body: entrega

Campos do objeto delivery.

NomeTipoObrigatórioDescrição
delivery.typestringSimTipo de entrega.
delivery.addressstringSimEndereço completo em formato livre.
delivery.zipCodestringNãoCEP (mínimo de 3 caracteres).
delivery.streetstringNãoLogradouro.
delivery.numberstringNãoNúmero.
delivery.complementstringNãoComplemento.
delivery.neighborhoodstringNãoBairro.
delivery.citystringNãoCidade.
delivery.statestringNãoUF/estado.
delivery.feenumberSimTaxa de entrega em centavos (>= 0).
delivery.etaMinutesnumberNãoPrevisão de entrega em minutos (inteiro positivo).

Body exemplo

{
  "provider": "erp_x",
  "externalOrderId": "PEDIDO-ERP-123",
  "sourceChannel": "marketplace_b2b",
  "customer": {
    "name": "Maria Souza",
    "phone": "21999998888"
  },
  "paymentMethod": "pix",
  "changeFor": 5000,
  "items": [
    {
      "ean13": "7891234567890",
      "quantity": 2
    },
    {
      "ean13": "7894561239876",
      "quantity": 1
    }
  ],
  "delivery": {
    "type": "delivery",
    "address": "Rua Exemplo, 123 - Centro, Rio de Janeiro - RJ, 20000-000",
    "zipCode": "20000-000",
    "street": "Rua Exemplo",
    "number": "123",
    "neighborhood": "Centro",
    "city": "Rio de Janeiro",
    "state": "RJ",
    "fee": 750,
    "etaMinutes": 45
  }
}

Regras de idempotência

Comportamento para evitar pedidos duplicados.

NomeTipoObrigatórioDescrição
externalOrderIdstringNãoQuando enviado, é usado como chave idempotente por loja + provider.
x-idempotency-keystringNãoPode substituir externalOrderId. Se ambos forem enviados, precisam ser iguais.
idempotentReplaybooleanNãotrue quando a API retorna um pedido já existente (sem recriar).

Respostas

Status possíveis na criação de pedido.

201Pedido criado200Replay idempotente400Validação e regras de negócio401API key ausente ou inválida403Loja inativa ou chave revogada409Estoque insuficiente

Response 201 (novo pedido)

{
  "requestId": "1998af95-488f-47b0-a1f8-ecfd56b1200a",
  "success": true,
  "created": true,
  "idempotentReplay": false,
  "orderId": "j57f8r8r9k0m1n2p3q4r5s6t7u8v9w0x",
  "status": "created",
  "total": 3330,
  "provider": "erp_x",
  "externalOrderId": "PEDIDO-ERP-123"
}

Response 200 (replay idempotente)

{
  "requestId": "be6e0944-b6ad-4144-ab42-c34c610522ea",
  "success": true,
  "created": false,
  "idempotentReplay": true,
  "orderId": "j57f8r8r9k0m1n2p3q4r5s6t7u8v9w0x",
  "status": "created",
  "total": 3330,
  "provider": "erp_x",
  "externalOrderId": "PEDIDO-ERP-123"
}

Erros específicos do POST /orders

Códigos estáveis definidos no backend.

NomeTipoObrigatórioDescrição
invalid_idempotency_key400Nãox-idempotency-key acima de 120 caracteres.
idempotency_key_mismatch400NãoexternalOrderId e x-idempotency-key diferentes.
payment_method_not_available400NãoForma de pagamento não permitida na loja.
invalid_ean13400NãoEAN13 vazio ou inválido no payload.
product_not_found400NãoEAN13 não encontrado no catálogo global.
product_not_available_in_store400NãoProduto não disponível na loja autenticada.
order_creation_failed400NãoFalha genérica de criação sem código específico.
insufficient_stock409NãoEstoque insuficiente para um ou mais itens.
missing_api_key401NãoHeader x-api-key não enviado.
invalid_api_key401NãoAPI key não encontrada.
revoked_api_key403NãoAPI key revogada.
store_not_active403NãoLoja da API key está inativa.
Validação de schema (Zod)400NãoFalha de validação de body pelo schema Zod (sem error.code estável garantido).

GET/api/v1/orders

Lista pedidos da loja autenticada com filtro de status e limite.

Query Params

Parâmetros aceitos na listagem.

NomeTipoObrigatórioDescrição
statusstringNãocreated | confirmed | preparing | ready | delivering | delivered | canceled
limitnumberNãoInteiro entre 1 e 200 (padrão: 100).

Exemplo de request

GET /api/v1/orders?status=created&limit=20

Response 200

{
  "requestId": "5ec44e09-2c35-4dc2-97d2-5be3d510f352",
  "orders": [
    {
      "id": "j57f8r8r9k0m1n2p3q4r5s6t7u8v9w0x",
      "storeId": "loja_abc123",
      "status": "created",
      "paymentMethod": "pix",
      "total": 3330,
      "sourceProvider": "erp_x",
      "sourceExternalOrderId": "PEDIDO-ERP-123",
      "createdAt": 1739543807123
    }
  ]
}

Erros do GET /orders

Códigos estáveis definidos no backend.

NomeTipoObrigatórioDescrição
invalid_limit400Nãolimit fora do intervalo de 1 a 200.
invalid_status400Nãostatus fora da lista de valores aceitos.
missing_api_key401NãoHeader x-api-key não enviado.
invalid_api_key401NãoAPI key não encontrada.
revoked_api_key403NãoAPI key revogada.
store_not_active403NãoLoja da API key está inativa.

GET/api/v1/orders/:orderId

Retorna um pedido específico da loja autenticada.

Path Params

Parâmetro de rota obrigatório.

NomeTipoObrigatórioDescrição
orderIdstringSimIdentificador do pedido.

Exemplo de request

GET /api/v1/orders/j57f8r8r9k0m1n2p3q4r5s6t7u8v9w0x

Response 200

{
  "requestId": "16a9b445-3f58-4c13-a0cb-96bc1ec4e1a2",
  "order": {
    "id": "j57f8r8r9k0m1n2p3q4r5s6t7u8v9w0x",
    "storeId": "loja_abc123",
    "status": "created",
    "paymentMethod": "pix",
    "total": 3330,
    "items": [
      {
        "templateId": "j57f8r8r9k0m1n2p3q4r5s6t7u8v9w0x",
        "name": "Dipirona 500mg",
        "price": 1290,
        "quantity": 2
      }
    ],
    "delivery": {
      "type": "delivery",
      "address": "Rua Exemplo, 123 - Centro, Rio de Janeiro - RJ",
      "fee": 750
    },
    "createdAt": 1739543807123
  }
}

Erros do GET /orders/:orderId

Códigos estáveis definidos no backend.

NomeTipoObrigatórioDescrição
order_not_found_in_tenant404NãoPedido não encontrado para a loja da API key.
missing_api_key401NãoHeader x-api-key não enviado.
invalid_api_key401NãoAPI key não encontrada.
revoked_api_key403NãoAPI key revogada.
store_not_active403NãoLoja da API key está inativa.

PATCH/api/v1/orders/:orderId

Atualiza o status de um pedido e registra evento de status.

Body

Payload aceito para atualização de status.

NomeTipoObrigatórioDescrição
statusstringSimcreated | confirmed | preparing | ready | delivering | delivered | canceled

Body exemplo

{
  "status": "confirmed"
}

Response 200

{
  "requestId": "1998af95-488f-47b0-a1f8-ecfd56b1200a",
  "success": true,
  "orderId": "j57f8r8r9k0m1n2p3q4r5s6t7u8v9w0x",
  "status": "confirmed"
}

Erros do PATCH /orders/:orderId

Códigos estáveis definidos no backend.

NomeTipoObrigatórioDescrição
order_not_found_in_tenant404NãoPedido não encontrado para a loja da API key.
missing_api_key401NãoHeader x-api-key não enviado.
invalid_api_key401NãoAPI key não encontrada.
revoked_api_key403NãoAPI key revogada.
store_not_active403NãoLoja da API key está inativa.
Validação de schema (Zod)400NãoFalha de validação de body pelo schema Zod (sem error.code estável garantido).

On this page