Skip to content

API de faturação

Estes endpoints públicos permitem gerir planos de conta, saldo, add-ons de projeto, cupões, referências e renovação. Os callbacks do fornecedor de pagamentos não fazem parte da API pública.

GET /api/billing/overview

Devolve a visão geral da faturação da conta atual.

GET /api/billing/wallet/overview

Devolve a visão geral do saldo e da carteira da conta.

POST /api/billing/wallet/crypto-topup

Cria um carregamento de saldo com criptomoeda. Quando returnUrl ou cancelUrl é fornecido, a API define o parâmetro de consulta externalReference com a referência exata do carregamento criado, substituindo qualquer valor anterior. Preserve essa referência durante o redirecionamento do fornecedor.

POST /api/billing/wallet/topup/refresh

Atualiza o estado do carregamento identificado por topupId ou externalReference. Use um identificador devolvido pela resposta de criação ou pelo URL de retorno; não deduza o destino a partir do carregamento mais recente. Uma página de retorno não deve pedir a atualização se o identificador estiver ausente, repetido ou em conflito com outro identificador.

POST /api/billing/account-plan/balance-purchase

Compra ou atualiza um plano de conta usando o saldo da carteira.

Corpo do pedido:

CampoObrigatórioDescrição
planIdSimPlano de destino: advanced ou pro.
durationMonthsSimPeríodo de faturação: 1, 3, 6 ou 12 meses.
autoRenewNãoIndica se a subscrição resultante é renovada automaticamente. Quando omitida, o valor predefinido é false.
requestIdNãoChave de idempotência com 8-128 caracteres unreserved do RFC 3986: A-Z, a-z, 0-9, ., _, ~ e -. Pode ser omitida para compatibilidade com clientes anteriores, mas é recomendada.

Use um requestId estável para uma única intenção confirmada pelo utilizador. Se ocorrer um timeout ou outro resultado desconhecido, repita o pedido com o mesmo payload e requestId. Uma repetição exata devolve os subscriptionId e invoiceId originais sem um segundo débito na carteira. A reutilização desse requestId com outro planId, durationMonths ou autoRenew é rejeitada. Gere um novo requestId para uma nova intenção de compra. Sem requestId, o pedido continua a ser aceite para compatibilidade com clientes anteriores, mas tentativas HTTP separadas não são retry-safe nem idempotentes.

Caso de idempotênciaComportamento obrigatório
same-intentEnvie o same-requestId com o same-payload.
exact-replayDevolve original-subscriptionId e original-invoiceId com no-second-debit.
conflicting-payloadO pedido é rejected.
new-intentGere um new-requestId.
missing-requestIdMantém backward-compatible, mas é not-retry-safe e not-idempotent-across-HTTP-attempts.

Resposta: HTTP 200 OK.

CampoObrigatórioDescrição
subscriptionIdSimIdentificador da subscrição ativada.
invoiceIdSimIdentificador da fatura paga.

POST /api/billing/account-plan/checkout

Cria um checkout para um plano de conta.

POST /api/billing/account-plan/crypto-checkout

Cria um checkout direto com criptomoeda para um plano de conta.

POST /api/billing/project-addon/balance-purchase

Compra com saldo um add-on de acesso gratuito para um projeto.

Corpo do pedido:

CampoObrigatórioDescrição
projectFullnameSimNome completo do projeto que recebe o add-on.
addonCodeSimIdentificador do add-on: project-free-access.
durationMonthsSimPeríodo de faturação: 1, 3, 6 ou 12 meses.
autoRenewNãoIndica se a subscrição resultante é renovada automaticamente. Quando omitida, o valor predefinido é false.
requestIdNãoChave de idempotência com 8-128 caracteres unreserved do RFC 3986: A-Z, a-z, 0-9, ., _, ~ e -. Pode ser omitida para compatibilidade com clientes anteriores, mas é recomendada.

Use um requestId estável para uma única intenção confirmada pelo utilizador. Se ocorrer um timeout ou outro resultado desconhecido, repita o pedido com o mesmo requestId e o mesmo payload completo, incluindo projectFullname, addonCode, durationMonths e autoRenew. Uma repetição exata devolve os subscriptionId e invoiceId originais sem um segundo débito na carteira. A reutilização desse requestId depois de alterar qualquer um desses campos é rejeitada. Gere um novo requestId para uma nova intenção de compra. Sem requestId, o pedido continua a ser aceite para compatibilidade com clientes anteriores, mas tentativas HTTP separadas não são retry-safe nem idempotentes.

Caso de idempotênciaComportamento obrigatório
same-intentEnvie o same-requestId com o same-full-payload: projectFullname, addonCode, durationMonths e autoRenew.
exact-replayDevolve original-subscriptionId e original-invoiceId com no-second-debit.
conflicting-payloadAlterar projectFullname, addonCode, durationMonths ou autoRenew faz com que o pedido seja rejeitado (rejected).
new-intentGere um new-requestId.
missing-requestIdMantém backward-compatible, mas é not-retry-safe e not-idempotent-across-HTTP-attempts.

Resposta: HTTP 200 OK.

