OTL ShoesAPI
Exemplos em
Menu da documentação

Simular pedido

Confere se um pedido seria aceito — estoque, preço, destinatário — sem criar nada.

POST/v1/pedidos/validar

Quando usar

Antes de prometer a venda no seu canal: para saber se há estoque, quanto o pedido vai custar ao parceiro e se o destinatário está certo. Faz as mesmas checagens de Criar pedido, na mesma ordem, e não grava nada — nem o pedido, nem o novoCliente na agenda.

Corpo

O mesmo de Criar pedido. Não precisa de Idempotency-Key.

Exemplo

curl -X POST "https://api.otlshoes.com.br/v1/pedidos/validar" \
  -H "Authorization: Bearer otl_prod_SEU_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "itens": [
    {
      "sku": "320",
      "numeracao": "38",
      "quantidade": 2
    }
  ],
  "enviarPara": "CLIENTE",
  "clienteId": "cmg7h2k9x0003"
}'
curl -X POST "https://api-sandbox.otlshoes.com.br/v1/pedidos/validar" \
  -H "Authorization: Bearer otl_sbx_SEU_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "itens": [
    {
      "sku": "320",
      "numeracao": "38",
      "quantidade": 2
    }
  ],
  "enviarPara": "CLIENTE",
  "clienteId": "cmg7h2k9x0003"
}'
const resposta = await fetch('https://api.otlshoes.com.br/v1/pedidos/validar', {
  method: 'POST',
  headers: {
    Authorization: 'Bearer otl_prod_SEU_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "itens": [
      {
        "sku": "320",
        "numeracao": "38",
        "quantidade": 2
      }
    ],
    "enviarPara": "CLIENTE",
    "clienteId": "cmg7h2k9x0003"
  }),
});

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/validar', {
  method: 'POST',
  headers: {
    Authorization: 'Bearer otl_sbx_SEU_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "itens": [
      {
        "sku": "320",
        "numeracao": "38",
        "quantidade": 2
      }
    ],
    "enviarPara": "CLIENTE",
    "clienteId": "cmg7h2k9x0003"
  }),
});

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/validar');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer otl_prod_SEU_TOKEN',
    'Content-Type: application/json',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
    'itens' => [
        [
            'sku' => '320',
            'numeracao' => '38',
            'quantidade' => 2,
        ],
    ],
    'enviarPara' => 'CLIENTE',
    'clienteId' => 'cmg7h2k9x0003',
]));

$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/validar');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer otl_sbx_SEU_TOKEN',
    'Content-Type: application/json',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
    'itens' => [
        [
            'sku' => '320',
            'numeracao' => '38',
            'quantidade' => 2,
        ],
    ],
    'enviarPara' => 'CLIENTE',
    'clienteId' => 'cmg7h2k9x0003',
]));

$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.post(
    "https://api.otlshoes.com.br/v1/pedidos/validar",
    headers={
        "Authorization": "Bearer otl_prod_SEU_TOKEN",
    },
    json={
        "itens": [
            {
                "sku": "320",
                "numeracao": "38",
                "quantidade": 2
            }
        ],
        "enviarPara": "CLIENTE",
        "clienteId": "cmg7h2k9x0003"
    },
    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.post(
    "https://api-sandbox.otlshoes.com.br/v1/pedidos/validar",
    headers={
        "Authorization": "Bearer otl_sbx_SEU_TOKEN",
    },
    json={
        "itens": [
            {
                "sku": "320",
                "numeracao": "38",
                "quantidade": 2
            }
        ],
        "enviarPara": "CLIENTE",
        "clienteId": "cmg7h2k9x0003"
    },
    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

200 OK quando o pedido seria aceito:

{
  "valido": true,
  "total": "279.80",
  "enviarPara": "CLIENTE",
  "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"
    }
  },
  "itens": [
    {
      "indice": 0,
      "sku": "320",
      "titulo": "Tênis Adidas Forum Low Branco",
      "numeracao": "38",
      "skuVariacao": "320U",
      "quantidade": 2,
      "precoAtacado": "139.90",
      "total": "279.80",
      "disponivel": 4
    }
  ]
}
CampoTipoDescrição
validobooleanoSempre true — quando o pedido não seria aceito, a resposta é um erro.
totaldinheiroQuanto o pedido custaria ao parceiro, ao preço de atacado de agora.
destinatarioobjetoPara onde o pedido iria, já resolvido (cliente da agenda, novoCliente ou ficha do parceiro).
itens[].indicenúmeroPosição do item no corpo enviado.
itens[].precoAtacadodinheiroPreço por par, agora.
itens[].disponivelnúmero ou nullEstoque da numeração agora. null = produto sem controle de estoque por numeração.

Regras que não se leem no JSON

  • A simulação não reserva estoque nem preço. Um valido: true vale para o instante da chamada; o pedido de verdade confere tudo de novo.
  • Uma referenciaExterna já usada também é recusada aqui, com 409 REFERENCIA_EXTERNA_DUPLICADA.

Erros possíveis

Os mesmos de Criar pedido, menos os de Idempotency-Key.