From tray-api
Manages Tray discount coupons API: create, update, delete, list via CRUD endpoints and relationships with customers, products, categories, brands, shipping. 21 endpoints total.
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).Documentação oficial: https://developers.tray.com.br/#api-de-cupom
Atenção: O endpoint base é
/discount_coupons(não/coupons). O wrapper de resposta éDiscountCoupon(nãoCoupon).
Todas as requisições utilizam query string: ?access_token={token}
Endpoints de listagem suportam: ?limit=30&page=1 (máximo 50 por página)
| Método | Endpoint | Descrição |
|---|---|---|
| GET | /discount_coupons | Listar cupons |
| GET | /discount_coupons/:id | Detalhes de um cupom |
| POST | /discount_coupons | Criar cupom |
| PUT | /discount_coupons/:id | Atualizar cupom |
| DELETE | /discount_coupons/:id | Excluir cupom |
| Endpoint | Descrição |
|---|---|
/discount_coupons/customer_relationship/:id | Listar clientes vinculados |
/discount_coupons/product_relationship/:id | Listar produtos vinculados |
/discount_coupons/category_relationship/:id | Listar categorias vinculadas |
/discount_coupons/brand_relationship/:id | Listar marcas vinculadas |
/discount_coupons/shipping_relationship/:id | Listar fretes vinculados |
/discount_coupons/gift_relationship/:id | Consultar cupom-presente vinculado |
Dica: Ao listar cupons (
GET /discount_coupons), o campocoupon_typeindica qual relacionamento buscar:cliente→ customer_relationship,lojacomlocal_application=produtos→ product_relationship, etc.
Todos os tipos de relacionamento usam o mesmo endpoint:
POST /discount_coupons/create_relationship/:id
O tipo de relacionamento é definido pelo corpo da requisição (máximo 100 registros por POST):
Vincular clientes:
{
"DiscountCouponCustomer": [
{ "customer_id": "10" },
{ "customer_id": "20" }
]
}
Vincular produtos:
{
"DiscountCouponProduct": [
{ "product_id": "10" },
{ "product_id": "20" }
]
}
Vincular categorias:
{
"DiscountCouponCategory": [
{ "category_id": "10" }
]
}
Vincular marcas:
{
"DiscountCouponBrand": [
{ "brand_id": "10" }
]
}
Vincular fretes (método de envio):
{
"DiscountCouponShipping": [
{ "shipping_id": "10" }
]
}
Vincular frete grátis (valor zerado):
{
"DiscountCouponShipping": {
"value": "0"
}
}
Vincular desconto de frete (valor específico):
{
"DiscountCouponShipping": {
"value": "10"
}
}
Criar cupom de troca a partir de pedido:
{
"DiscountCouponCustomer": {
"order_id": "10"
}
}
O body usa Content-Type: application/x-www-form-urlencoded com o wrapper ["DiscountCoupon"]["campo"]. A estrutura JSON equivalente:
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
code | string | Sim | Código do cupom — sem espaços nem acentos |
description | string | Não | Descrição do cupom |
coupon_type | string | Não | Tipo: loja, cliente, troca, presente |
starts_at | date | Não | Início da validade (YYYY-MM-DD) |
ends_at | date | Não | Fim da validade (YYYY-MM-DD) |
value | decimal | Sim | Valor do desconto |
type | string | Sim | $ = reais / % = percentual |
value_start | decimal | Não | Valor mínimo do produto para aplicar desconto |
value_end | decimal | Não | Valor máximo do produto para aplicar desconto |
usage_sum_limit | decimal | Não | Limite total acumulado de uso |
usage_counter_limit | integer | Não | Limite de usos totais do cupom |
usage_counter_limit_customer | integer | Não | Limite de usos por cliente |
cumulative_discount | number | Não | 1 = acumula com desconto progressivo |
Campos
local_application:loja,produtos,marcas,categoriasCamposfreight_application:nao_aplicavel,desconto,frete_gratis
GET /discount_coupons?access_token={token}&limit=30&page=1
Resposta:
{
"paging": { "total": 7, "page": 1, "offset": 0, "limit": 30, "maxLimit": 50 },
"DiscountCoupons": [
{
"DiscountCoupon": {
"id": "7",
"code": "NATAL25",
"description": "Cupom de Natal",
"value": "10.00",
"type": "%",
"starts_at": "2019-12-01",
"ends_at": "2019-12-31",
"usage_counter_limit": "0",
"coupon_type": "loja",
"local_application": "loja",
"freight_application": "nao_aplicavel",
"usage_counter_limit_customer": "10"
}
}
]
}
POST /discount_coupons?access_token={token}
Content-Type: application/x-www-form-urlencoded
["DiscountCoupon"]["code"]=PROMO10&["DiscountCoupon"]["description"]=Promo Abril&["DiscountCoupon"]["starts_at"]=2026-04-01&["DiscountCoupon"]["ends_at"]=2026-04-30&["DiscountCoupon"]["value"]=10.00&["DiscountCoupon"]["type"]=%&["DiscountCoupon"]["usage_counter_limit_customer"]=5
Estrutura JSON equivalente do body:
{
"DiscountCoupon": {
"code": "PROMO10",
"description": "Promo Abril",
"starts_at": "2026-04-01",
"ends_at": "2026-04-30",
"value": "10.00",
"type": "%",
"usage_counter_limit": "",
"usage_counter_limit_customer": "5",
"cumulative_discount": "0"
}
}
Resposta de sucesso:
{ "message": "Created", "id": "1", "code": 201 }
POST /discount_coupons/create_relationship/7?access_token={token}
Content-Type: application/json
{
"DiscountCouponProduct": [
{ "product_id": "456" },
{ "product_id": "789" }
]
}
GET /discount_coupons/customer_relationship/7?access_token={token}
Resposta:
{
"DiscountCouponCustomers": [
{ "DiscountCouponCustomer": { "customer_id": "1" } },
{ "DiscountCouponCustomer": { "customer_id": "20" } }
]
}
coupon_type | Comportamento |
|---|---|
loja | Genérico — aplica a toda a loja e todos os clientes |
cliente | Restrito a clientes vinculados via create_relationship |
troca | Gerado a partir de um pedido (order_id) |
presente | Vincula a um produto como presente |
Cupom sem nenhum relacionamento criado = cupom genérico válido para toda a loja.
code não aceita espaços nem acentos.value_start e value_end vazios = sem restrição de valor de produto.usage_counter_limit e usage_counter_limit_customer precisam ser consistentes entre si — se o cliente pode usar 2 vezes, o limite geral não pode ser menor que 2.coupon_type=loja sem relacionamentos para promoções gerais. Adicione relacionamentos para restrições.coupon_type e local_application no GET principal para saber qual endpoint de relacionamento chamar.x-www-form-urlencoded e wrapper DiscountCouponstarts_at, ends_at), tipo (percentage/value) e limites de usocoupon_type (loja/cliente/troca/presente)Content-Type: application/x-www-form-urlencoded corretoPOST /discount_coupons/create_relationship/:idaccess_token configuradocustomer_id, product_id ou category_id se o cupom tiver restrições de relacionamento