OTL ShoesAPI
Exemplos em
Menu da documentação

Listar pedidos

Os pedidos do parceiro, com itens, destinatário e o resultado de cada venda.

GET/v1/pedidos

Quando usar

Para espelhar os pedidos no seu sistema e acompanhar o andamento de cada um. Aparecem todos os pedidos do parceiro — os feitos no painel e os criados por integração.

Parâmetros

ParâmetroTipoPadrãoDescrição
limitenúmero50Itens por página, de 1 a 100.
cursortexto—O proximoCursor da resposta anterior.
statustexto—Um dos status do pedido.
atualizadoDesdedata—Só pedidos criados ou alterados a partir desta data (com fuso). Muda a ordem — veja abaixo.
dedata—Pedidos criados a partir desta data (com fuso).
atedata—Pedidos criados até esta data (com fuso).
referenciaExternatexto—O identificador que o seu sistema deu ao pedido. Comparação exata.
buscatexto—Procura no número do pedido (quando só dígitos), no nome do destinatário, no título e no SKU dos itens. No destinatário, diferencia maiúsculas.

Exemplo

curl "https://api.otlshoes.com.br/v1/pedidos?status=ENVIADO&limite=50" \
  -H "Authorization: Bearer otl_prod_SEU_TOKEN"
curl "https://api-sandbox.otlshoes.com.br/v1/pedidos?status=ENVIADO&limite=50" \
  -H "Authorization: Bearer otl_sbx_SEU_TOKEN"
const resposta = await fetch('https://api.otlshoes.com.br/v1/pedidos?status=ENVIADO&limite=50', {
  headers: {
    Authorization: 'Bearer otl_prod_SEU_TOKEN',
  },
});

if (!resposta.ok) {
  const { erro } = await resposta.json();
  throw new Error(`${erro.codigo}: ${erro.mensagem} (${erro.requestId})`);
}
const dados = await resposta.json();
const resposta = await fetch('https://api-sandbox.otlshoes.com.br/v1/pedidos?status=ENVIADO&limite=50', {
  headers: {
    Authorization: 'Bearer otl_sbx_SEU_TOKEN',
  },
});

if (!resposta.ok) {
  const { erro } = await resposta.json();
  throw new Error(`${erro.codigo}: ${erro.mensagem} (${erro.requestId})`);
}
const dados = await resposta.json();
<?php
$ch = curl_init('https://api.otlshoes.com.br/v1/pedidos?status=ENVIADO&limite=50');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer otl_prod_SEU_TOKEN',
]);

$corpo = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if ($status >= 400) {
    throw new Exception($corpo['erro']['codigo'] . ': ' . $corpo['erro']['mensagem']);
}
<?php
$ch = curl_init('https://api-sandbox.otlshoes.com.br/v1/pedidos?status=ENVIADO&limite=50');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer otl_sbx_SEU_TOKEN',
]);

$corpo = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if ($status >= 400) {
    throw new Exception($corpo['erro']['codigo'] . ': ' . $corpo['erro']['mensagem']);
}
import requests

resposta = requests.get(
    "https://api.otlshoes.com.br/v1/pedidos",
    headers={
        "Authorization": "Bearer otl_prod_SEU_TOKEN",
    },
    params={
        "status": "ENVIADO",
        "limite": "50"
    },
    timeout=30,
)

if not resposta.ok:
    erro = resposta.json()["erro"]
    raise RuntimeError(f'{erro["codigo"]}: {erro["mensagem"]} ({erro["requestId"]})')
dados = resposta.json()
import requests

resposta = requests.get(
    "https://api-sandbox.otlshoes.com.br/v1/pedidos",
    headers={
        "Authorization": "Bearer otl_sbx_SEU_TOKEN",
    },
    params={
        "status": "ENVIADO",
        "limite": "50"
    },
    timeout=30,
)

if not resposta.ok:
    erro = resposta.json()["erro"]
    raise RuntimeError(f'{erro["codigo"]}: {erro["mensagem"]} ({erro["requestId"]})')
dados = resposta.json()
Testar agora no ambiente de testes