CampoObrigatórioDescrição
subscriptionIdSimIdentificador da subscrição ativada do add-on do projeto.
invoiceIdSimIdentificador da fatura paga.

POST /api/billing/project-addon/checkout

Cria um checkout para um add-on de projeto.

Se o checkout alojado correspondente continuar pendente, uma nova tentativa devolve os subscriptionId, invoiceId e externalReference existentes, juntamente com um novo formulário checkout assinado. Envie o último formulário devolvido.

Caso do checkoutComportamento obrigatório
pending-hosted-retryDevolve os subscriptionId, invoiceId e externalReference existentes com um novo formulário checkout assinado.

POST /api/billing/project-addon/crypto-checkout

Cria um checkout direto com criptomoeda para um add-on de projeto.

Se um checkout pendente já estiver associado a uma ordem do fornecedor, a nova tentativa devolve os mesmos providerOrderId e paymentUrl. Se a criação ou associação da ordem tiver um resultado ambíguo, o checkout permanece pendente e falha de forma fechada: não inicie outro até cancelar ou reconciliar o checkout pendente.

Caso do checkoutComportamento obrigatório
pending-linked-order-retryDevolve os mesmos providerOrderId e paymentUrl.
ambiguous-provider-creation-or-linkageMantém fail-closed-pending e exige cancel-or-reconcile-before-new-attempt.

POST /api/billing/coupon/redeem

Resgata um cupão para um plano de conta pago.

Corpo do pedido:

CampoObrigatórioDescrição
codeSimCódigo do cupão. Os espaços iniciais e finais são removidos (trim) e a correspondência é case-insensitive.

O período pago do plano de conta do cupão é aplicado uma única vez. Consoante o período pago atual, o resgate prolonga-o, sobrepõe o período aplicável ou inicia um novo período.

Caso de resgateComportamento obrigatório
code-normalizationAplica trim e correspondência case-insensitive.
same-account-retryDevolve same-couponId, same-subscriptionId e same-invoiceId com no-second-application.
unavailable-or-unsafeUm cupão redeemed-by-another-account, deleted, invalid ou com unsafe-subscription-lineage deve fazer fail-closed.
paid-account-plan-periodUsa extend, overlay ou inicia um new-term, as-applicable.

Resposta: HTTP 200 OK.

CampoObrigatórioDescrição
couponIdSimIdentificador do cupão resgatado.
subscriptionIdSimIdentificador da subscrição resultante do plano de conta.
invoiceIdSimIdentificador da fatura paga do cupão.

POST /api/billing/coupon/gift-purchase

Compra um cupão-presente usando o saldo da carteira.

Corpo do pedido:

CampoObrigatórioDescrição
planIdSimPlano de conta pago: advanced ou pro.
durationMonthsSimDuração do cupão: 1, 3, 6 ou 12 meses.
requestIdNãoChave de idempotência com 8-128 caracteres unreserved do RFC 3986: A-Z, a-z, 0-9, ., _, ~ e -. Pode ser omitida para compatibilidade com clientes anteriores, mas é recomendada.

Na mesma conta, use um requestId estável para uma única compra de presente confirmada. Se ocorrer um timeout ou outro resultado desconhecido, repita o pedido com o mesmo plano e a mesma duração.

Caso de compraComportamento obrigatório
same-intentEnvie o same-requestId, same-planId e same-durationMonths.
exact-replayDevolve o same-couponId e o same-code com no-second-debit e no-second-referral-reward.
conflicting-payloadReutilizar o identificador do pedido com outro plano ou duração é rejected.
new-intentGere um new-requestId.
missing-requestIdMantém backward-compatible, mas é not-retry-safe e not-idempotent-across-HTTP-attempts.

Resposta: HTTP 200 OK.

CampoObrigatórioDescrição
couponIdSimIdentificador do cupão-presente comprado.
codeSimCódigo a entregar ao destinatário do cupão.

GET /api/billing/referral/overview

Devolve o resumo do saldo e da ligação de referência.

POST /api/billing/referral/link/create

Cria uma ligação de referência.

POST /api/billing/referral/claim

Resgata um código de referência.

POST /api/billing/subscription/update-renewal

Atualiza a renovação automática da faturação.

POST /api/billing/crypto-checkout/refresh

Atualiza o estado de um checkout com criptomoeda.

Para um add-on de projeto, um pagamento tardio após o cancelamento do checkout ou a transferência do projeto não reativa a subscrição nem o acesso ao projeto. O pagamento segue para reconciliação ou reembolso.

Caso do ciclo de vidaComportamento obrigatório
late-payment-after-cancel-or-project-transferPreserva no-reactivation e usa reconciliation-or-refund.

POST /api/billing/crypto-checkout/cancel

Cancela um checkout com criptomoeda.

O cancelamento é definitivo para a ativação do add-on do projeto. Se o pagamento for observado mais tarde, incluindo depois da transferência do projeto, não reativa a subscrição nem o acesso e segue para reconciliação ou reembolso.

Caso do ciclo de vidaComportamento obrigatório
late-payment-after-cancel-or-project-transferPreserva no-reactivation e usa reconciliation-or-refund.