Pular para o conteúdo principal

Criar Pedido

Cria um novo pedido associado a produtos.

POST /sellers/orders/

Headers

HeaderValorObrigatório
Content-Typeapplication/jsonSim
AuthorizationBearer mk_<env>_<token>Sim

Campos obrigatórios

Para criar um pedido com produto (items preenchido), envie obrigatoriamente:

CampoTipoDescrição
customer.namestringNome completo do cliente
customer.tax_idstringCPF (11 dígitos) ou CNPJ (14 dígitos)
customer.emailstringEmail do cliente
customer.addressobjectEndereço de entrega estruturado (obrigatório quando há produto físico no pedido)
items[].product_uuidstringUUID do produto
items[].quantityintegerQuantidade do produto

Para criar uma cobrança avulsa sem produto (items omitido ou vazio):

CampoTipoDescrição
customer.name, customer.tax_id, customer.emailMesmos campos do cliente
payment.gross_amountintegerObrigatório neste cenário. Valor bruto da cobrança em centavos.
Valores monetários

Todo campo que termina em _amount é um inteiro, em centavos. Exemplo: 15000 = R$ 150,00.

Parâmetros do Body

ParâmetroTipoObrigatórioDescrição
customerobjectSimDados do cliente (ver abaixo)
itemsarrayNãoLista de itens do pedido. Omita ou envie [] para criar uma cobrança avulsa sem produto (nesse caso payment.gross_amount é obrigatório).
paymentobjectSimDados do pagamento
postback_urlstring | nullNãoURL de webhook deste pedido. Recebe os eventos order.* e order_item.* do pedido. Ver seção Webhook por pedido.

Objeto customer

CampoTipoObrigatórioDescrição
namestringSimNome completo do cliente
tax_idstringSimCPF (11 dígitos) ou CNPJ (14 dígitos). Pontuação é ignorada.
tax_id_typestringNão"CPF" ou "CNPJ". Se omitido, é deduzido pelo número de dígitos de tax_id.
emailstringSimEmail do cliente
phonestringNãoTelefone do cliente
addressobjectSim*Endereço estruturado (ver abaixo)

*Obrigatório para produtos físicos.

Objeto customer.address

CampoTipoObrigatórioDescrição
streetstringSimLogradouro (rua/avenida)
numberstringNãoNúmero. Use "S/N" quando não houver
complementstring | nullNãoComplemento (apto, bloco, etc.)
neighborhoodstringSimBairro
citystringSimCidade
statestringSimUF em 2 letras maiúsculas (ex.: SP)
postal_codestringSimCEP no formato 12345-678 ou 8 dígitos
countrystringNãoCódigo ISO 3166-1 alpha-2. Default: "BR"
Endereço no retorno

Pedidos criados via API recebem um endereço gravado em formato canônico ("Rua Exemplo, 123 — Centro, São Paulo - SP, 01000-000, BR") e o retorno dos endpoints de detalhe e listagem expõe o endereço como string única. Uma representação estruturada no output está prevista para uma versão futura.

Objeto items[]

CampoTipoObrigatórioDescrição
product_uuidstringSimUUID do produto
quantityintegerSimQuantidade (mínimo 1)

Objeto payment

CampoTipoObrigatórioDescrição
gross_amountintegerCondicionalValor bruto da cobrança em centavos (ex: 15000 = R$ 150,00). Se omitido e items preenchido, é calculado automaticamente a partir do total dos itens. Obrigatório quando items é vazio ou omitido.
shipping_amountintegerNãoFrete em centavos (default 0)
discount_amountintegerNãoDesconto em centavos (default 0)
expiration_datestringNãoData de expiração
debtor_namestringNãoNome do pagador
debtor_documentstringNãoDocumento do pagador

Webhook por pedido (postback_url)

Informe postback_url na criação para receber as atualizações daquele pedido específico em uma URL própria, sem precisar configurar um webhook global.

  • Eventos entregues: order.created, order.paid, order.expired, order.cancelled, order.refunded, order.chargeback, order_item.shipped e order_item.delivered — sempre escopados a este pedido.
  • Soma, não substitui: as entregas vão para o postback_url além dos seus webhooks globais (POST /config/webhooks/) já cadastrados. Os webhooks globais continuam recebendo os eventos normalmente.
  • Formato do payload: idêntico ao dos webhooks globais (mesmo envelope event / occurred_at / data). Ver Eventos de Webhook.
Sem assinatura HMAC

Diferente dos webhooks globais, as entregas para postback_url não incluem o header X-Webhook-Signature (não há secret associado a um postback por pedido). Para garantir a autenticidade:

  • use sempre HTTPS;
  • inclua um token secreto na própria URL (ex.: https://seu-site.com/webhooks/pedidos?token=um-token-dificil-de-adivinhar) e valide-o ao receber a chamada.

Exemplo de Requisição

curl -X POST https://api.somosmarcha.com/api/v1/sellers/orders/ \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $API_KEY" \
-d '{
"customer": {
"name": "Maria da Silva",
"tax_id": "12345678901",
"email": "[email protected]",
"phone": "11999998888",
"address": {
"street": "Rua Exemplo",
"number": "123",
"neighborhood": "Centro",
"city": "São Paulo",
"state": "SP",
"postal_code": "01000-000"
}
},
"items": [
{
"product_uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"quantity": 1
}
],
"payment": {
"gross_amount": 15000
},
"postback_url": "https://seu-site.com/webhooks/pedidos?token=um-token-dificil-de-adivinhar"
}'

Resposta de Sucesso

Status: 201 Created

{
"message": "Pedido criado com sucesso!",
"data": {
"uuid": "f9e8d7c6-b5a4-4321-9876-123456789abc",
"status": "PENDING",
"gross_amount": 15000,
"postback_url": "https://seu-site.com/webhooks/pedidos?token=um-token-dificil-de-adivinhar",
"items": [
{
"product_uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "Plano Premium",
"quantity": 1,
"line_total_amount": 15000
}
],
"customer": {
"uuid": "c1d2e3f4-5678-90ab-cdef-1234567890ab",
"name": "Maria da Silva"
},
"pix": {
"qr_code_id": "qr_abc123",
"copy_and_paste": "00020126580014br.gov.bcb.pix...",
"qr_code_image_base64": "iVBORw0KGgoAAAANSUhEUgAAASIAAAEiAQAAAAB1xeIbAAA...",
"transaction_uuid": null
}
}
}
Campo pix.qr_code_image_base64

Base64 puro de um PNG do QR Code do PIX, sem o prefixo data:image/png;base64,. O QR Code é gerado pelo backend a partir do copy_and_paste, garantindo o mesmo formato independente do adquirente.

Para renderizar no front, monte a data URI:

<img src={`data:image/png;base64,${pix.qr_code_image_base64}`} />

Será null apenas quando copy_and_paste não estiver disponível.

Respostas de Erro

Status: 400 Bad Request — Erro de validação

{
"message": "Erro de validação",
"data": {
"customer.email": ["Insira um endereço de email válido."],
"customer.address": ["Endereço obrigatório para produtos físicos."],
"items": ["Este campo é obrigatório."]
}
}