Fixed Recurring Payments automate scheduled payments against an authorised enduring consent. Once set up, payments execute automatically on a recurring basis without further merchant or customer intervention.
When to Use Fixed Recurring
Fixed Recurring is ideal when:
Common use cases: Fixed-fee subscriptions, charity donations, membership dues, loan repayments, gym memberships.
For variable amounts or custom timing, use Variable Recurring Payments instead.
Two concepts to keep straight:
period, and the schedule ends when it is cancelled or when the consent is revoked or reaches its expiry_timestamp. Think of it as similar to a direct debit mandate.Each FPE has its own status, retry behaviour, and webhook events, so you get granular visibility into every individual debit. Throughout this guide, "schedule" or "FRP" refers to the recurring rule and "FPE" refers to an individual scheduled execution.
One-Time Setup:
Automated Payments: BlinkPay automatically initiates payments at 9am NZ time on each scheduled date. Payments continue until the schedule is cancelled or the underlying consent is revoked or expires.
Before creating a Fixed Recurring Payment schedule, you must first have an authorised enduring consent. See Recurring Payments for how to create and authorise an enduring consent.
Requirements:
Authorised statusmaximum_amount_payment or maximum_amount_periodstart_date must be today or in the future (NZ timezone); omit it to default to the later of today and the consent's activation datedaily consents, start_date cannot be today if the request is submitted after 21:45 NZ — set it to tomorrow insteadThe consent's from_timestamp and expiry_timestamp are converted to NZ time before their dates are compared with start_date, so a timestamp sent in another offset may fall on a different NZ date.
One Schedule Per Consent
Each enduring consent can have only one active Fixed Recurring Payment schedule at a time. To change the schedule, cancel the existing one and create a new schedule.
| Method | Path | Description |
|---|---|---|
POST | /payments/v1/fixed-recurring-payments | Create schedule |
GET | /payments/v1/fixed-recurring-payments/{fixed_recurring_payment_id} | Get schedule |
DELETE | /payments/v1/fixed-recurring-payments/{fixed_recurring_payment_id} | Cancel schedule |
Request:
POST /payments/v1/fixed-recurring-payments HTTP/1.1
Host: sandbox.debit.blinkpay.co.nz
Authorization: Bearer {access_token}
Content-Type: application/json
idempotency-key: b5d9f3a7-2c6e-4b1d-8f4a-0e7c3a9d5b2f
{
"consent_id": "8f7e6d5c-4b3a-2c1b-0a09-8f7e6d5c4b3a",
"start_date": "2026-01-14",
"amount": {
"total": "99.00",
"currency": "NZD"
},
"pcr": {
"particulars": "Subscription",
"code": "Monthly",
"reference": "Service"
},
"retry_strategy": "same_day"
}
| Field | Required | Description |
|---|---|---|
consent_id | yes | An authorised enduring consent. |
amount | yes | Per-payment amount. Must not exceed the consent's maximum_amount_payment or maximum_amount_period. |
pcr | yes | Particulars, Code, and Reference shown on the customer's bank statement. Each field max 12 characters. |
start_date | no | First scheduled payment date (NZ timezone). Must be today or in the future. Defaults to the later of today and the consent's activation date (its from_timestamp, NZ timezone) if omitted. For daily consents, cannot be today when the request is submitted after 21:45 NZ. |
retry_strategy | no | none (default) or same_day — see Retry Strategies. |
PCR Field Limits
Each PCR field (particulars, code, reference) has a maximum length of 12 characters. Requests with longer values are rejected with a 400 validation error — values are never truncated.
Response:
{
"fixed_recurring_payment_id": "9f8e7d6c-5b4a-3c2b-1a09-8f7e6d5c4b3a"
}
Retrying the create request. Send an idempotency-key (a UUID) and reuse it if the request times out: the same key and body return the original fixed_recurring_payment_id. A consent can have only one active schedule (409 BP705).
If BlinkPay has enabled surcharging on enduring consents for your merchant account, instalments are surcharged by the same rules as any other payment on the consent; see Surcharging. The schedule's amount is the amount before the surcharge.
An instalment whose amount equals the consent's maximum_amount_payment is surcharged in full, less a few cents of rounding, unless rates have risen since the consent was created, in which case the surcharge is capped at what the consent allows. Smaller instalments follow the rules on that page.
Request:
GET /payments/v1/fixed-recurring-payments/{fixed_recurring_payment_id} HTTP/1.1
Host: sandbox.debit.blinkpay.co.nz
Authorization: Bearer {access_token}
Response:
{
"fixed_recurring_payment_id": "9f8e7d6c-5b4a-3c2b-1a09-8f7e6d5c4b3a",
"consent_id": "8f7e6d5c-4b3a-2c1b-0a09-8f7e6d5c4b3a",
"status": "active",
"start_date": "2025-12-17",
"next_payment_date": "2026-01-17",
"amount": {
"total": "99.00",
"currency": "NZD"
},
"pcr": {
"particulars": "Subscription",
"code": "Monthly",
"reference": "Service"
},
"retry_strategy": "same_day",
"creation_timestamp": "2025-12-17T09:00:00+13:00"
}
| Field | Description |
|---|---|
fixed_recurring_payment_id | Unique identifier for the schedule. |
consent_id | The underlying enduring consent. |
status | active or cancelled. |
start_date | The first scheduled payment date. Taken from the create request; defaults to the later of today and the consent's activation date (NZ timezone) if not supplied. |
next_payment_date | Next scheduled payment date. |
amount | Per-payment amount, as supplied at creation. |
pcr | Particulars, Code, and Reference shown on the customer's bank statement. |
retry_strategy | none or same_day — see Retry Strategies. |
creation_timestamp | When the schedule was created (ISO 8601). |
status_updated_timestamp | When the status was last updated (ISO 8601). |
Request:
DELETE /payments/v1/fixed-recurring-payments/{fixed_recurring_payment_id} HTTP/1.1
Host: sandbox.debit.blinkpay.co.nz
Authorization: Bearer {access_token}
Response: 204 No Content
Cancellation Does Not Revoke Consent
Cancelling a Fixed Recurring Payment schedule does NOT revoke the underlying enduring consent. The consent remains active and can be used for manual payments or a new schedule.
You can make your own payments with POST /payments/v1/payments on a consent that has an active schedule, for example to collect a one-off charge. They share the consent with the schedule's instalments, which has three effects:
maximum_amount_period, so a manual payment can leave too little for the next instalment in that period.409 BP703, which names the payment to poll.See Recurring Payments for how to make and retry manual payments.
| Event | Timing |
|---|---|
| First payment | Initiated at the first scheduler tick at or after 09:00 NZ time on start_date; if the consent's from_timestamp is later that day, the first payment waits until from_timestamp, at every bank. |
| Subsequent payments | Anchored to the FRP's start_date, advanced by the period count (not chained off the previous FPE). Initiated at the first tick from 09:00 NZ time on the scheduled date, except at banks with their own payment spacing rules — see Bank-specific timing below. |
| Operating window | Ticks every 15 minutes from 09:00 NZ time (Pacific/Auckland) with the last tick at 21:45; the retry window closes at 22:00 |
The operating window governs when payment attempts and same_day retries start — it does not delay webhook events, which fire whenever an FPE actually resolves, at any hour. If an FPE's scheduled date passes before the scheduler processes it (for example, a schedule created later in the day with today's start_date), it is not skipped and its scheduledDate is not rewritten — it processes at the next scheduler tick. Periods always roll forward.
Daily schedules only: a daily FRP is rejected at creation if its first payment could not run on start_date — either the request is submitted after the day's last scheduler tick (21:45 NZ), or the consent does not become active until after that tick on that date. Set start_date to the following day and retry. Doesn't apply to other periods.
Once an FPE has been submitted to the bank, its outcome is resolved 24/7 — the operating window only governs when first attempts and retries start, not when in-flight payments settle. An FPE submitted at 21:40 that the bank confirms at 23:00 reaches its terminal status that night and fires the corresponding webhook.
Westpac measures a consent's period from the previous payment, so Westpac instalments are initiated at around the same time of day as the previous payment rather than at 09:00. Blink applies the spacing; the scheduled date is unchanged. ANZ, ASB, BNZ and Kiwibank count periods from the date of the consent's from_timestamp, so their instalments are initiated at the first tick from 09:00.
The payment frequency is determined by the underlying enduring consent's period:
| Period | Nth date calculation (N = number of periods elapsed) |
|---|---|
daily | start_date + N days |
weekly | start_date + N weeks |
fortnightly | start_date + (N × 2) weeks |
monthly | start_date + N months |
annual | start_date + N years |
Period Alignment
The schedule is anchored to the FRP's start_date. For example, a monthly schedule starting on 14 January fires on 14 January, 14 February, 14 March, and so on.
Month-End Behaviour
For monthly schedules, each scheduled date is calculated from the FRP's start_date anchor, not from the previous scheduled date. When the anchor day doesn't exist in a given month (e.g. the 31st of a 30-day month), the schedule falls back to the last day of that month for that period only and resumes the original anchor day in the next month where it exists.
For example, a schedule starting on 31 January fires on 31 Jan → 28 Feb (or 29 in leap years) → 31 Mar → 30 Apr → 31 May → 30 Jun → 31 Jul.
An annual schedule starting on 29 February fires on 28 February in other years and on 29 February in leap years.
The customer's bank may count a fallback date such as 28 February in the same period as the payment before it. If the instalment equals maximum_amount_period, the bank can refuse it with BP036, so start a schedule on or before the 28th of the month.
| Strategy | Behaviour |
|---|---|
none | No retries — the schedule advances to the next period on failure. |
same_day | Retries hourly within the same calendar day, then advances to the next period. |
none (Default)On failure the FPE is marked failed, the fixed-recurring-payment-failed webhook fires, and the schedule advances to its next scheduled date. No retries are attempted.
same_dayOn failure, the FPE is retried roughly hourly through the day, up to 22:00 NZ time. If it still hasn't succeeded by then, the FPE is marked failed and the schedule advances. Retries do not carry over to the next day.
BlinkPay's retries can't double-charge; don't add your own retries of a failed instalment on top; if you want to collect a missed amount yourself, make a manual payment and follow the retry rules for manual payments.
Some bank rejections cannot be cleared by retrying within the same period and are not retried — the FPE is marked failed immediately and the schedule advances to its next scheduled date. This covers cases like the consent's per-payment or per-period cap being exceeded and the consent's frequency or total-count limit being reached. If the bank's rejection shows the consent itself has been revoked or is no longer authorised, the schedule is cancelled instead — the fixed-recurring-payment-cancelled webhook fires rather than failed (see Auto-Cancellation). Transient infrastructure failures (bank 5xx, network errors) still follow the hourly retry budget.
| Status | Description |
|---|---|
active | Schedule is running and will execute payments |
cancelled | Schedule has been cancelled (manually or automatically) |
Schedules are automatically cancelled when the underlying consent becomes unusable. The timing depends on how the consent ended:
DELETE /enduring-consents/{id} — the FRP is cancelled synchronously as part of the revoke transaction, and the fixed-recurring-payment-cancelled webhook fires immediately.expiry_timestamp — the schedule is cancelled no later than its next payment date, and the fixed-recurring-payment-cancelled webhook fires then.Each FPE is recorded as a standard payment. Query the parent enduring consent to retrieve every FPE that has run against it:
Request:
GET /payments/v1/enduring-consents/{consent_id} HTTP/1.1
Host: sandbox.debit.blinkpay.co.nz
Authorization: Bearer {access_token}
The response includes a payments array containing every FPE made against the consent, each with its own status, timestamp, and amount.
Rather than polling each instalment for its outcome, subscribe to the fixed-recurring-payment-completed, fixed-recurring-payment-failed and fixed-recurring-payment-cancelled events: BlinkPay sends a signed event each time an instalment completes or fails, or the schedule is cancelled. Payment timing is set by BlinkPay rather than by you, so webhooks suit Fixed Recurring Payments well. The Webhooks guide covers the events and what they carry, subscribing, verifying the signature, retries, deduplication and testing in the sandbox.