Skip to content

Get a payment batch

GET
/api/v1/payment-batches/{batch_id}
curl --request GET \
--url https://api.elephants.inc/api/v1/payment-batches/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0 \
--header 'Authorization: Bearer <token>'

Returns a batch with its rows. Visible to the requester and to approvers.

batch_id
required
string format: uuid

The batch’s ID

The batch

Media typeapplication/json
PaymentBatch
object
amount_side
required

Which side row amounts are entered on

string
Allowed values: landing deducting
approval_request_id
required
string | null format: uuid
approved_at
required
string | null format: date-time
balance_shortfall
required

How much the source balance is short of total_deducting, for a viewer who may see balances; null when it covers the batch, the viewer may not see it, or the batch is past approval (its total is on hold)

object
amount
required

Decimal string at the currency’s precision, e.g. “10.50”

string
<= 255 characters
currency
required

Three-letter currency code, e.g. “USD”

string
<= 16 characters
completed_at
required
string | null format: date-time
created_at
required
string format: date-time
expired_row_count
required

Rows whose quote has lapsed; requote the batch when non-zero

integer
failed_count
required
integer
fee_components
required

Every ready row’s fee lines summed by code in the source currency, with rate and bands null; empty until reviewed, or when a row’s fee is in another currency

Array<object>
object
amount
required
object
amount
required

Decimal string at the currency’s precision, e.g. “10.50”

string
<= 255 characters
currency
required

Three-letter currency code, e.g. “USD”

string
<= 16 characters
bands
required

The points-cap band split behind a merged booster component: each band’s own rate and the slice of the amount it billed. Null on every other component.

Array<object> | null
object
amount
required
string
band
required
string
Allowed values: within_allowance overage
rate
required
string
code
required
string
Allowed values: partner_fee ele_fee additive_fee
label
required
string
rate
required
string | null
fx_rate
required

The one provider rate the batch was priced at (payout currency per unit of source currency, before fees), when every ready row quotes the same pair and rate; null before review, when the source equals the payout currency, or when rows differ. Fees vary per row by band, so the all-in rate does not.

string | null
held_count
required

Rows whose payment is on hold; the batch stays executing while non-zero

integer
id
required
string format: uuid
internal_notes
required
string | null
name
required

The batch’s name

string | null
needs_fix_count
required

Live rows with a needs_fix issue; pricing and submit wait on zero

integer
organization_id
required
string format: uuid
payout_currency
required

The currency every recipient receives

string
payout_reason
required

Payout reason code shared by every row

string
points
required

Ele reward points the ready rows earn together; null until reviewed

string | null
rerun_of_batch_id
required

The batch this one was rerun from

string | null format: uuid
reserved
required

What the batch still holds on the source balance: the total from approval, less each row’s share as it is sent or given back; null before approval and once the batch completes

object
amount
required

Decimal string at the currency’s precision, e.g. “10.50”

string
<= 255 characters
currency
required

Three-letter currency code, e.g. “USD”

string
<= 16 characters
retry_of_batch_id
required

The batch whose failed rows this one retries

string | null format: uuid
row_count
required
integer
rows
required
Array<object>
PaymentBatchRow
object
amount
required

The amount entered for this row, on amount_side; null on a fresh draft row

string | null
amount_side
required
string
Allowed values: landing deducting
changes
required

What differs from the uploaded line: each upload column the row was edited on since the import (the sheet’s text as from, the row’s value as to). Empty for a row as uploaded, a row that did not come from a file, and a removed row.

Array<object>
PaymentBatchRowChange
object
field
required

The upload column whose value the row no longer matches

string
Allowed values: beneficiary_id account_holder_name account_type bank_country bank_name account_number iban swift_code routing_number sort_code bsb_code ifsc_code branch_code bank_code address_line1 address_line2 city state postal_code amount currency reference recipient_email
from
required

The sheet’s text

string | null
to
required

The row’s value now; null when cleared

string | null
contact_name
required

The contact’s name, or the inline recipient’s account holder name

