Skip to content
Back to skills

Cupons

ASecurity

API completa de cupons de desconto da Tray (discount_coupons). Permite criar, editar, excluir e consultar cupons, além de gerenciar relacionamentos com clientes, produtos, categorias, marcas e fretes. Contém 21 endpoints.

  • 14 stars
  • 0 votes
  • 0 copies
  • 4 views
  • Added June 11, 2026
developmentgonodeapi

Works with

  • claude code
  • cli
  • api

Security analysis

A100/100

Scanned June 11, 2026

npx -y skills add tray-tecnologia/tray-api-ai-plugin --skill cupons --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Cupons?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Cupons
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/tray-tecnologia-cupons/badge)](https://www.skillsdirectory.com/skills/tray-tecnologia-cupons)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: tray-cupons
description: >
  API completa de cupons de desconto da Tray (discount_coupons).
  Permite criar, editar, excluir e consultar cupons, além de
  gerenciar relacionamentos com clientes, produtos, categorias,
  marcas e fretes. Contém 21 endpoints.
when_to_use: >
  Use quando o desenvolvedor mencionar: cupom, desconto, código promocional,
  coupon, discount_coupons, POST /discount_coupons, cupom por cliente,
  cupom por produto, cupom por categoria, percentual de desconto ou valor fixo de desconto.
when_not_to_use: >
  Não use para preços B2B permanentes por grupo de cliente (use tray-listas-preco-b2b).
  Use para descontos por código aplicados no checkout.
---

## MANDATORY: Tool Call(s) Required Before Answering

- **OBRIGATÓRIO:** `node skills/tray-dev/scripts/search_docs.mjs "<termo>"` — confirme o comportamento da API antes de gerar código.

## Antes de responder

> Execute estas verificações antes de gerar qualquer payload ou código:

1. Confirme o método HTTP e endpoint correto para a operação solicitada.
2. Identifique os campos obrigatórios listados neste documento — não omita nenhum.
3. Verifique que `access_token` não aparece como literal string no código gerado.
4. Confirme que esta é a skill correta para o recurso (leia `when_not_to_use` no frontmatter).

# Cupons de Desconto — API Tray

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ão `Coupon`).

## Autenticação

Todas as requisições utilizam query string: `?access_token={token}`

## Paginação

Endpoints de listagem suportam: `?limit=30&page=1` (máximo 50 por página)

## Endpoints — CRUD

| 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 |

## Endpoints — Consulta de Relacionamentos (GET)

| 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 campo `coupon_type` indica qual relacionamento buscar: `cliente` → customer_relationship, `loja` com `local_application=produtos` → product_relationship, etc.

## Endpoint — Criação de Relacionamentos (POST)

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:**
```json
{
  "DiscountCouponCustomer": [
    { "customer_id": "10" },
    { "customer_id": "20" }
  ]
}
```

**Vincular produtos:**
```json
{
  "DiscountCouponProduct": [
    { "product_id": "10" },
    { "product_id": "20" }
  ]
}
```

**Vincular categorias:**
```json
{
  "DiscountCouponCategory": [
    { "category_id": "10" }
  ]
}
```

**Vincular marcas:**
```json
{
  "DiscountCouponBrand": [
    { "brand_id": "10" }
  ]
}
```

**Vincular fretes (método de envio):**
```json
{
  "DiscountCouponShipping": [
    { "shipping_id": "10" }
  ]
}
```

**Vincular frete grátis (valor zerado):**
```json
{
  "DiscountCouponShipping": {
    "value": "0"
  }
}
```

**Vincular desconto de frete (valor específico):**
```json
{
  "DiscountCouponShipping": {
    "value": "10"
  }
}
```

**Criar cupom de troca a partir de pedido:**
```json
{
  "DiscountCouponCustomer": {
    "order_id": "10"
  }
}
```

## Campos — Criar/Atualizar Cupom

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 | **Sim** | Descrição do cupom (obrigatória na criação) |
| `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 |

> ⚠️ **Obrigatórios na criação (`POST`):** `code`, `description`, `value` e
> `type`. Omitir qualquer um resulta em HTTP 400.
>
> **Campos `local_application`:** `loja`, `produtos`, `marcas`, `categorias`
> **Campos `freight_application`:** `nao_aplicavel`, `desconto`, `frete_gratis`

## Exemplos

### Listar cupons

```http
GET /discount_coupons?access_token={token}&limit=30&page=1
```

Resposta:

```json
{
  "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"
      }
    }
  ]
}
```

### Criar cupom

```http
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:

```json
{
  "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:

```json
{ "message": "Created", "id": "1", "code": 201 }
```

### Vincular produtos ao cupom

```http
POST /discount_coupons/create_relationship/7?access_token={token}
Content-Type: application/json

{
  "DiscountCouponProduct": [
    { "product_id": "456" },
    { "product_id": "789" }
  ]
}
```

### Consultar clientes do cupom

```http
GET /discount_coupons/customer_relationship/7?access_token={token}
```

Resposta:

```json
{
  "DiscountCouponCustomers": [
    { "DiscountCouponCustomer": { "customer_id": "1" } },
    { "DiscountCouponCustomer": { "customer_id": "20" } }
  ]
}
```

## Tipos de Cupom — Lógica de Uso

| `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.

## Boas Práticas

- O campo `code` não aceita espaços nem acentos.
- Campos `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.
- Use `coupon_type=loja` sem relacionamentos para promoções gerais. Adicione relacionamentos para restrições.
- Limite de 100 registros por POST de relacionamento — divida lotes maiores.
- Consulte `coupon_type` e `local_application` no GET principal para saber qual endpoint de relacionamento chamar.

## Como Usar no Claude Code

### Exemplos de Prompt

- "cria um cupom PROMO10 de 10% de desconto válido por 30 dias"
- "cria um cupom de frete grátis para compras acima de R$ 150"
- "vincula o cupom VIP20 exclusivamente aos clientes do perfil Atacado"
- "lista todos os cupons ativos na loja"

### O que o Claude faz

1. Gera o código de criação com formato `x-www-form-urlencoded` e wrapper `DiscountCoupon`
2. Define os campos de validade (`starts_at`, `ends_at`), tipo (`percentage`/`value`) e limites de uso
3. Gera o código de relacionamento para cupons restritos a clientes, produtos ou categorias
4. Orienta sobre a diferença entre `coupon_type` (loja/cliente/troca/presente)

### O que você recebe

- Código de criação de cupom com todos os campos configurados
- Exemplo com `Content-Type: application/x-www-form-urlencoded` correto
- Código de relacionamento via `POST /discount_coupons/create_relationship/:id`
- Listagem de cupons ativos com filtros

### Pré-requisitos

- `access_token` configurado
- `customer_id`, `product_id` ou `category_id` se o cupom tiver restrições de relacionamento

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.