Antes de responder
Execute estas verificações antes de gerar qualquer payload ou código:
- Confirme que o pedido envolve a API Tray (não confunda com outras APIs
de e-commerce). Se não for Tray, redirecione.
- Identifique o recurso (produto, pedido, cliente, frete, etc.) e
carregue a skill específica antes de responder com detalhes.
- Verifique que
access_token, consumer_key, consumer_secret e
refresh_token não aparecem como literais no código gerado.
- Confirme que o payload, se houver, está envolvido na chave do recurso
(
{"Product": {...}}, {"Order": {...}}, {"Customer": {...}}).
- Confirme que o
access_token é passado como query parameter
(?access_token={token}), nunca como header.
Visão Geral — API Tray
Documentação oficial: https://developers.tray.com.br
Regras invariantes da plataforma
Estas regras valem para toda chamada à API Tray e devem ser aplicadas
mesmo que a skill do recurso específico não as repita.
1. Autenticação OAuth 2.0
| Token |
Vida útil |
Como renovar |
access_token |
3 horas |
GET /auth?consumer_key=...&refresh_token=... |
refresh_token |
30 dias |
Refazer fluxo OAuth completo |
- Sempre passado como query parameter:
?access_token={token}.
- Nunca como header (
Authorization: Bearer ... não funciona na API Tray).
- Nunca hardcoded no código — sempre via variável de ambiente.
Detalhes do fluxo de 3 etapas em skills/autorizacao/SKILL.md.
2. URL base por loja
https://{api_address}/<recurso>?access_token={token}
api_address varia por loja e é retornado no callback OAuth da
Etapa 2. Armazene junto com os tokens.
Atenção — api_address já contém /web_api. O valor retornado no
callback é o domínio da loja + /web_api (ex.: urldaloja.com.br/web_api),
conforme a doc oficial (api_address = {URL da loja}/web_api). Logo a URL
final de qualquer recurso é https://urldaloja.com.br/web_api/<recurso> — o
{api_address} dos exemplos das skills já embute o /web_api, por isso os
exemplos não o repetem. Armazene o api_address exatamente como veio do
callback (com o /web_api); guardar só urldaloja.com.br e montar
https://urldaloja.com.br/<recurso> resulta em HTTP 404.
3. Formato de payload
Payloads JSON em POST e PUT são sempre envolvidos na chave do
recurso, em PascalCase singular:
POST /products
{ "Product": { "name": "Camiseta", "price": "99.90" } }
POST /orders
{ "Order": { "client_id": 1, "products": [...] } }
POST /customers
{ "Customer": { "name": "João Silva", "cpf": "12345678901" } }
Esquecer essa chave é a causa #1 de erro HTTP 400 na API Tray.
4. Paginação e datas
- Máximo 50 itens por página em listagens. Use
pager.total da
resposta para paginar.
- Datas:
YYYY-MM-DD.
- Timestamps:
YYYY-MM-DD HH:MM:SS (sem timezone — assume horário de Brasília).
5. Rate limit
| Limite |
Valor padrão |
Corporate |
| Curto prazo |
180 req/min |
180 req/min |
| Diário |
10.000 req/dia |
50.000 req/dia |
- Em operações em lote: 150 itens por batch com pausa de 60 s.
HTTP 429 exige backoff exponencial (1s, 2s, 4s, 8s...).
6. Dados brasileiros
Antes de enviar à API, valide:
| Campo |
Formato |
Observação |
| CPF |
11 dígitos |
Validar dígitos verificadores |
| CNPJ |
14 dígitos |
Validar dígitos verificadores |
| CEP |
8 dígitos numéricos |
Sem traço |
| EAN |
Código de barras válido |
GTIN-8/12/13/14 |
| NCM |
8 dígitos |
Classificação fiscal |
Fluxo recomendado para o agente
pedido do dev sobre API Tray
↓
identifique o recurso (produtos, pedidos, clientes, frete...)
↓
carregue a skill específica do recurso (skills/<recurso>/SKILL.md)
↓
aplique as 6 regras desta skill em conjunto com a do recurso
↓
se houver scripts/validate.mjs no recurso, valide o payload antes de retornar
↓
gere o código com tokens via env, payload com chave do recurso,
access_token como query param
Skills por área
Carregue a skill do recurso correspondente:
| Área |
Skills |
| Autenticação |
tray-autorizacao, tray-webhooks |
| Catálogo |
tray-produtos, tray-variacoes, tray-imagens-produtos, tray-categorias, tray-marcas, tray-kits, tray-caracteristicas, tray-informacoes-adicionais |
| Pedidos e logística |
tray-pedidos, tray-status-pedido, tray-notas-fiscais, tray-frete, tray-configuracao-frete, tray-multicd, tray-carrinho-compras, tray-listagem-carrinho, tray-etiquetas-hub, tray-etiquetas-mercado-livre, tray-emissores-etiqueta |
| Clientes e pagamentos |
tray-clientes, tray-enderecos-cliente, tray-perfis-cliente, tray-pagamentos, tray-cupons, tray-listas-preco-b2b, tray-newsletter |
| Loja e analytics |
tray-informacoes-loja, tray-usuarios, tray-scripts-externos, tray-produtos-vendidos, tray-palavras-chave, tray-parceiros |
Para tarefas complexas que cruzam múltiplos recursos, use os agentes
especializados em agents/ (configuração, gestão de catálogo, gestão
de pedidos, debug, migração).
Erros mais comuns e como evitar
| Sintoma |
Causa provável |
Correção |
HTTP 400 campo obrigatório ausente |
Faltou a chave do recurso ({"Product": {...}}) ou campo obrigatório |
Reler skill do recurso; rodar validate.mjs |
HTTP 401 Unauthorized |
access_token expirado (3h) ou em header em vez de query param |
Renovar via refresh_token; mover para query param |
HTTP 404 em endpoint válido |
URL base errada (api_address é por loja) |
Usar api_address retornado no callback OAuth |
HTTP 429 Too Many Requests |
Rate limit (180 req/min ou 10k/dia) |
Backoff exponencial; reduzir batch size para 150 |
| Resposta inesperada em listagem |
Esperando todos os itens em uma chamada |
Paginação máxima é 50 — ler pager.total |
1---2name: tray-visao-geral3description: Skill de entrada para qualquer trabalho de integração com a API da Tray. Estabelece as regras invariantes da plataforma (OAuth como query param, payloads envolvidos na chave do recurso, expiração de tokens, rate limit, validação de dados brasileiros) e orienta para a skill específica do recurso. Sempre carregue esta skill antes de gerar código contra a API Tray.4---56## Antes de responder78> Execute estas verificações antes de gerar qualquer payload ou código:9101. Confirme que o pedido envolve a API Tray (não confunda com outras APIs11 de e-commerce). Se não for Tray, redirecione.122. Identifique o recurso (produto, pedido, cliente, frete, etc.) e13 carregue a skill específica antes de responder com detalhes.143. Verifique que `access_token`, `consumer_key`, `consumer_secret` e15 `refresh_token` **não** aparecem como literais no código gerado.164. Confirme que o payload, se houver, está envolvido na chave do recurso17 (`{"Product": {...}}`, `{"Order": {...}}`, `{"Customer": {...}}`).185. Confirme que o `access_token` é passado como **query parameter**19 (`?access_token={token}`), nunca como header.2021# Visão Geral — API Tray2223Documentação oficial: https://developers.tray.com.br2425## Regras invariantes da plataforma2627Estas regras valem para **toda** chamada à API Tray e devem ser aplicadas28mesmo que a skill do recurso específico não as repita.2930### 1. Autenticação OAuth 2.03132| Token | Vida útil | Como renovar |33|:--|:--|:--|34| `access_token` | 3 horas | `GET /auth?consumer_key=...&refresh_token=...` |35| `refresh_token` | 30 dias | Refazer fluxo OAuth completo |3637- Sempre passado como **query parameter**: `?access_token={token}`.38- **Nunca** como header (`Authorization: Bearer ...` não funciona na API Tray).39- **Nunca** hardcoded no código — sempre via variável de ambiente.4041Detalhes do fluxo de 3 etapas em [`skills/autorizacao/SKILL.md`](../autorizacao/SKILL.md).4243### 2. URL base por loja4445```46https://{api_address}/<recurso>?access_token={token}47```4849`api_address` **varia por loja** e é retornado no callback OAuth da50Etapa 2. Armazene junto com os tokens.5152> **Atenção — `api_address` já contém `/web_api`.** O valor retornado no53> callback é o domínio da loja **+ `/web_api`** (ex.: `urldaloja.com.br/web_api`),54> conforme a doc oficial (`api_address = {URL da loja}/web_api`). Logo a URL55> final de qualquer recurso é `https://urldaloja.com.br/web_api/<recurso>` — o56> `{api_address}` dos exemplos das skills **já embute** o `/web_api`, por isso os57> exemplos não o repetem. Armazene o `api_address` exatamente como veio do58> callback (com o `/web_api`); guardar só `urldaloja.com.br` e montar59> `https://urldaloja.com.br/<recurso>` resulta em `HTTP 404`.6061### 3. Formato de payload6263Payloads JSON em `POST` e `PUT` são **sempre** envolvidos na chave do64recurso, em PascalCase singular:6566```json67POST /products68{ "Product": { "name": "Camiseta", "price": "99.90" } }6970POST /orders71{ "Order": { "client_id": 1, "products": [...] } }7273POST /customers74{ "Customer": { "name": "João Silva", "cpf": "12345678901" } }75```7677Esquecer essa chave é a causa #1 de erro `HTTP 400` na API Tray.7879### 4. Paginação e datas8081- Máximo **50 itens** por página em listagens. Use `pager.total` da82 resposta para paginar.83- Datas: `YYYY-MM-DD`.84- Timestamps: `YYYY-MM-DD HH:MM:SS` (sem timezone — assume horário de Brasília).8586### 5. Rate limit8788| Limite | Valor padrão | Corporate |89|:--|:--|:--|90| Curto prazo | 180 req/min | 180 req/min |91| Diário | 10.000 req/dia | 50.000 req/dia |9293- Em operações em lote: **150 itens por batch com pausa de 60 s**.94- `HTTP 429` exige backoff exponencial (1s, 2s, 4s, 8s...).9596### 6. Dados brasileiros9798Antes de enviar à API, valide:99100| Campo | Formato | Observação |101|:--|:--|:--|102| CPF | 11 dígitos | Validar dígitos verificadores |103| CNPJ | 14 dígitos | Validar dígitos verificadores |104| CEP | 8 dígitos numéricos | Sem traço |105| EAN | Código de barras válido | GTIN-8/12/13/14 |106| NCM | 8 dígitos | Classificação fiscal |107108## Fluxo recomendado para o agente109110```111pedido do dev sobre API Tray112 ↓113identifique o recurso (produtos, pedidos, clientes, frete...)114 ↓115carregue a skill específica do recurso (skills/<recurso>/SKILL.md)116 ↓117aplique as 6 regras desta skill em conjunto com a do recurso118 ↓119se houver scripts/validate.mjs no recurso, valide o payload antes de retornar120 ↓121gere o código com tokens via env, payload com chave do recurso,122access_token como query param123```124125## Skills por área126127Carregue a skill do recurso correspondente:128129| Área | Skills |130|:--|:--|131| Autenticação | `tray-autorizacao`, `tray-webhooks` |132| Catálogo | `tray-produtos`, `tray-variacoes`, `tray-imagens-produtos`, `tray-categorias`, `tray-marcas`, `tray-kits`, `tray-caracteristicas`, `tray-informacoes-adicionais` |133| Pedidos e logística | `tray-pedidos`, `tray-status-pedido`, `tray-notas-fiscais`, `tray-frete`, `tray-configuracao-frete`, `tray-multicd`, `tray-carrinho-compras`, `tray-listagem-carrinho`, `tray-etiquetas-hub`, `tray-etiquetas-mercado-livre`, `tray-emissores-etiqueta` |134| Clientes e pagamentos | `tray-clientes`, `tray-enderecos-cliente`, `tray-perfis-cliente`, `tray-pagamentos`, `tray-cupons`, `tray-listas-preco-b2b`, `tray-newsletter` |135| Loja e analytics | `tray-informacoes-loja`, `tray-usuarios`, `tray-scripts-externos`, `tray-produtos-vendidos`, `tray-palavras-chave`, `tray-parceiros` |136137Para tarefas complexas que cruzam múltiplos recursos, use os agentes138especializados em `agents/` (configuração, gestão de catálogo, gestão139de pedidos, debug, migração).140141## Erros mais comuns e como evitar142143| Sintoma | Causa provável | Correção |144|:--|:--|:--|145| `HTTP 400` campo obrigatório ausente | Faltou a chave do recurso (`{"Product": {...}}`) ou campo obrigatório | Reler skill do recurso; rodar `validate.mjs` |146| `HTTP 401` Unauthorized | `access_token` expirado (3h) ou em header em vez de query param | Renovar via `refresh_token`; mover para query param |147| `HTTP 404` em endpoint válido | URL base errada (`api_address` é por loja) | Usar `api_address` retornado no callback OAuth |148| `HTTP 429` Too Many Requests | Rate limit (180 req/min ou 10k/dia) | Backoff exponencial; reduzir batch size para 150 |149| Resposta inesperada em listagem | Esperando todos os itens em uma chamada | Paginação máxima é 50 — ler `pager.total` |