string | null
destination
required
One of:
One of: discriminator: rail
FiatDestination
object
account_holder_name
required
string
account_type
required
string
Allowed values: individual business
bank
required
object
country_alpha2
required
string
name
required
string
bank_details
required
Array<object>
object
label
required
string | null
name
required
string
value
required
string
country_alpha2
required
string
currency
required
string
id
required
string format: uuid
is_own_account
required
boolean
nickname
required
string | null
rail
required
string
Allowed values: fiat
registration_failed_at
required
string | null format: date-time
registration_failure_message
required

Why the last registration attempt failed, in customer-facing copy. Null once active.

string | null
<= 500 characters
status
required

Whether the destination is registered with the payout partner. Only active destinations can be quoted or paid.

string
Allowed values: draft active
street_address
required
object
address_line1
required
string
address_line2
required
string | null
city
required
string
country_code
required
string
iso_subdivision_code
required
string | null
postal_code
required
string | null
state
required
string | null
state_code
required
string | null
destination_id
required
string | null format: uuid
destination_summary
required

Deprecated: read destination instead. Recipient currency and masked account, e.g. “VND ••4471”

string | null
disposition
required

Set at review. ready rows carry a quote; every other value names why the row cannot be sent. Null before the first review.

string | null
Allowed values: ready needs_fix missing_amount currency_mismatch destination_not_ready contact_not_approved corridor_closed below_minimum quote_failed
error
required

Why the row cannot be or was not paid; null when nothing is wrong. At review, the detail behind the blocker (the issue, or the reason the inline recipient could not be saved). From execution on, a stable code for the client to put words to: recipient_not_registered or execution_blocked, quote_drift, insufficient_funds, cancelled_before_execution, failed_before_execution, already_terminal or execution_refused; and once the batch has sent the payment, payment_failed, payment_reversed or payment_cancelled.

string | null
id
required
string format: uuid
issues
required

What stops this row from being paid, checked on every read of a draft against the destination field mapping; empty once the row is fine, and always empty after the draft is submitted

Array<object>
PaymentBatchRowIssue
object
code
required

Stable reason: missing_amount, missing_field, invalid_field, bank_not_found, contact_missing, contact_not_approved, destination_not_ready, no_fiat_destination, currency_mismatch, corridor_unsupported, recipient_required, duplicate_recipient

string
field
required

The recipient input field to fix (e.g. account_number), or amount; null when the issue is about the row as a whole

string | null
level
required

needs_fix blocks pricing and submit; a warning never does

string
Allowed values: needs_fix warning
message
required

Plain words for the customer

string
landing_currency
required
string | null
origin
required

How the row got here: uploaded from a file, address_book, manual (typed in)

string
Allowed values: uploaded address_book manual
payment_contact_id
required

Null while the row pays an inline recipient that is not a contact yet

string | null format: uuid
payment_id
required

The payment this row became at submit; pass to getPayment

string | null format: uuid
payment_state
required

The row’s payment as it stands, null before submit: awaiting_approval, on_hold (held: the batch waits and resumes it once it can be sent), submitted, processing, succeeded, failed, cancelled, reversed (refunded to the balance).

string | null
quote
required
One of:

The row’s accepted quote, priced at review

object
deducting
required

What the batch pays for this row, fees included

object
amount
required

Decimal string at the currency’s precision, e.g. “10.50”

string
<= 255 characters
currency
required

Three-letter currency code, e.g. “USD”

string
<= 16 characters
expired
required

True once this quote can no longer be executed; approving the batch would fail. Requote the batch to refresh every expired row.

boolean
expires_at
required
string | null format: date-time
fee_components
required

The row’s fee lines, as a single payment’s quote lists them: the partner (network) fee, the Elephants fee and any additive fee

Array<object>
object
amount
required
object
amount
required

Decimal string at the currency’s precision, e.g. “10.50”

string
<= 255 characters
currency
required

Three-letter currency code, e.g. “USD”

string
<= 16 characters
bands
required

The points-cap band split behind a merged booster component: each band’s own rate and the slice of the amount it billed. Null on every other component.

Array<object> | null
object
amount
required
string
band
required
string
Allowed values: within_allowance overage
rate
required
string
code
required
string
Allowed values: partner_fee ele_fee additive_fee
label
required
string
rate
required
string | null
fx_rate
required

The provider’s rate, payout currency per unit of source currency, before fees (a single quote’s gross_rate)

string | null
id
required
string format: uuid
landing
required

