# Criar oferta de plano

URL: https://staging.pagpolar.com/docs/referencia/planos/create-plan-offer

> Cria uma oferta **recorrente** para um plano já existente do seu catálogo. `cycle` é
obrigatório — `WEEKLY`, `MONTHLY` ou `YEARLY` (`DAILY` não é aceito pela API pública).

**Isso cria só a oferta (o preço recorrente) do plano — não cria uma assinatura de
verdade para um cliente.** Para assinar um cliente de fato nesta oferta, use
`POST /plans/offer/{id}/subscribe`.

`POST /plans/{id}/offers`

## Autenticação

- Token Bearer no header `Authorization` (esquema `BearerAuth`). Token de acesso devolvido por POST /auth/token. Envie como "Authorization: Bearer <token>". Vale 24 horas.

## Parâmetros de caminho

| Parâmetro | Tipo | Obrigatório | Descrição |
| --- | --- | --- | --- |
| `id` | texto (uuid) | sim | Exemplo: `a8b9c0d1-e2f3-4a4b-5c6d-7e8f9a0b1c2d`. |

## Corpo da requisição

Content-type: `application/json`.

| Campo | Tipo | Obrigatório | Descrição |
| --- | --- | --- | --- |
| `price` | inteiro | sim | Preço da oferta em centavos, número inteiro — a mesma unidade de offer.value. 4990 = R$ 49,90. Valor com casas decimais retorna 400. Exemplo: `9790`. |
| `cycle` | enum | sim | Valores: `WEEKLY`, `MONTHLY`, `YEARLY`. Exemplo: `MONTHLY`. |
| `cycle_interval` | inteiro | não | A cada quantos ciclos a cobrança se repete (ex.: cycle=MONTHLY + cycle_interval=3 = trimestral). Exemplo: `1`. |
| `title` | texto | não | Exemplo: `Plano Mensal`. Pode ser nulo. |
| `is_active` | booleano | não | Exemplo: `true`. |
| `is_enabled_pix` | booleano | não | PIX. Mínimo de R$ 5,00. Os três meios começam ligados, mas cada um só fica ligado se o preço atinge o mínimo dele: PIX R$ 5,00, cartão R$ 5,00 e boleto R$ 10,00. Abaixo do mínimo, o meio é desligado ao salvar, mesmo enviando `true`. Envie `false` para desligar um meio acima do mínimo. Na edição sem `price`, só os meios enviados são recalculados; com `price`, os três são recalculados. Exemplo: `true`. |
| `is_enabled_credit_card` | booleano | não | Cartão de crédito. Mínimo de R$ 5,00. Os três meios começam ligados, mas cada um só fica ligado se o preço atinge o mínimo dele: PIX R$ 5,00, cartão R$ 5,00 e boleto R$ 10,00. Abaixo do mínimo, o meio é desligado ao salvar, mesmo enviando `true`. Envie `false` para desligar um meio acima do mínimo. Na edição sem `price`, só os meios enviados são recalculados; com `price`, os três são recalculados. Exemplo: `true`. |
| `is_enabled_billet` | booleano | não | Boleto. Mínimo de R$ 10,00. Os três meios começam ligados, mas cada um só fica ligado se o preço atinge o mínimo dele: PIX R$ 5,00, cartão R$ 5,00 e boleto R$ 10,00. Abaixo do mínimo, o meio é desligado ao salvar, mesmo enviando `true`. Envie `false` para desligar um meio acima do mínimo. Na edição sem `price`, só os meios enviados são recalculados; com `price`, os três são recalculados. Exemplo: `true`. |
| `max_credit_card_installments` | inteiro | não | Ofertas de plano não podem ser parceladas no cartão de crédito — envie 1 ou omita o campo (default). Valores acima de 1 retornam 400. Exemplo: `1`. |

### Exemplo do corpo

Oferta mensal:

```json
{
  "price": 9790,
  "cycle": "MONTHLY",
  "title": "Plano Mensal",
  "is_enabled_pix": true,
  "is_enabled_credit_card": true,
  "is_enabled_billet": false
}
```

## Respostas

### 201 — Oferta de plano criada

| Campo | Tipo | Obrigatório | Descrição |
| --- | --- | --- | --- |
| `data` | [Oferta](/docs/referencia/entidades/oferta) | não | — |

#### Exemplo

default:

```json
{
  "data": {
    "id": "b9c0d1e2-f3a4-4b5c-6d7e-8f9a0b1c2d3e",
    "identifier": "PPP1234567890",
    "title": "Plano Mensal",
    "price": 97.9,
    "is_active": true,
    "is_default": true,
    "product_id": "a8b9c0d1-e2f3-4a4b-5c6d-7e8f9a0b1c2d",
    "payment_methods": {
      "pix": true,
      "credit_card": true,
      "billet": false
    },
    "max_credit_card_installments": 1,
    "cycle": "MONTHLY",
    "cycle_interval": 1,
    "cycle_interval_limit": null,
    "allow_purchase_quantity": false,
    "purchase_quantity_limit": null,
    "purchase_quantity_min": 1,
    "expires_at": null,
    "created_at": "2026-01-15T12:00:00.000Z"
  }
}
```

## Erros

| Status | Descrição |
| --- | --- |
| `400` | Dados inválidos |
| `401` | Token ausente, inválido ou expirado, ou credencial revogada ou expirada. Chame POST /auth/token para obter um token novo. |
| `403` | IP não autorizado |
| `404` | Plano não encontrado |
| `429` | Limite de requisições excedido |

Lista completa de códigos e como tratá-los: [Erros](/docs/guias/fundamentos/erros).
