PagnovoPagnovodocs

Referência da API

Atualizar oferta

Atualiza campos da Offer. **Campos snapshot (`amount`, `billingCycle`, `billingCycleCount`, `maxCycles`, `trialDays`) são bloqueados se a Offer tem assinaturas ou PaymentLinks ativos** — a API recusa com 400 listando quantos dependentes ativos existem. Verifique `stats.canEditSnapshotFields` em `GET /v2/offers/:id` antes de tentar editar. Campos sempre editáveis: `name`, `description`, `active`, `externalId`, `metadata`. **PDF de entrega:** este endpoint **não aceita** `deliveryPdfUrl` no corpo. Use [POST /v2/offers/:id/delivery-pdf](/docs/api/upload-offer-pdf) pra trocar ou [DELETE /v2/offers/:id/delivery-pdf](/docs/api/delete-offer-pdf) pra remover.

PATCH/v2/offers/:id
Snapshot fields bloqueados se há dependentes
amount Tentar editar amount/billingCycle/etc com assinaturas ativas retorna 400. Use `stats.canEditSnapshotFields` pra saber se pode editar, ou simplesmente crie uma Offer nova com o valor corrigido e desative a antiga via `active: false`.

Autenticação

HTTP Basic Auth. Envie sua secret key no header:

Authorization: Basic {base64(secret:SUA_SECRET_KEY)}

Parâmetros

idstring (path, UUID)obrigatório

UUID da Offer.

Exemplo: off_xyz789

Body da requisição

Content-Type: application/json

JSON
// Edição segura (sem campos de preço/ciclo):
{
  "name": "Plano Mensal Premium",
  "description": "Atualizado com novo material",
  "active": false
}

// Tentativa de editar preço/ciclo (vai dar 400 se houver dependentes):
{
  "amount": 5900,
  "trialDays": 14
}

Respostas

200

Offer atualizada.

JSON
{
  "id": "off_xyz789",
  "name": "Plano Mensal Premium",
  "active": false,
  "updatedAt": "2026-05-26T16:00:00.000Z"
}
400

Causas: tentou editar campos de preço/ciclo com dependentes ativos, validação falhou, externalId já existe, ou Offer arquivada.

JSON
{
  "status": 400,
  "error": "Esta oferta tem 47 assinatura(s) ativa(s) e 2 link(s) de pagamento ativo(s). Os campos amount, trialDays nao podem ser alterados — crie uma nova oferta com o valor atualizado e desative esta."
}
404

Offer não encontrada.

JSON
{ "status": 404, "error": "Oferta nao encontrada" }

Exemplos

cURL
# Edição segura — desativa a oferta sem mudar valores
curl -X PATCH "https://api.pagnovo.com/v2/offers/off_xyz789" \
  -H "Authorization: Basic $(echo -n 'secret:SUA_SECRET_KEY' | base64)" \
  -H "Content-Type: application/json" \
  -d '{ "active": false }'
JavaScript
// Padrão: cria oferta nova e desativa a antiga (mudança de preço segura)
const token = Buffer.from("secret:" + process.env.PAGNOVO_SECRET_KEY).toString("base64");
const headers = { Authorization: `Basic ${token}`, "Content-Type": "application/json" };

// 1. Cria oferta nova com preço novo
const novaOferta = await fetch("https://api.pagnovo.com/v2/offers", {
  method: "POST", headers,
  body: JSON.stringify({
    productId: oldOffer.productId,
    name: oldOffer.name + " — preço 2026",
    amount: 5900,                   // novo preço em centavos
    billingCycle: oldOffer.billingCycle,
    billingCycleCount: oldOffer.billingCycleCount,
    maxCycles: oldOffer.maxCycles,
    trialDays: oldOffer.trialDays,
  }),
}).then(r => r.json());

// 2. Desativa a antiga (mas mantém ela ativa pra subs existentes)
await fetch(`https://api.pagnovo.com/v2/offers/${oldOffer.id}`, {
  method: "PATCH", headers,
  body: JSON.stringify({ active: false }),
});

// 3. Atualiza seus PaymentLinks pra apontar pra nova oferta
//    (PaymentLink usa offerId — veja docs de PaymentLinks)