What the recipient receives

object
amount
required

Decimal string at the currency’s precision, e.g. “10.50”

string
<= 255 characters
currency
required

Three-letter currency code, e.g. “USD”

string
<= 16 characters
total_fee
required

Every fee line summed; null when the partner fee is in another currency

object
amount
required

Decimal string at the currency’s precision, e.g. “10.50”

string
<= 255 characters
currency
required

Three-letter currency code, e.g. “USD”

string
<= 16 characters
recipient
required
One of:
PaymentBatchRowRecipient

The recipient a row pays while it is not a contact yet: the bank fields as given, before submit turns them into a contact and destination

object
aba_code
required
string | null
account_holder_name
required
string | null
account_number
required
string | null
account_type
required
string | null
Allowed values: individual business
address_line1
required
string | null
address_line2
required
string | null
bank_code
required
string | null
bank_name
required
string | null
bic_code
required
string | null
branch_code
required
string | null
branch_name
required
string | null
bsb_code
required
string | null
city
required
string | null
cnaps
required
string | null
country_alpha2
required
string | null
iban
required
string | null
ifsc_code
required
string | null
postal_code
required
string | null
recipient_email
required
string | null
sort_code
required
string | null
state
required
string | null
state_code
required
string | null
swift_code
required
string | null
reference
required

What the recipient sees on their statement; the batch’s text when null

string | null
removed_at
required

Set when the row was taken out of the draft; such rows are never paid

string | null format: date-time
result
required

Written once at execution; null until then. sent means the payment was handed to execution: its own status says whether it is submitted, on hold or done. failed carries the refusal in error; cancelled if withdrawn before its turn.

string | null
Allowed values: sent failed cancelled
row_number
required
integer
upload
required
One of:
PaymentBatchRowUpload

The row as the uploaded file had it: one value per template column, as text

object
account_holder_name
required
string | null
account_number
required
string | null
account_type
required
string | null
address_line1
required
string | null
address_line2
required
string | null
amount
required
string | null
bank_code
required
string | null
bank_country
required
string | null
bank_name
required
string | null
beneficiary_id
required
string | null
branch_code
required
string | null
bsb_code
required
string | null
city
required
string | null
currency
required
string | null
iban
required
string | null
ifsc_code
required
string | null
line_number
required
integer
postal_code
required
string | null
recipient_email
required
string | null
reference
required
string | null
routing_number
required
string | null
sort_code
required
string | null
state
required
string | null
swift_code
required
string | null
sent_count
required
integer
source_balance
required

The source balance as it stands, for a viewer who may see balances; null otherwise

object
amount
required

Decimal string at the currency’s precision, e.g. “10.50”

string
<= 255 characters
currency
required

Three-letter currency code, e.g. “USD”

string
<= 16 characters
source_currency
required

The balance the batch is paid from; null until one is chosen

string | null
source_file
required
One of:
object
download_url
required

Signed URL to GET the file as an attachment, no bearer needed; valid until download_url_expires_at, after which reading the batch again mints a fresh one

string
download_url_expires_at
required
string format: date-time
filename
required
string
id
required
string format: uuid
uploaded_at
required
string format: date-time
statement_description
required

Bank statement text shared by every row

string
status
required

draft while rows are edited and priced; awaiting_approval once submitted; executing after approval while rows are sent; completed when every row has a result; cancelled if cancelled or rejected before execution.

string
Allowed values: draft awaiting_approval executing completed cancelled
submitted_at
required
string | null format: date-time
total_deducting
required

Sum of every ready row’s cost; null until reviewed

object
amount
required

Decimal string at the currency’s precision, e.g. “10.50”

string
<= 255 characters
currency
required

Three-letter currency code, e.g. “USD”

string
<= 16 characters
total_fee
required

Every ready row’s fees summed; null until reviewed, or when a row’s fee is in another currency

object
amount
required

Decimal string at the currency’s precision, e.g. “10.50”

string
<= 255 characters
currency
required

Three-letter currency code, e.g. “USD”

string
<= 16 characters
warning_count
required

Live rows with a warning

integer

Example

