Consents in BlinkPay follow a defined lifecycle from creation through authorisation to completion or termination. Understanding these states is crucial for proper error handling and user experience.
Consents progress through these states, and the starting state depends on your flow:
Initial state for Gateway Flow consents
The consent has been created and is waiting for the customer to be redirected to the Blink Gateway. This is a transient state that occurs immediately after consent creation.
Typical duration: Seconds (until redirect)
Next states:
AwaitingAuthorisation - Customer selected their bank at the Gateway and was sent to it to authoriseAuthorised - Card payment only: 3DS authentication succeededRejected - Card payment only: 3DS authentication failedGatewayTimeout - The Gateway session cutoff elapsed before the customer chose a bank - see Authorisation timeoutsMerchant actions:
redirect_uri returned in the consent responseThis state only applies to Gateway Flow. Redirect and Decoupled flows skip directly to AwaitingAuthorisation.
Consent is waiting for customer approval at their bank
The consent has reached the customer's bank and is waiting for them to authenticate and approve the request. All three flows use this state, and they reach it differently:
Typical duration: 1-5 minutes, bounded by the authorisation window for that bank and flow - see Authorisation timeouts
Next states:
Authorised - Customer approved the consentRejected - Customer declined, the bank rejected it, or the authorisation window elapsedMerchant actions:
If the customer comes back to your site or app before the consent has left this state, don't revoke it or treat it as failed: they may still approve it in their banking app. Keep checking until the authorisation window ends, then reconcile.
Customer has approved the consent
The customer successfully authenticated with their bank and approved the consent. The consent is now ready to be used for payments (single or enduring) or data access.
For single consents:
Consumed once the bank settles its payment, or rejects the payment after accepting itRejected and the consent stays Authorised, so you can create the payment again with a new idempotency-keyGET as soon as the customer returns (the gateway normally does this for you); that call completes the paymentRejected and can no longer be used, so create a new consent. A card payment holding a reservation is the exception: the reservation is released automatically insteadFor enduring consents:
Authorised stateRevoked if customer or merchant cancelsFor data consents:
Authorised stateRevoked or expire naturallyMerchant actions:
consent_idconsent_id securelyRevoked, and POST /payments returns 422 BP015. See NotificationsThe consented action is complete (Final state)
The consent cannot be used for further payments.
Applicable to:
expiry_timestamp has passed
Consumeddoes not mean the payment has settled. It means the consented action is complete. A single consent whose payment the bank rejected after accepting it is alsoConsumed, with aRejectedpayment. Usepayment.status = AcceptedSettlementCompletedas the only signal that funds have settled. See the payment lifecycle settlement guide for details.
Merchant actions:
payments[] array or the payment endpointThe consent was declined, was never authorised in time, or was not paid in time (Final state)
The consent was rejected either by:
Common reasons:
Merchant actions:
For quick payments, a rejected consent also creates a payment record with status: Rejected in the embedded payments[] array, so the payment status reflects the outcome for both authorised and rejected quick payments.
No Rejection Reason Field
Neither the consent nor its payments carry a rejection reason. On a redirect or gateway return, branch on status (see Return Parameters) and confirm the outcome with a GET. An error from an API call carries a BlinkPay error code.
Gateway session expired before the customer chose a bank (Final state)
The customer didn't select a bank within the Gateway session cutoff - see Authorisation timeouts. This state applies only while a Gateway Flow consent is still at the Gateway. Once the customer has reached a bank, an unauthorised consent ends as Rejected instead.
Common causes:
Merchant actions:
Timeout Prevention
Keep the checkout flow simple and fast, clearly communicate what will happen, and minimise the steps before initiating the consent.
Consent was cancelled (Final state)
The consent was explicitly revoked by either:
Revocation sources:
DELETE /payments/v1/single-consents/{consent_id} or DELETE /payments/v1/enduring-consents/{consent_id}Merchant actions:
A revocation made at the customer's bank is not pushed to you: it shows as Revoked when you next read the consent or attempt a payment. If the consent has an active Fixed Recurring Payment, the schedule is cancelled and you receive a fixed-recurring-payment-cancelled webhook.
Every timer on both products is listed in Timeouts and Deadlines.
The time a customer has to authorise a consent is set per bank and per flow, not a single platform-wide figure. Windows currently run from about four to ten minutes, and are not always a whole number of minutes. Decoupled windows are usually the shorter of the two at a given bank, though not always. Read the live value for the bank you're sending the customer to from the bank metadata endpoint rather than assuming a fixed figure. Applying your own shorter cutoff is reasonable if it suits your checkout — just reconcile the consent afterwards rather than assuming it failed, since the customer may still authorise it.
Gateway Flow consents have a second, earlier cutoff - 15 minutes by default - that applies while the consent is still at the Gateway and the customer hasn't chosen a bank yet. Gateway Flow has no authorisation window of its own: once the customer picks a bank, that bank's redirect or decoupled window applies.
If the customer never returns, the consent ends as Rejected - or as GatewayTimeout if it was a Gateway Flow consent still waiting on bank selection. No payment is created and no funds move, so create a new consent if the customer wants to retry.
These are the status changes you can expect to observe, and what causes each one:
| From State | To State | Applies to | Cause |
|---|---|---|---|
| GatewayAwaitingSubmission | AwaitingAuthorisation | Gateway | Customer chose their bank and was sent to it |
| GatewayAwaitingSubmission | Authorised | Gateway, card payments only | Card 3DS authentication succeeded |
| GatewayAwaitingSubmission | Rejected | Gateway, card payments only | Card 3DS authentication failed |
| GatewayAwaitingSubmission | GatewayTimeout | Gateway | Gateway session cutoff elapsed before bank selection |
| AwaitingAuthorisation | Authorised | Gateway, Redirect, Decoupled | Customer approved |
| AwaitingAuthorisation | Rejected | Gateway, Redirect, Decoupled | Customer or bank declined, or the authorisation window elapsed |
| Authorised | Consumed | All | Payment settled, or rejected by the bank after accepting it (single, quick); expiry passed (enduring) |
| Authorised | Revoked | All | Consent cancelled |
| Authorised | Rejected | All (single consents) | Not paid within 48 hours of authorisation (card reservations excepted) |
Only Gateway Flow consents reach GatewayAwaitingSubmission, so the first four rows never apply to a redirect or decoupled integration.
Terminal states (Consumed, Rejected, GatewayTimeout, Revoked) are permanent - a consent never moves out of one. You can't reuse a consumed single consent, reauthorise a rejected one, revive a timed-out one, or un-revoke a revoked one, so always create a new consent for retries.
Retrieve consent status via the GET endpoint:
GET /payments/v1/single-consents/{consent_id} HTTP/1.1
Host: sandbox.debit.blinkpay.co.nz
Authorization: Bearer {access_token}
Polling recommendations:
callback_url, to know when to look, then read the consent and poll every second if it isn't terminal yet. In the direct decoupled flow with no callback, poll every 5 seconds.AcceptedSettlementCompleted or Rejected, within your polling window.For Decoupled Flow, you can provide a callback_url in the consent request. BlinkPay calls it when the customer authorises, the bank rejects the consent, or the authorisation window times out. It is an unsigned GET with the consent ID as cid and no status, and it can arrive more than once or not at all, so always fetch the consent to read the outcome. See Consent Authorisation Callback.
| State | Recommended Action |
|---|---|
| Consumed | The consented action is complete: the bank has made its final decision on the payment (single, quick) or the consent period has ended (enduring). No longer usable. Does not imply the underlying payment has settled — check payments[].status for that. Create a new consent for additional payments. |
| Rejected | Display friendly error message. Offer retry with new consent or alternative payment method. |
| GatewayTimeout | Inform customer the session expired. Offer to restart the payment process. |
| Revoked | Stop any scheduled payments for this consent. Notify customer if revoked by merchant. |
Retry Guidance
For Rejected and GatewayTimeout states, always create a new consent rather than attempting to reuse the existing one. Terminal states are permanent.
Enduring consents (AutoPay) have a different lifecycle pattern than single consents:
Authorised)Consumed once its expiry date has passed, or Revoked if cancelledKey difference from single consents: Enduring consents remain in Authorised state for multiple payments until expiry or revocation.
expiry_timestamp: after that time the consent is Consumed, and a payment against it is rejected with 422 BP003expiry_timestamp: Consent remains Authorised indefinitely until explicitly revokedA consent cannot be renewed or extended: to keep taking payments, create a new consent and ask the customer to authorise it. Payment limits apply per period, counted from from_timestamp; see Period Calculation.
AuthorisedConsumed, Rejected, GatewayTimeout, Revoked) gracefully