Listar pedidos
Os pedidos do parceiro, com itens, destinatário e o resultado de cada venda.
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âmetro | Tipo | Padrão | Descrição |
|---|---|---|---|
limite | número | 50 | Itens por página, de 1 a 100. |
cursor | texto | — | O proximoCursor da resposta anterior. |
status | texto | — | Um dos status do pedido. |
atualizadoDesde | data | — | Só pedidos criados ou alterados a partir desta data (com fuso). Muda a ordem — veja abaixo. |
de | data | — | Pedidos criados a partir desta data (com fuso). |
ate | data | — | Pedidos criados até esta data (com fuso). |
referenciaExterna | texto | — | O identificador que o seu sistema deu ao pedido. Comparação exata. |
busca | texto | — | 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
}
}
| Campo | Tipo | Descrição |
|---|---|---|
dados[].id | texto | Identificador do pedido. Use em Detalhar pedido. |
dados[].numero | número | Número legível. A sequência é por parceiro: o primeiro pedido de cada um é o 1. |
dados[].status | texto | Veja Status do pedido. |
dados[].total | dinheiro | O que o parceiro paga à OTL pelos produtos. Não inclui frete. |
dados[].origem | texto | PAINEL ou API. |
dados[].referenciaExterna | texto ou null | O identificador do pedido no seu sistema, quando ele foi criado por integração. |
dados[].enviarPara | texto | CLIENTE (direto ao cliente final) ou PARCEIRO (endereço do próprio parceiro). |
dados[].clienteId | texto ou null | O cliente da agenda usado como destino. null quando o destinatário não está na agenda. |
dados[].destinatario | objeto | Nome, telefone e endereço como estavam no fechamento. Alterar o cliente depois não muda o pedido. |
dados[].observacao | texto ou null | Observação do parceiro no pedido. |
dados[].itens[].numeracao | texto | A numeração do par. |
dados[].itens[].skuVariacao | texto ou null | SKU + sufixo da numeração (320U). Veja Numerações. |
dados[].itens[].precoAtacado | dinheiro | Preço por par congelado no fechamento. Mudança no catálogo depois não o altera. |
dados[].itens[].total | dinheiro | precoAtacado × quantidade. |
dados[].itens[].valorVenda | dinheiro ou null | Por quanto o parceiro revendeu, por par. null = ainda não informou. |
dados[].resultado | objeto | Veja Resultado. |
dados[].criadoEm | data | Quando o pedido foi fechado. |
dados[].atualizadoEm | data | Última alteração do pedido ou de qualquer parte dele (rastreio, anexo, despesa, valor de venda). |
resumo | objeto | O resultado somado de todos os pedidos do filtro, não só desta página. |
resumo.pedidos | número | Quantos pedidos entraram na soma. |
paginacao | objeto | Veja 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.
| Campo | Tipo | Descrição |
|---|---|---|
faturamento | dinheiro | O que o cliente final pagou: valorVenda × quantidade, só dos itens com venda informada. |
custo | dinheiro | O que o parceiro pagou à OTL nesses mesmos itens. |
despesas | dinheiro | Custos que o parceiro lançou no pedido (frete, embalagem, taxa). |
lucroBruto | dinheiro | faturamento − custo. |
lucro | dinheiro | lucroBruto − despesas. |
margemPercentual | número ou null | Lucro sobre o faturamento, em %. null quando não há faturamento. |
itens | número | Pares no pedido. |
itensSemVenda | número | Pares 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
resumosó soma pedido pago (PAGO,EM_SEPARACAO,ENVIADO,ENTREGUE). Pedido aguardando pagamento, cancelado ou estornado aparece emdados, mas não no resumo. Filtrar porstatus=CANCELADOdevolve os pedidos e um resumo zerado. atualizadoEmanda com tudo que muda no pedido: status, observação, rastreio, anexo, despesa e valor de venda. Sincronizar poratualizadoDesdeé 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 |