{
"amount_side": "landing",
"fee_components": [
{
"bands": [
{
"band": "within_allowance"
}
],
"code": "partner_fee"
}
],
"rows": [
{
"amount_side": "landing",
"changes": [
{
"field": "beneficiary_id"
}
],
"destination": {
"account_type": "individual",
"rail": "fiat",
"status": "draft"
},
"disposition": "ready",
"issues": [
{
"level": "needs_fix"
}
],
"origin": "uploaded",
"quote": {
"fee_components": [
{
"bands": [
{
"band": "within_allowance"
}
],
"code": "partner_fee"
}
]
},
"recipient": {
"account_type": "individual"
},
"result": "sent"
}
],
"status": "draft"
}

Invalid request parameters or body

Media typeapplication/json
Error

Error response. error.type is the machine-readable code — branch on it, never on error.message or the HTTP status. error.message is display-grade prose safe to render to a user; when a failure has no specific copy it falls back to a generic sentence, so it never carries a machine code. Unrecognised failures collapse to the generic unprocessable_entity code, so treat type as an open enum: match the codes you handle and fall through to a default branch for the rest.

object
error
required
object
details

Structured error details (e.g. validation errors), when present

message
required

Display-grade message, safe to render verbatim. Never a machine code — do not branch on it.

string
request_id

Correlation ID for this request (also in the x-request-id response header). Include it when contacting support.

string
step_up
Any of:
StepUpChallenge
object
delivery
required

Method used to deliver this challenge

string
expires_at
required

Challenge expiry

string | null format: date-time
id
required

Sudo session ID returned to completeStepUp

string
match_code
required

3-digit number-matching code. This response is the ORIGINATING surface: display the code; a user approving from the Ele mobile app is asked to enter it. Null only for challenges minted before match codes existed.

string | null
methods
required

Available verification methods

Array<string>
step_up_authentication_id
required

The step-up authentication this challenge was minted from — a DIFFERENT id from id (the sudo session). completeStepUp takes id as sudo_session_id; requestStepUpFallback takes this one.

string format: uuid
webauthn
required
Any of:
PasskeyAuthenticationOptions
object
allow_credentials
required
Array<object>
object
id
required
string
transports
required
Array<string>
type
required
string
challenge
required
string
challenge_id
required
string format: uuid
rp_id
required
string
timeout
required
integer
user_verification
required
string
type
required

Machine-readable error code from a stable vocabulary (open enum — handle unknown values)

string

Example generated

{
"error": {
"details": "example",
"message": "example",
"request_id": "example",
"step_up": {
"delivery": "example",
"expires_at": "2026-04-15T12:00:00Z",
"id": "example",
"match_code": "example",
"methods": [
"example"
],
"step_up_authentication_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"webauthn": {
"allow_credentials": [
{
"id": "example",
"transports": [
"example"
],
"type": "example"
}
],
"challenge": "example",
"challenge_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"rp_id": "example",
"timeout": 1,
"user_verification": "example"
}
},
"type": "example"
}
}

Missing, invalid, or expired bearer token

Media typeapplication/json
Error

Error response. error.type is the machine-readable code — branch on it, never on error.message or the HTTP status. error.message is display-grade prose safe to render to a user; when a failure has no specific copy it falls back to a generic sentence, so it never carries a machine code. Unrecognised failures collapse to the generic unprocessable_entity code, so treat type as an open enum: match the codes you handle and fall through to a default branch for the rest.

object
error
required
object
details

Structured error details (e.g. validation errors), when present

message
required

Display-grade message, safe to render verbatim. Never a machine code — do not branch on it.

string
request_id

Correlation ID for this request (also in the x-request-id response header). Include it when contacting support.

string
step_up
Any of:
StepUpChallenge
object
delivery
required

Method used to deliver this challenge

string
expires_at
required

Challenge expiry

string | null format: date-time
id
required

Sudo session ID returned to completeStepUp

string
match_code
required

3-digit number-matching code. This response is the ORIGINATING surface: display the code; a user approving from the Ele mobile app is asked to enter it. Null only for challenges minted before match codes existed.

string | null
methods
required

Available verification methods

Array<string>
step_up_authentication_id
required

The step-up authentication this challenge was minted from — a DIFFERENT id from id (the sudo session). completeStepUp takes id as sudo_session_id; requestStepUpFallback takes this one.

