From tray-api
Implements OAuth 2.0 authentication for Tray API including 3-step flow, access_token generation, refresh_token renewal, response fields, expiration times, and error codes.
npx claudepluginhub tray-tecnologia/tray-api-ai-plugin --plugin tray-apiThis skill uses the workspace's default tool permissions.
> Execute estas verificações antes de gerar qualquer payload ou código:
Monitors deployed URLs for regressions after deploys, merges, or upgrades by checking HTTP status, console errors, network failures, performance (LCP/CLS/INP), content, and API health.
Share bugs, ideas, or general feedback.
Execute estas verificações antes de gerar qualquer payload ou código:
access_token não aparece como literal string no código gerado.when_not_to_use no frontmatter).node skills/autorizacao/scripts/validate.mjs '<payload_json>'
para confirmar a estrutura do payload que vai gerar. O validador checa
apenas estrutura (campos obrigatórios, tipos e campos desconhecidos),
nunca valores reais — então monte um payload sintético com placeholders
sempre que os valores vierem de variáveis de ambiente, do callback OAuth
ou de outras chamadas. Exemplo:
node skills/autorizacao/scripts/validate.mjs '{"consumer_key":"<env>","consumer_secret":"<env>","code":"<callback>"}'.
Corrija todos os erros antes de retornar o código ao usuário. Até 3
tentativas — se persistir, explique o problema ao usuário.Documentação oficial: https://developers.tray.com.br/#autorizacao
Redirecione o lojista para a tela de autorização da Tray:
https://{dominio_loja}/auth.php?response_type=code&consumer_key={consumer_key}&callback={callback_url}
Parâmetros:
response_type — sempre codeconsumer_key — chave do aplicativo (obtida ao criar o app na Tray)callback — URL de retorno do seu aplicativoApós o lojista autorizar, a Tray redireciona para sua callback com os parâmetros:
| Parâmetro | Descrição |
|---|---|
code | Código de autorização (uso único) |
adm_user | Identificador do usuário administrativo |
store | URL da loja |
api_address | Endereço base da API para esta loja |
Endpoint: POST https://{api_address}/auth
Parâmetros do body (JSON):
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
consumer_key | string | Sim | Chave do aplicativo |
consumer_secret | string | Sim | Segredo do aplicativo |
code | string | Sim | Código recebido no callback |
Resposta de sucesso (201):
{
"code": 201,
"message": "Created tokens",
"access_token": "xxxxxxxxxxxxx",
"refresh_token": "xxxxxxxxxxxxx",
"date_expiration_access_token": "2026-03-21 15:00:00",
"date_expiration_refresh_token": "2026-04-20 12:00:00",
"date_activated": "2026-03-21 12:00:00",
"api_host": "https://{api_address}/",
"store_id": "123456"
}
Endpoint: GET https://{api_address}/auth?refresh_token={refresh_token}
Resposta de sucesso (200):
{
"code": 200,
"message": "Refreshed tokens",
"access_token": "novo_access_token",
"refresh_token": "novo_refresh_token",
"date_expiration_access_token": "2026-03-21 18:00:00",
"date_expiration_refresh_token": "2026-04-20 15:00:00",
"store_id": "123456"
}
| Token | Expiração | Ação necessária |
|---|---|---|
access_token | 3 horas | Renovar via refresh_token antes de expirar |
refresh_token | 30 dias | Requer nova autorização completa se expirar |
Todas as chamadas à API (exceto rotas públicas) exigem o access_token como query parameter:
GET https://{api_address}/products?access_token={access_token}
POST https://{api_address}/products?access_token={access_token}
| Código | Situação | Ação recomendada |
|---|---|---|
1000 | Token expirado, loja ativa | Renovar via refresh_token |
1001 | Token expirado, loja bloqueada | Verificar status com o lojista |
1002 | Token expirado, loja inativa | Verificar ativação da loja |
1003 | Token expirado, loja cancelada | Loja não está mais disponível |
1099 | Token inválido ou expirado (motivo desconhecido) | Verificar token e refazer autenticação |
Nota: o campo retornado pela API é
error_code(nãocode). Validado em teste real: token inválido retornaerror_code: 1099com HTTP 401.
Resposta de erro (401):
{
"code": 401,
"message": "Unauthorized",
"causes": ["Token expired or invalid"]
}
| Tipo | Limite |
|---|---|
| Curto prazo | 180 requisições por minuto |
| Diário (padrão) | 10.000 requisições por dia |
| Diário (corporate) | 50.000 requisições por dia |
Resposta de limite excedido (429): A API retorna HTTP 429 quando o limite é atingido. Implemente backoff exponencial.
TRAY_ACCESS_TOKEN, TRAY_CONSUMER_KEY, TRAY_CONSUMER_SECRET)refresh_token antes das 3 horas.env com todas as variáveis necessáriasconsumer_key e consumer_secret do seu app na Tray (obtidos no painel de parceiros)