Executar upgrade ou downgrade de plano
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 é
200comupgrade.statuspending, e a venda da diferença continua emPROCESSING. A troca é confirmada quando o gateway avisa o pagamento; nesse momento a venda passa aPAIDe o webhookTRANSACTION_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.
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
uuidHeader Parameters
length <= 255uuidSó é relevante para upgrade. Ignorado em downgrade.
"current""current" | "new_card"Obrigatório somente quando payment_choice=new_card
Response Body
curl -X POST "https://pagpolar-api.creativecode.dev.br/v1/subscriptions/497f6eca-6276-4993-bfeb-53cbbbba6f08/plan-change" \ -H "Idempotency-Key: string" \ -H "Content-Type: application/json" \ -d '{ "new_product_price_id": "b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e", "payment_choice": "current" }'{
"data": {
"type": "UPGRADE",
"upgrade": {
"transaction_id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"charge_amount": 49.9,
"status": "pending",
"pix": {
"qr_code": "00020126..."
}
}
}
}{
"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"
}
}Cancelar assinatura DELETE
Solicita o cancelamento da assinatura. - **Boleto ou PIX**: cancelamento é imediato — a assinatura muda para `canceled`, o acesso é revogado de imediato nas integrações (MemberKit/Circle) e não há mais cobranças. - **Cartão de crédito**: o cancelamento é solicitado ao gateway de pagamento e a assinatura fica com status `canceling` até a confirmação (assíncrona). Cancelar uma assinatura que já está cancelada ou em outro status que não permite cancelamento não tem efeito (operação idempotente).
Assinar um plano (criar assinatura) POST
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.