string format: uuid
webauthn
required
Any of:
PasskeyAuthenticationOptions
object
allow_credentials
required
Array<object>
object
id
required
string
transports
required
Array<string>
type
required
string
challenge
required
string
challenge_id
required
string format: uuid
rp_id
required
string
timeout
required
integer
user_verification
required
string
type
required

Machine-readable error code from a stable vocabulary (open enum — handle unknown values)

string

Example generated

{
"error": {
"details": "example",
"message": "example",
"request_id": "example",
"step_up": {
"delivery": "example",
"expires_at": "2026-04-15T12:00:00Z",
"id": "example",
"match_code": "example",
"methods": [
"example"
],
"step_up_authentication_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"webauthn": {
"allow_credentials": [
{
"id": "example",
"transports": [
"example"
],
"type": "example"
}
],
"challenge": "example",
"challenge_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"rp_id": "example",
"timeout": 1,
"user_verification": "example"
}
},
"type": "example"
}
}

Error response. error.type is the machine-readable code — branch on it, never on error.message or the HTTP status. error.message is display-grade prose safe to render to a user; when a failure has no specific copy it falls back to a generic sentence, so it never carries a machine code. Unrecognised failures collapse to the generic unprocessable_entity code, so treat type as an open enum: match the codes you handle and fall through to a default branch for the rest.

Media typeapplication/json
Error

Error response. error.type is the machine-readable code — branch on it, never on error.message or the HTTP status. error.message is display-grade prose safe to render to a user; when a failure has no specific copy it falls back to a generic sentence, so it never carries a machine code. Unrecognised failures collapse to the generic unprocessable_entity code, so treat type as an open enum: match the codes you handle and fall through to a default branch for the rest.

object
error
required
object
details

Structured error details (e.g. validation errors), when present

message
required

Display-grade message, safe to render verbatim. Never a machine code — do not branch on it.

string
request_id

Correlation ID for this request (also in the x-request-id response header). Include it when contacting support.

string
step_up
Any of:
StepUpChallenge
object
delivery
required

Method used to deliver this challenge

string
expires_at
required

Challenge expiry

string | null format: date-time
id
required

Sudo session ID returned to completeStepUp

string
match_code
required

3-digit number-matching code. This response is the ORIGINATING surface: display the code; a user approving from the Ele mobile app is asked to enter it. Null only for challenges minted before match codes existed.

string | null
methods
required

Available verification methods

Array<string>
step_up_authentication_id
required

The step-up authentication this challenge was minted from — a DIFFERENT id from id (the sudo session). completeStepUp takes id as sudo_session_id; requestStepUpFallback takes this one.

string format: uuid
webauthn
required
Any of:
PasskeyAuthenticationOptions
object
allow_credentials
required
Array<object>
object
id
required
string
transports
required
Array<string>
type
required
string
challenge
required
string
challenge_id
required
string format: uuid
rp_id
required
string
timeout
required
integer
user_verification
required
string
type
required

Machine-readable error code from a stable vocabulary (open enum — handle unknown values)

string

Example generated

{
"error": {
"details": "example",
"message": "example",
"request_id": "example",
"step_up": {
"delivery": "example",
"expires_at": "2026-04-15T12:00:00Z",
"id": "example",
"match_code": "example",
"methods": [
"example"
],
"step_up_authentication_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"webauthn": {
"allow_credentials": [
{
"id": "example",
"transports": [
"example"
],
"type": "example"
}
],
"challenge": "example",
"challenge_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"rp_id": "example",
"timeout": 1,
"user_verification": "example"
}
},
"type": "example"
}
}

Error response. error.type is the machine-readable code — branch on it, never on error.message or the HTTP status. error.message is display-grade prose safe to render to a user; when a failure has no specific copy it falls back to a generic sentence, so it never carries a machine code. Unrecognised failures collapse to the generic unprocessable_entity code, so treat type as an open enum: match the codes you handle and fall through to a default branch for the rest.

Media typeapplication/json
Error

Error response. error.type is the machine-readable code — branch on it, never on error.message or the HTTP status. error.message is display-grade prose safe to render to a user; when a failure has no specific copy it falls back to a generic sentence, so it never carries a machine code. Unrecognised failures collapse to the generic unprocessable_entity code, so treat type as an open enum: match the codes you handle and fall through to a default branch for the rest.

