Notifications

Notifications

Everything that happens to a recurrence and its charges is sent by POST to the URL in the recurrence's webhook field, set on creation or with a PATCH.

You receive two kinds of notification:

KindWhat it announcesFormat
Deposit callbackThe money came in: a charge settled, or the activation paymentThe same as any Pix: "type": "transaction"
Lifecycle eventsState changes of the recurrence and its charges"type": "automatic_pix", with resource and event

Tell them apart by the type field.

⚠️

Without a webhook on the recurrence, you receive neither. Set the URL when you create the recurrence, or later with PATCH.

Endpoint requirements

The same as the other webhooks:

  • ✅ Accept POST with a JSON body
  • ✅ Respond 2xx within 5 seconds. Do heavy processing afterwards.
  • ✅ Respond directly, without redirecting: a 3xx counts as a failed delivery
  • ✅ Be idempotent: the same notification may arrive more than once

A failed delivery is retried later. The events of one recurrence arrive in the order they happened.


How payment arrives

Every Automatic Pix payment, each cycle charge that settles and also the journey 3 activation payment, arrives as the standard PixToPay deposit callback: the same format as an ordinary Pix, described in Webhooks. If you already integrate Pix with PixToPay, there is nothing new to build here. The payment shows up in your reports and your balance like any other deposit.

Paid deposit (status 1)

{
  "id": 987654321,
  "transaction_id": "assinatura-8891-2026-11-01",
  "currency": "BRL",
  "amount": 99.9,
  "type": "transaction",
  "method": "pix",
  "status": 1,
  "created_at": "2026-10-27T06:00:00.000Z",
  "paid_at": "2026-11-03T09:12:40.000Z",
  "name": "Maria Silva",
  "document_number": "12345678909",
  "phone_number": null,
  "email": "maria.silva@exemplo.com.br",
  "payer": { "name": "Maria Silva", "document_number": "12345678909" },
  "e2eId": "E6070119020261103104500a1b2c3d4"
}

Lifecycle events

State changes of the recurrence and its charges are sent as events. They all have "type": "automatic_pix", the resource in resource (recurrence or charge) and what happened in event.

EventSent when
recurrence.createdThe recurrence was created (POST /recurrences).
recurrence.approvedThe payer authorized. From here on PixToPay creates the cycles' charges.
recurrence.rejectedThe payer or their bank refused the authorization.
recurrence.expiredThe authorization deadline passed with no answer.
recurrence.cancelledThe recurrence was cancelled: by you (PATCH), by the payer in their banking app, or by the bank.
charge.createdPixToPay created the cycle's charge, charge_lead_days days before the due date (default 5).
charge.scheduledThe payer's bank scheduled the debit (the charge is ACTIVE).
charge.cancelledThe charge was cancelled: by you (PATCH /charges/:charge_id) or by the payer's bank.
charge.expiredA debit attempt failed, typically because of insufficient funds. The charge stays ACTIVE; without this event you would not know the debit failed.
charge.retry_scheduledA retry was scheduled.

A settled charge already arrives as the paid deposit.

Recurrence event body

resource: "recurrence". Example of recurrence.approved:

{
  "id": 42,
  "transaction_id": "assinatura-8891",
  "amount": 99.9,
  "status": "APPROVED",
  "created_at": "2026-09-22T13:00:00.000Z",
  "type": "automatic_pix",
  "resource": "recurrence",
  "event": "approved",
  "method": "pix",
  "currency": "BRL",
  "external_id": "RR9012345620260922f3a1c7b28e4",
  "name": "Maria Silva",
  "document_number": "12345678909",
  "recurrence": {
    "recurrence_id": "RR9012345620260922f3a1c7b28e4",
    "status": "APPROVED",
    "contract": "assinatura-8891",
    "object": "Plano Gold mensal",
    "journey": "JOURNEY_2",
    "periodicity": "MONTHLY",
    "start_date": "2026-10-01",
    "end_date": null,
    "amount": 99.9,
    "min_amount": null,
    "retry_policy": "ALLOWS_3R_7D",
    "transaction_id": "assinatura-8891"
  }
}

Charge event body

resource: "charge". Same envelope, plus the charge block. Example of charge.expired:

{
  "id": 987654321,
  "transaction_id": "assinatura-8891-2026-11-01",
  "amount": 99.9,
  "status": "ACTIVE",
  "created_at": "2026-10-27T06:00:00.000Z",
  "type": "automatic_pix",
  "resource": "charge",
  "event": "expired",
  "method": "pix",
  "currency": "BRL",
  "external_id": "RR9012345620260922f3a1c7b28e4",
  "name": "Maria Silva",
  "document_number": "12345678909",
  "recurrence": {
    "recurrence_id": "RR9012345620260922f3a1c7b28e4",
    "status": "APPROVED",
    "contract": "assinatura-8891",
    "object": "Plano Gold mensal",
    "journey": "JOURNEY_2",
    "periodicity": "MONTHLY",
    "start_date": "2026-10-01",
    "end_date": null,
    "amount": 99.9,
    "min_amount": null,
    "retry_policy": "ALLOWS_3R_7D",
    "transaction_id": "assinatura-8891"
  },
  "charge": {
    "charge_id": "7f3c1a5e9b204d68a1c4e7f0b3d69258",
    "status": "ACTIVE",
    "due_date": "2026-11-03",
    "amount": 99.9,
    "attempt_count": 1,
    "last_attempt_status": "EXPIRED",
    "end_to_end_id": null,
    "transaction_id": "assinatura-8891-2026-11-01"
  }
}

Fields

FieldTypeDescription
idintegerRecurrence event: internal id of the recurrence. Charge event: deposit id of the charge, the same as in the paid deposit callback.
transaction_idstringRecurrence: the transaction_id sent on creation. Charge: <recurrence transaction_id>-<nominal due date YYYY-MM-DD>.
amountnumberAmount of the recurrence or the charge, in reais.
statusstringStatus of the resource at the time of the event.
created_atstringCreation date of the resource (ISO 8601, UTC).
typestringAlways automatic_pix.
resourcestringrecurrence or charge.
eventstringWhat happened: created, approved, rejected, expired, cancelled, scheduled or retry_scheduled.
methodstringAlways pix.
currencystringAlways BRL.
external_idstringThe recurrence's recurrence_id.
namestringPayer name.
document_numberstringPayer CPF/CNPJ.
recurrenceobjectThe recurrence: recurrence_id, status, contract, object, journey, periodicity, start_date, end_date, amount, min_amount, retry_policy, transaction_id.
chargeobjectOnly on charge events: charge_id, status, due_date, amount, attempt_count, last_attempt_status, end_to_end_id, transaction_id.

Each event carries the status of the moment it happened. A recurrence.created arrives with "status": "CREATED" even if delivery is delayed and the payer has authorized in the meantime. On charge events, the top-level status and the one in charge are the event's; the status inside recurrence is the recurrence's current one.