This page lists the error codes the Blink Data API returns, with the cause of each and what to do. A classified error carries a code (format BDTnnn) and a message; the message often names the rejected value, so log it.
Some errors carry no code. A missing required field or query parameter, or a date that can't be parsed, returns 400 with only a message, so read message and check the request against the Data Retrieval guide. A consent_id that doesn't exist, or that belongs to another organisation, returns 404: treat it as not found.
{
"timestamp": "2026-10-15T10:30:00.000+13:00",
"path": "/v1/accounts/0e2b6c35-8f0a-4d5e-9c1b-2a7d4f6e8b90/transactions",
"status": 400,
"error": "400 BAD_REQUEST",
"message": "To date time must not be before from date time",
"code": "BDT237"
}
Branch on status and code. Don't parse error.
| Code | Cause | Fix |
|---|---|---|
| BDT211 | The redirect_uri is not whitelisted for your organisation | Add it under Settings > API Settings in the portal, in the row for the environment you are calling |
| BDT212 | The redirect_uri is malformed | Send an absolute URI |
| BDT213 | The bank is valid but not set up for your organisation, for example a production bank in the sandbox | Use PNZ in the sandbox; in production, contact BlinkPay to enable the bank |
| BDT228 | The decoupled identifier_type is not supported by that bank | Use an identifier the bank accepts (see Sandbox and Production Banks) |
| BDT230 | The mobile number is not valid | Check the number the customer entered |
| BDT240 | expiration_date_time is before start_date_time | Set the expiry after the start |
| BDT241 | A permission the bank doesn't offer, for example ReadStatements at a bank without statements | Remove the permission for that bank; GET /v1/meta lists each bank's features |
| BDT242 | permissions is empty | Send at least one permission |
| BDT243 | The bank value is not recognised | Use an exact, case-sensitive value: ANZ, ASB, BNZ, Westpac, Kiwibank, NZHL or PNZ |
| BDT244 | expiration_date_time is before end_date_time | Set the expiry on or after the end |
| BDT245 | Unknown flow.detail.type | Use gateway, redirect or decoupled |
| BDT246 | Unknown flow.flow_hint.type | Use redirect or decoupled |
| BDT251 | end_date_time is not after today (New Zealand date) | Use a date from tomorrow onwards, or omit it |
| BDT252 | start_date_time is in the future | Use a start date-time that is now or earlier |
| BDT254 | The idempotency-key header is longer than 255 characters | Use a shorter key; a UUID is recommended |
| BDT255 | Both idempotency-key and the deprecated x-idempotency-key were sent | Send only idempotency-key |
| BDT257 | start_date_time and end_date_time fall on the same date (New Zealand time) | Make the data window span at least two dates |
| BDT258 | expiration_date_time falls on the date the consent is created (New Zealand time) | Set an expiry on a later date, or omit it for no expiry |
| BDT259 | A field has the wrong JSON type | Check the field named in message |
| BDT260 | A flow_hint has no bank | Add bank to the hint; Blink Data requires it |
| BDT261 | flow.detail.type is missing or empty | Set type to gateway, redirect or decoupled |
| BDT262 | flow.flow_hint.type is missing | Add type to the hint |
| BDT264–BDT268 | The decoupled callback_url is malformed, uses a scheme other than http or https (production requires https), or its host is not public or does not resolve | Use a public URL, https in production |
| BDT236 | The requested dates fall outside the consent's start_date_time to end_date_time window | Keep the date range within the consent's window |
| BDT237 | The to date is before the from date | Swap or correct the dates |
| BDT238 | The to date is after today | Use today or earlier, or omit it |
| BDT239 | The from date is in the future | Use a from date today or earlier |
| BDT263 | The bank's result is too large to return in one request | Narrow the request, for example the date range, and retry |
| BDT299 | The request body could not be read | Check the JSON body against the examples in the Data Retrieval guide |
| Code | Cause | Fix |
|---|---|---|
| BDT401 | The redirect flow is not enabled for that bank | Use another flow (the gateway or decoupled) or contact BlinkPay |
| BDT402 | The decoupled flow is not enabled for that bank | Use another flow (the gateway or redirect) or contact BlinkPay |
| BDT403 | The gateway flow is not enabled for your organisation | Use the redirect or decoupled flow, or contact BlinkPay to enable the gateway |
| BDT409 | The consent was rejected | Create a new consent |
| BDT410 | The consent has been revoked | Create a new consent |
| BDT411 | The consent doesn't include the permission this endpoint needs | Create a new consent with the required permission |
| BDT412 | The consent has expired (its expiration_date_time has passed; it becomes Consumed) | Create a new consent |
| BDT413 | The consent is not yet authorised | Wait for the customer to finish authorising; check with GET /v1/consents/{consent_id} |
| BDT415 | The bank says the consent is no longer usable, for example because the customer revoked it at the bank | Create a new consent |
| Code | Cause | Fix |
|---|---|---|
| BDT101 | The consent doesn't exist, or belongs to another organisation | Check the consent ID, and that you are calling the environment the consent was created in |
| Code | Cause | Fix |
|---|---|---|
| BDT701 | The idempotency key was reused with a different request body | Use a new idempotency key for a different request |
| BDT702 | The consent has already been revoked | No action needed; access is already removed |
| BDT704 | A consent request with the same idempotency key is still in progress | Retry with the same key once the first request completes |
| Code | Cause | Fix |
|---|---|---|
| BDT009 | Revoking a consent that has already ended (Rejected, GatewayTimeout or Consumed) | No action needed; create a new consent if you still need access |
| BDT013 | The consent timed out at the gateway (GatewayTimeout) | Create a new consent |
| BDT014 | A BNZ consent with start_date_time more than 2 years ago | Use a start date within the last 2 years |
| Code | Cause | Fix |
|---|---|---|
| BDT603 | The bank could not accept the request at this time | Wait, then retry with backoff |
| Code | Cause | Fix |
|---|---|---|
| BDT601 | The bank's service is down or not responding | Retry with backoff; check for bank maintenance |
| BDT602 | The bank rate-limited the request | Wait briefly, then retry with backoff |
| BDT604 | A temporary Blink Data problem | Retry shortly |
For errors not listed here or for assistance troubleshooting:
message field for specific details