object
error
required
object
details

Structured error details (e.g. validation errors), when present

message
required

Display-grade message, safe to render verbatim. Never a machine code — do not branch on it.

string
request_id

Correlation ID for this request (also in the x-request-id response header). Include it when contacting support.

string
step_up
Any of:
StepUpChallenge
object
delivery
required

Method used to deliver this challenge

string
expires_at
required

Challenge expiry

string | null format: date-time
id
required

Sudo session ID returned to completeStepUp

string
match_code
required

3-digit number-matching code. This response is the ORIGINATING surface: display the code; a user approving from the Ele mobile app is asked to enter it. Null only for challenges minted before match codes existed.

string | null
methods
required

Available verification methods

Array<string>
step_up_authentication_id
required

The step-up authentication this challenge was minted from — a DIFFERENT id from id (the sudo session). completeStepUp takes id as sudo_session_id; requestStepUpFallback takes this one.

string format: uuid
webauthn
required
Any of:
PasskeyAuthenticationOptions
object
allow_credentials
required
Array<object>
object
id
required
string
transports
required
Array<string>
type
required
string
challenge
required
string
challenge_id
required
string format: uuid
rp_id
required
string
timeout
required
integer
user_verification
required
string
type
required

Machine-readable error code from a stable vocabulary (open enum — handle unknown values)

string

Example generated

{
"error": {
"details": "example",
"message": "example",
"request_id": "example",
"step_up": {
"delivery": "example",
"expires_at": "2026-04-15T12:00:00Z",
"id": "example",
"match_code": "example",
"methods": [
"example"
],
"step_up_authentication_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"webauthn": {
"allow_credentials": [
{
"id": "example",
"transports": [
"example"
],
"type": "example"
}
],
"challenge": "example",
"challenge_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"rp_id": "example",
"timeout": 1,
"user_verification": "example"
}
},
"type": "example"
}
}

Error response. error.type is the machine-readable code — branch on it, never on error.message or the HTTP status. error.message is display-grade prose safe to render to a user; when a failure has no specific copy it falls back to a generic sentence, so it never carries a machine code. Unrecognised failures collapse to the generic unprocessable_entity code, so treat type as an open enum: match the codes you handle and fall through to a default branch for the rest.

Media typeapplication/json
Error

Error response. error.type is the machine-readable code — branch on it, never on error.message or the HTTP status. error.message is display-grade prose safe to render to a user; when a failure has no specific copy it falls back to a generic sentence, so it never carries a machine code. Unrecognised failures collapse to the generic unprocessable_entity code, so treat type as an open enum: match the codes you handle and fall through to a default branch for the rest.

object
error
required
object
details

Structured error details (e.g. validation errors), when present

message
required

Display-grade message, safe to render verbatim. Never a machine code — do not branch on it.

string
request_id

Correlation ID for this request (also in the x-request-id response header). Include it when contacting support.

string
step_up
Any of:
StepUpChallenge
object
delivery
required

Method used to deliver this challenge

string
expires_at
required

Challenge expiry

string | null format: date-time
id
required

Sudo session ID returned to completeStepUp

string
match_code
required

3-digit number-matching code. This response is the ORIGINATING surface: display the code; a user approving from the Ele mobile app is asked to enter it. Null only for challenges minted before match codes existed.

string | null
methods
required

Available verification methods

Array<string>
step_up_authentication_id
required

The step-up authentication this challenge was minted from — a DIFFERENT id from id (the sudo session). completeStepUp takes id as sudo_session_id; requestStepUpFallback takes this one.

string format: uuid
webauthn
required
Any of:
PasskeyAuthenticationOptions
object
allow_credentials
required
Array<object>
object
id
required
string
transports
required
Array<string>
type
required
string
challenge
required
string
challenge_id
required
string format: uuid
rp_id
required
string
timeout
required
integer
user_verification
required
string
type
required

Machine-readable error code from a stable vocabulary (open enum — handle unknown values)

string

Example generated