A chamada é feita de verdade, do seu navegador para a API de testes (https://api-sandbox.otlshoes.com.br/v1). Use um token otl_sbx_…: ele fica só nesta aba, e some ao fechá-la. Token de produção não é aceito aqui.

Resposta

{
  "dados": [
    {
      "id": "cmg8k1p2a0007",
      "numero": 12,
      "status": "ENVIADO",
      "total": "279.80",
      "origem": "API",
      "referenciaExterna": "PED-778",
      "enviarPara": "CLIENTE",
      "clienteId": "cmg7h2k9x0003",
      "destinatario": {
        "nome": "Maria da Silva",
        "telefone": "5551999990000",
        "endereco": {
          "cep": "90000000",
          "rua": "Rua das Flores",
          "numero": "10",
          "complemento": "ap 2",
          "bairro": "Centro",
          "cidade": "Porto Alegre",
          "uf": "RS"
        }
      },
      "observacao": "Entregar à tarde",
      "itens": [
        {
          "id": "cmg8k1p2a0008",
          "sku": "320",
          "titulo": "Tênis Adidas Forum Low Branco",
          "imagem": "https://cdn.otlshoes.com.br/otl-catalog/320.webp",
          "numeracao": "38",
          "skuVariacao": "320U",
          "quantidade": 2,
          "precoAtacado": "139.90",
          "total": "279.80",
          "valorVenda": "259.90",
          "valorVendaEm": "2026-09-21T09:00:00-03:00"
        }
      ],
      "resultado": {
        "faturamento": "519.80",
        "custo": "279.80",
        "despesas": "10.00",
        "lucroBruto": "240.00",
        "lucro": "230.00",
        "margemPercentual": 44.25,
        "itens": 2,
        "itensSemVenda": 0
      },
      "criadoEm": "2026-09-20T09:15:00-03:00",
      "atualizadoEm": "2026-09-22T14:03:00-03:00"
    }
  ],
  "paginacao": {
    "proximoCursor": "eyJvIjoicmVjZW50ZXMiLCJ2IjoiMjAyNi0wOS0yMFQxMjoxNTowMC4wMDBaIiwiaWQiOiJjbWc4azFwMmEwMDA3In0",
    "temMais": true
  },
  "resumo": {
    "faturamento": "519.80",
    "custo": "279.80",
    "despesas": "10.00",
    "lucroBruto": "240.00",
    "lucro": "230.00",
    "margemPercentual": 44.25,
    "itens": 2,
    "itensSemVenda": 0,
    "pedidos": 1
  }
}
CampoTipoDescrição
dados[].idtextoIdentificador do pedido. Use em Detalhar pedido.
dados[].numeronúmeroNúmero legível. A sequência é por parceiro: o primeiro pedido de cada um é o 1.
dados[].statustextoVeja Status do pedido.
dados[].totaldinheiroO que o parceiro paga à OTL pelos produtos. Não inclui frete.
dados[].origemtextoPAINEL ou API.
dados[].referenciaExternatexto ou nullO identificador do pedido no seu sistema, quando ele foi criado por integração.
dados[].enviarParatextoCLIENTE (direto ao cliente final) ou PARCEIRO (endereço do próprio parceiro).
dados[].clienteIdtexto ou nullO cliente da agenda usado como destino. null quando o destinatário não está na agenda.
dados[].destinatarioobjetoNome, telefone e endereço como estavam no fechamento. Alterar o cliente depois não muda o pedido.
dados[].observacaotexto ou nullObservação do parceiro no pedido.
dados[].itens[].numeracaotextoA numeração do par.
dados[].itens[].skuVariacaotexto ou nullSKU + sufixo da numeração (320U). Veja Numerações.
dados[].itens[].precoAtacadodinheiroPreço por par congelado no fechamento. Mudança no catálogo depois não o altera.
dados[].itens[].totaldinheiroprecoAtacado × quantidade.
dados[].itens[].valorVendadinheiro ou nullPor quanto o parceiro revendeu, por par. null = ainda não informou.
dados[].resultadoobjetoVeja Resultado.
dados[].criadoEmdataQuando o pedido foi fechado.
dados[].atualizadoEmdataÚltima alteração do pedido ou de qualquer parte dele (rastreio, anexo, despesa, valor de venda).
resumoobjetoO resultado somado de todos os pedidos do filtro, não só desta página.
resumo.pedidosnúmeroQuantos pedidos entraram na soma.
paginacaoobjetoVeja Paginação.

Status do pedido

status Significado
AGUARDANDO_PAGAMENTO Pedido fechado; a OTL ainda não confirmou o pagamento
PAGO Pagamento confirmado
EM_SEPARACAO Em separação no estoque
ENVIADO Despachado
ENTREGUE Entregue ao destinatário
CANCELADO Cancelado
ESTORNADO Pagamento devolvido

Resultado

O resultado é a conta do parceiro naquele pedido — a mesma que ele vê no painel.

CampoTipoDescrição
faturamentodinheiroO que o cliente final pagou: valorVenda × quantidade, só dos itens com venda informada.
custodinheiroO que o parceiro pagou à OTL nesses mesmos itens.
despesasdinheiroCustos que o parceiro lançou no pedido (frete, embalagem, taxa).
lucroBrutodinheirofaturamento − custo.
lucrodinheirolucroBruto − despesas.
margemPercentualnúmero ou nullLucro sobre o faturamento, em %. null quando não há faturamento.
itensnúmeroPares no pedido.
itensSemVendanúmeroPares sem valorVenda: ficam fora do faturamento e do lucro.
Sem valor de venda não é venda por zero

Um item com valorVenda: null não entra no faturamento nem no custo do resultado. Tratá-lo como zero derrubaria a margem sem motivo. Use itensSemVenda para saber quanto do pedido ainda está sem esse dado.

Regras que não se leem no JSON

  • A ordem é do pedido mais recente para o mais antigo. Com atualizadoDesde, passa a ser da alteração mais antiga para a mais nova — a ordem certa para sincronizar. O cursor de uma ordem não serve na outra.
  • O resumo só soma pedido pago (PAGO, EM_SEPARACAO, ENVIADO, ENTREGUE). Pedido aguardando pagamento, cancelado ou estornado aparece em dados, mas não no resumo. Filtrar por status=CANCELADO devolve os pedidos e um resumo zerado.
  • atualizadoEm anda com tudo que muda no pedido: status, observação, rastreio, anexo, despesa e valor de venda. Sincronizar por atualizadoDesde é suficiente para não perder um rastreio novo.
  • A lista não traz despesas, rastreios nem anexos: eles estão em Detalhar pedido.

Erros possíveis

HTTP codigo Quando
400 PARAMETRO_INVALIDO status desconhecido, limite fora de 1–100 ou data sem fuso
400 CURSOR_INVALIDO Cursor alterado, ou de outra consulta
403 ESCOPO_INSUFICIENTE A integração não tem pedidos:ler

Ver também