Skip to main content

Transfers API Errors

The Transfers API uses standard HTTP status codes and structured error responses to indicate validation issues, permission failures, resource conflicts, upstream dependency failures, and internal errors.

Error response format

Error responses include:
  • an HTTP status code
  • a machine-readable code
  • a human-readable message
  • in some cases, additional context such as source.key for field-level validation failures

Example error response

{
  "code": "invalid_parameters",
  "message": "Malformed or invalid field values",
  "source": {
    "key": "source.payment_rail"
  }
}

HTTP status and error codes

400 Bad Request

Returned when the request is malformed, contains invalid parameters, or fails request preconditions.
CodeDescription
invalid_parametersOne or more request fields are invalid
invalid_jsonRequest body could not be parsed
not_foundA referenced resource does not exist
bad_requestGeneric bad request
frozenCustomer or developer account is frozen or paused
has_not_accepted_tosCustomer has not accepted Terms of Service
requires_active_kyc_statusCustomer KYC status is not active
deactivated_external_accountDestination external account has been deactivated
duplicate_recordIdempotency key was reused with different parameters
not_truly_idempotentSame idempotency key was used with a different request body
invalid_geographic_locationCustomer is in an unsupported state or region
missing_address_dataRequired address data is missing or incomplete
cards_endorsement_approval_requiredCards endorsement has not yet been approved

401 Unauthorized

Returned when the requested feature or rail is not enabled for the developer account.
CodeDescription
not_allowedRequested rail or feature is not enabled

403 Forbidden

Returned when the request is understood but not permitted.
CodeDescription
missing_required_endorsementsCustomer lacks a required endorsement
developer_limits_exceededDeveloper-level transaction limits have been exceeded
endorsement_requirements_not_metEndorsement criteria are not satisfied
forbiddenGeneral permission denied

404 Not Found

Returned when the transfer or related resource cannot be found.
CodeDescription
resource_not_foundRequested resource was not found

409 Conflict

Returned when the requested action is not allowed in the transfer’s current state.
CodeDescription
resource_state_conflictResource state does not allow the requested operation

422 Unprocessable Entity

Returned when the request is structurally valid but cannot be processed.
CodeDescription
unprocessable_entityRequest cannot be processed in its current form

424 Failed Dependency

Returned when an upstream dependency fails during processing.
CodeDescription
external_dependency_failedExternal service dependency failed

500 Internal Server Error

Returned when an unexpected internal error occurs.
CodeDescription
500Unexpected internal error

503 Service Unavailable

Returned when the service is temporarily unavailable.
CodeDescription
503Temporary service unavailability

Validation errors

Requests that fail with invalid_parameters may include a source.key value identifying the specific field that caused the failure.

Common fields

  • source.payment_rail
  • source.from_address
  • source.amount
  • source.external_account_id
  • source.bridge_wallet_id
  • source.batch_settlement_schedule_id
  • destination.currency
  • destination.external_account_id
  • destination.payment_rail
  • developer_fee
  • features.allow_any_from_address
  • amount

Common validation messages

FieldExample message
source.payment_railMust be ach
source.payment_railMust be wire or ach_push
source.payment_railACH pull/debit not supported
source.from_addressmust be set for this payment rail
source.from_addressNot a valid address
source.amountSource amount must be specified
source.amountmust be at least X for destination amount of Y
source.external_account_idNot a valid external account
source.bridge_wallet_idcannot be set for this payment rail
source.batch_settlement_schedule_idmust be set
destination.currencyInvalid currency pair for fixed output transfers: X -> Y
destination.external_account_idThe external account does not support swift transfers
destination.external_account_idmust be a European IBAN account with EUR currency for SEPA transfers
developer_feecannot be set on this type of transfer
features.allow_any_from_addressis not supported for prefunded payment rail
amountAmount has precision loss
amountNot a valid float string
Validation messages may vary depending on payment rail, transfer type, and configuration.

Idempotency errors

The Transfers API enforces idempotency for repeated requests using the same idempotency key.

Possible idempotency errors

CodeDescription
duplicate_recordIdempotency key was reused with different parameters
not_truly_idempotentSame idempotency key was submitted with a different request payload

Best practice

Reuse an idempotency key only for exact retries of the same request.
Do not reuse an idempotency key with modified parameters. If the request payload changes, generate a new idempotency key.

Error handling guidance

Use the following guidance when determining whether an error should be retried.
StatusCategoryRetry guidance
400Validation or request issueDo not retry until the request is corrected
401Feature or rail not enabledDo not retry without account configuration changes
403Permission, endorsement, or limits issueDo not retry unless eligibility or limits change
404Missing resourceDo not retry unless the referenced resource becomes available
409Invalid state transitionRetry only after the resource reaches a valid state
422Business logic failureDo not retry unless request data changes
424Upstream dependency failureRetry according to your retry policy
500Internal server errorRetry with backoff if appropriate
503Temporary service unavailabilityRetry with backoff
  1. Validate required fields before making the request.
  2. Use idempotency keys for create operations.
  3. Log both the HTTP status code and the error code.
  4. Inspect source.key for invalid_parameters responses.
  5. Retry only transient failures such as 424, 500, and 503.

Notes

  • Validation-related exceptions are returned as structured JSON.
  • Unhandled exceptions fall back to a 500 response with a generic message and reference code.
  • Some responses, such as missing_required_endorsements, may include context-specific messaging depending on the payment rail or configuration involved.

See also