{
"error": {
"details": "example",
"message": "example",
"request_id": "example",
"step_up": {
"delivery": "example",
"expires_at": "2026-04-15T12:00:00Z",
"id": "example",
"match_code": "example",
"methods": [
"example"
],
"step_up_authentication_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"webauthn": {
"allow_credentials": [
{
"id": "example",
"transports": [
"example"
],
"type": "example"
}
],
"challenge": "example",
"challenge_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"rp_id": "example",
"timeout": 1,
"user_verification": "example"
}
},
"type": "example"
}
}

Too many requests

Media typeapplication/json
RateLimitedError
object
error
required
object
details

Structured error details (e.g. validation errors), when present

message
required

Display-grade message, safe to render verbatim. Never a machine code — do not branch on it.

string
request_id

Correlation ID for this request (also in the x-request-id response header). Include it when contacting support.

string
step_up
Any of:
StepUpChallenge
object
delivery
required

Method used to deliver this challenge

string
expires_at
required

Challenge expiry

string | null format: date-time
id
required

Sudo session ID returned to completeStepUp

string
match_code
required

3-digit number-matching code. This response is the ORIGINATING surface: display the code; a user approving from the Ele mobile app is asked to enter it. Null only for challenges minted before match codes existed.

string | null
methods
required

Available verification methods

Array<string>
step_up_authentication_id
required

The step-up authentication this challenge was minted from — a DIFFERENT id from id (the sudo session). completeStepUp takes id as sudo_session_id; requestStepUpFallback takes this one.

string format: uuid
webauthn
required
Any of:
PasskeyAuthenticationOptions
object
allow_credentials
required
Array<object>
object
id
required
string
transports
required
Array<string>
type
required
string
challenge
required
string
challenge_id
required
string format: uuid
rp_id
required
string
timeout
required
integer
user_verification
required
string
type
required

Machine-readable error code from a stable vocabulary (open enum — handle unknown values)

string
error
required
object
type
required
string
Allowed value: rate_limited

Example

{
"error": {
"type": "rate_limited"
}
}
Retry-After
required
string

How long to wait before retrying, expressed as delay seconds or an HTTP date

Unexpected server error

Media typeapplication/json
Error

Error response. error.type is the machine-readable code — branch on it, never on error.message or the HTTP status. error.message is display-grade prose safe to render to a user; when a failure has no specific copy it falls back to a generic sentence, so it never carries a machine code. Unrecognised failures collapse to the generic unprocessable_entity code, so treat type as an open enum: match the codes you handle and fall through to a default branch for the rest.

object
error
required
object
details

Structured error details (e.g. validation errors), when present

message
required

Display-grade message, safe to render verbatim. Never a machine code — do not branch on it.

string
request_id

Correlation ID for this request (also in the x-request-id response header). Include it when contacting support.

string
step_up
Any of:
StepUpChallenge
object
delivery
required

Method used to deliver this challenge

string
expires_at
required

Challenge expiry

string | null format: date-time
id
required

Sudo session ID returned to completeStepUp

string
match_code
required

3-digit number-matching code. This response is the ORIGINATING surface: display the code; a user approving from the Ele mobile app is asked to enter it. Null only for challenges minted before match codes existed.

string | null
methods
required

Available verification methods

Array<string>
step_up_authentication_id
required

The step-up authentication this challenge was minted from — a DIFFERENT id from id (the sudo session). completeStepUp takes id as sudo_session_id; requestStepUpFallback takes this one.

string format: uuid
webauthn
required
Any of:
PasskeyAuthenticationOptions
object
allow_credentials
required
Array<object>
object
id
required
string
transports
required
Array<string>
type
required
string
challenge
required
string
challenge_id
required
string format: uuid
rp_id
required
string
timeout
required
integer
user_verification
required
string
type
required

Machine-readable error code from a stable vocabulary (open enum — handle unknown values)

string

Example generated

{
"error": {
"details": "example",
"message": "example",
"request_id": "example",
"step_up": {
"delivery": "example",
"expires_at": "2026-04-15T12:00:00Z",
"id": "example",
"match_code": "example",
"methods": [
"example"
],
"step_up_authentication_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"webauthn": {
"allow_credentials": [
{
"id": "example",
"transports": [
"example"
],
"type": "example"
}
],
"challenge": "example",
"challenge_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"rp_id": "example",
"timeout": 1,
"user_verification": "example"
}
},
"type": "example"
}
}