OTL ShoesAPI
Exemplos em
Menu da documentação

Definir a aparência

Altera a aparência da vitrine, dentro de um conjunto fechado de opções.

PUT/v1/loja-hub/aparencia
Não existe CSS livre

A vitrine é uma página pública hospedada pela OTL. A aparência é um conjunto fechado de opções: cores em #rrggbb e o resto escolhido de uma lista. Valor fora da lista é recusado.

Corpo

Todos os campos são opcionais; só o que vier muda.

ParâmetroTipoPadrãoDescrição
corFundotexto—Cor de fundo da página, em #rrggbb.
corTextotexto—Cor do texto, em #rrggbb.
fontetexto—sistema, inter, poppins, nunito ou playfair.
cantostexto—reto, suave ou redondo.
estiloCardtexto—borda, sombra ou limpo.
formatoLogotexto—auto (nunca corta) ou circulo (só para logo quadrado).
cabecalhotexto—transparente, solido, destaque (cor da marca) ou cor (usa corCabecalho).
corCabecalhotexto—Só vale com cabecalho: "cor".
botaotexto—Botão no card do produto: nenhum, solido ou contorno.
rotuloBotaotexto—O texto do botão, até 18 caracteres.
enquadramentoFototexto—preencher (corta no quadrado) ou inteira (foto completa).
mostrarNumeracoesbooleano—Mostra as numerações no card.

Exemplo

curl -X PUT "https://api.otlshoes.com.br/v1/loja-hub/aparencia" \
  -H "Authorization: Bearer otl_prod_SEU_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "fonte": "poppins",
  "cabecalho": "destaque",
  "botao": "solido",
  "rotuloBotao": "Ver detalhes"
}'
curl -X PUT "https://api-sandbox.otlshoes.com.br/v1/loja-hub/aparencia" \
  -H "Authorization: Bearer otl_sbx_SEU_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "fonte": "poppins",
  "cabecalho": "destaque",
  "botao": "solido",
  "rotuloBotao": "Ver detalhes"
}'
const resposta = await fetch('https://api.otlshoes.com.br/v1/loja-hub/aparencia', {
  method: 'PUT',
  headers: {
    Authorization: 'Bearer otl_prod_SEU_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "fonte": "poppins",
    "cabecalho": "destaque",
    "botao": "solido",
    "rotuloBotao": "Ver detalhes"
  }),
});

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/loja-hub/aparencia', {
  method: 'PUT',
  headers: {
    Authorization: 'Bearer otl_sbx_SEU_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "fonte": "poppins",
    "cabecalho": "destaque",
    "botao": "solido",
    "rotuloBotao": "Ver detalhes"
  }),
});

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/loja-hub/aparencia');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer otl_prod_SEU_TOKEN',
    'Content-Type: application/json',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
    'fonte' => 'poppins',
    'cabecalho' => 'destaque',
    'botao' => 'solido',
    'rotuloBotao' => 'Ver detalhes',
]));

$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/loja-hub/aparencia');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer otl_sbx_SEU_TOKEN',
    'Content-Type: application/json',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
    'fonte' => 'poppins',
    'cabecalho' => 'destaque',
    'botao' => 'solido',
    'rotuloBotao' => 'Ver detalhes',
]));

$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.put(
    "https://api.otlshoes.com.br/v1/loja-hub/aparencia",
    headers={
        "Authorization": "Bearer otl_prod_SEU_TOKEN",
    },
    json={
        "fonte": "poppins",
        "cabecalho": "destaque",
        "botao": "solido",
        "rotuloBotao": "Ver detalhes"
    },
    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.put(
    "https://api-sandbox.otlshoes.com.br/v1/loja-hub/aparencia",
    headers={
        "Authorization": "Bearer otl_sbx_SEU_TOKEN",
    },
    json={
        "fonte": "poppins",
        "cabecalho": "destaque",
        "botao": "solido",
        "rotuloBotao": "Ver detalhes"
    },
    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, com a aparência inteira:

{
  "corFundo": "#f5f6f7",
  "corTexto": "#14161a",
  "fonte": "poppins",
  "cantos": "suave",
  "estiloCard": "borda",
  "formatoLogo": "auto",
  "cabecalho": "destaque",
  "corCabecalho": "#ffffff",
  "botao": "solido",
  "rotuloBotao": "Ver detalhes",
  "enquadramentoFoto": "inteira",
  "mostrarNumeracoes": true
}

Regras que não se leem no JSON

  • A cor do texto do cabeçalho não é escolhida: é calculada para dar contraste com o fundo dele.
  • Escolher uma fonte diferente de sistema faz a vitrine baixar a fonte — pesa um pouco em rede lenta.

Erros possíveis

HTTP codigo Quando
400 VALIDACAO Opção fora da lista, cor que não é #rrggbb, ou corpo sem campo conhecido
403 LOJA_HUB_NAO_LIBERADA A OTL ainda não liberou a loja no HUB para este parceiro
403 ESCOPO_INSUFICIENTE A integração não tem loja-hub:escrever