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.
Token de acesso devolvido por POST /auth/token. Envie como "Authorization: Bearer ". Vale 24 horas.
In: header
Path Parameters
Header Parameters
length <= 255O 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.
1 <= value <= 12Obrigatório quando a oferta é de produto físico (requires_shipping: true); nos demais casos é opcional e não é usado no processamento da venda.
Dados do cartão de crédito usado na cobrança.
IP do comprador final. Melhora a análise antifraude.
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.
^PAO[0-9]{10}$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.
length <= 255Response 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"
}
}Executar upgrade ou downgrade de plano POST
Executa a troca de plano de uma assinatura. A direção (upgrade ou downgrade) é determinada automaticamente pela comparação de preço entre o plano atual e o novo plano. - **Upgrade**: cobra a diferença proporcional imediatamente, no cartão salvo da assinatura (`payment_choice=current`) ou em um novo cartão informado no corpo da requisição (`payment_choice=new_card`). - **Upgrade no cartão aprovado, mas sem a troca concluída na hora** (por exemplo, falha no gateway ao atualizar o plano): a resposta é `200` com `upgrade.status` `pending`, e a venda da diferença continua em `PROCESSING`. A troca é confirmada quando o gateway avisa o pagamento; nesse momento a venda passa a `PAID` e o webhook `TRANSACTION_PAID` é enviado. Não cobre de novo. - **Downgrade**: não gera cobrança imediata; é agendado para entrar em vigor na próxima renovação da assinatura. O header `Idempotency-Key` é **obrigatório**. Em caso de timeout, reenvie a requisição com a mesma chave: a resposta original será devolvida sem processar a troca duas vezes.
Consultar assinatura GET
Próxima