Assinar um plano (criar assinatura)

Cria uma assinatura de verdade para um cliente em uma oferta de plano existente. id pode ser o id (uuid) ou o identifier da oferta de plano — mesma resolução usada em GET /offers/{identifier}.

Só aceita cartão de crédito.

A cobrança do cartão é feita no gateway depois da resposta desta requisição: a assinatura retorna com status: DRAFT. O webhook SUBSCRIPTION_CONFIRMED avisa que o gateway aceitou a assinatura — o status continua DRAFT — e ela vira ACTIVE quando a primeira fatura é paga. Se o gateway recusar, o webhook é SUBSCRIPTION_FAILED e o status vira FAILED. Como alternativa aos webhooks, faça polling em GET /subscriptions/{id}.

O header Idempotency-Key é obrigatório. Em caso de timeout, reenvie a requisição com a mesma chave: a resposta original será devolvida sem criar uma segunda assinatura.

Uma assinatura não é cobrada diretamente — cada ciclo cobrado (o primeiro e todas as renovações seguintes) gera uma Transaction própria, a mesma entidade retornada por GET /sales/GET /sales/{identifier}. Ou seja, para acompanhar os pagamentos de uma assinatura ao longo do tempo, use os eventos de transação (TRANSACTION_PAID, TRANSACTION_CANCELED, etc.) e GET /sales filtrando pelo cliente/período — os eventos de assinatura (SUBSCRIPTION_*) informam mudanças de status da assinatura em si, não de cada cobrança individual.

Sem campo de autorização: o portal autentica por você com a sua chave de Homologação e as requisições rodam só no ambiente de testes.

POST
/plans/offer/{id}/subscribe
AuthorizationBearer <token>

Token de acesso devolvido por POST /auth/token. Envie como "Authorization: Bearer ". Vale 24 horas.

In: header

Path Parameters

idstring

Header Parameters

Idempotency-Keystring
Lengthlength <= 255
installmentsinteger

O máximo real pode ser menor que 12: é limitado pela configuração da oferta (consulte max_credit_card_installments em GET /offers/{identifier}). Acima do limite da oferta, retorna 400.

Range1 <= value <= 12
customerobject
address?object

Obrigatório quando a oferta é de produto físico (requires_shipping: true); nos demais casos é opcional e não é usado no processamento da venda.

credit_cardobject

Dados do cartão de crédito usado na cobrança.

buyer_ip?string

IP do comprador final. Melhora a análise antifraude.

buyer_user_agent?string
affiliate_identifier?string

Código do afiliado que trouxe a venda, no formato PAO seguido de 10 dígitos. Formato inválido retorna 400. Código de afiliado inexistente, de outro produto, inativo ou sem a oferta liberada é ignorado: a venda é processada normalmente, sem afiliado. Não há cookie nem regra de primeiro ou último clique — vale o código enviado.

Match^PAO[0-9]{10}$
external_reference?string

Referência do pedido no seu sistema (por exemplo, o número do pedido). Opcional. Depois você consulta a venda por ela em GET /sales/{identifier} e filtra em GET /sales?external_reference=. Pode se repetir entre pedidos: a consulta devolve a venda mais recente com essa referência.

Lengthlength <= 255

Response Body

curl -X POST "https://pagpolar-api.creativecode.dev.br/v1/plans/offer/string/subscribe" \  -H "Idempotency-Key: string" \  -H "Content-Type: application/json" \  -d '{    "installments": 1,    "customer": {      "name": "Fulano de Tal",      "email": "fulano@exemplo.com",      "document": "12345678909",      "phone": "11999999999"    },    "credit_card": {      "holder_name": "FULANO DE TAL",      "holder_document": "12345678909",      "number": "4111111111111111",      "expiration_month": 12,      "expiration_year": 2030,      "cvv": "123"    },    "buyer_ip": "203.0.113.10"  }'

{
  "data": {
    "id": "f7a8b9c0-d1e2-4f3a-4b5c-6d7e8f9a0b1c",
    "status": "DRAFT",
    "payment_method": "CREDIT_CARD",
    "start_at": null,
    "next_billing_at": null,
    "next_billing_amount": null,
    "total_amount": null,
    "canceled_at": null,
    "created_at": "2026-01-15T12:00:00.000Z"
  }
}
{
  "error": {
    "code": "invalid_request",
    "message": "string",
    "request_id": "string"
  }
}
{
  "error": {
    "code": "invalid_request",
    "message": "string",
    "request_id": "string"
  }
}
{
  "error": {
    "code": "invalid_request",
    "message": "string",
    "request_id": "string"
  }
}
{
  "error": {
    "code": "invalid_request",
    "message": "string",
    "request_id": "string"
  }
}
{
  "error": {
    "code": "invalid_request",
    "message": "string",
    "request_id": "string"
  }
}
{
  "error": {
    "code": "invalid_request",
    "message": "string",
    "request_id": "string"
  }
}
{
  "error": {
    "code": "invalid_request",
    "message": "string",
    "request_id": "string"
  }
}