Skip to main content

Create a Pull Account

Adds the holder's own account at another US bank, from which ACH pulls fund the account's USD bank account. The holder accepts the ACH debit authorization in the same request.

The routing number's check digit is verified here. Nothing is sent to the bank until the first pull.

New in v3: v2 has no equivalent.

A workspace-scoped key names the account with account_id; an account-scoped key acts for its own account.

Authorization:

Every request is signed with your API key: a short-lived JWT, signed with your private key, sent in one header on /v3/* and /api/v2/* alike.

Headers:
Authorization: APIKey {SIGNED_JWT}

How to build and sign the JWT: Authentication.

Endpoint

POST

/v3/banking/pull-accounts

Headers​

HeaderDescription
Idempotency-KeyRequired, from every caller, API keys included: there is no grace period. One UUID per account to add, sent again unchanged on every retry. A retry answers the first response instead of adding the account twice. See API v3 overview.

Query parameters​

ParameterTypeDescription
account_idstring (cst_…)The account the pull account belongs to. Required for a workspace-scoped key; an account-scoped key adds to its own account and may omit it.

Request Body Sample​

{
"name": "Chase checking",
"bank_name": "JPMorgan Chase",
"holder_name": "Samantha Montenegro",
"holder_type": "individual",
"routing_number": "021000021",
"account_number": "000123456789",
"account_type": "checking",
"authorization": {
"accepted": true,
"version": "2026-10-20.v2"
}
}

Request Body Schema​

FieldTypeDescription
namestringOptional. The holder's own label for it, up to 100 characters.
bank_namestringOptional. The bank's name, up to 100 characters.
holder_namestringRequired. The name on the account at its bank, up to 100 characters.
holder_typestringRequired. individual or business. A person's account is debited under the NACHA class WEB, a business's under CCD.
routing_numberstringRequired. The nine-digit ABA routing number.
account_numberstringRequired. 4 to 17 digits.
account_typestringRequired. checking or savings.
authorization.acceptedbooleanRequired. true: the holder accepted the ACH debit authorization.
authorization.versionstringRequired. The version of the text the holder was shown.

Response Sample​

201 Created

{
"id": "bpa_01k8x4p6sx9t5v7x1z3b5d7f9h",
"account_id": "cst_01h455vb4pex5vsknk084sn02q",
"name": "Chase checking",
"bank_name": "JPMorgan Chase",
"holder_name": "Samantha Montenegro",
"holder_type": "individual",
"routing_number": "021000021",
"account_number_last4": "6789",
"account_type": "checking",
"currency": "USD",
"status": "active",
"authorization": {
"version": "2026-10-20.v2",
"accepted_at": "2026-10-19T15:00:00Z"
},
"created_at": "2026-10-19T15:00:00Z",
"updated_at": "2026-10-19T15:00:00Z"
}

Response Schema​

FieldTypeDescription
idstring (bpa_…)The pull account.
account_idstring (cst_…)The account it belongs to.
name, bank_namestringAs sent; absent when empty.
holder_name, holder_type, routing_number, account_typestringAs sent.
account_number_last4stringThe last four digits. The full number is never returned.
currencystringUSD.
statusstringactive, or disabled after a return or a notification of change (see How ACH Pulls Work).
status_reasonstringWhy it was disabled. Absent while active.
return_codestringThe NACHA code that disabled it. Absent while active.
authorization.version, authorization.accepted_atstringThe authorization it was last given.
created_at / updated_atstring (date-time)RFC 3339, UTC.

Errors​

StatusmessageWhen
400account_id_requiredA workspace-scoped key named no account_id.
400failed to parse requestThe body is not valid JSON, holder_type or account_type is not one of the listed values, or account_id is not a cst_… id.
400invalid_routing_numberNot nine digits, or its check digit does not hold.
400invalid_account_numberNot 4 to 17 digits.
400invalid_holder_nameOnly spaces.
400idempotency_key_requiredNo Idempotency-Key header.
400idempotency_key_invalidThe Idempotency-Key is longer than 255 characters or not printable ASCII.
401unauthorizedMissing or invalid signature.
403forbiddenAn account-scoped key named another account in account_id.
403account_frozenThe account is frozen or blocked.
404feature_not_enabledACH pulls are not enabled for the account.
404customer_not_foundNo such account.
409ach_authorization_outdatedauthorization.version is not the current text. Fetch it again, show it, and send the new version.
409idempotency_in_progressThe same Idempotency-Key is still running. Retry after Retry-After seconds with the same key.
413body_too_largeThe body is over 1 MiB.
422ach_authorization_requiredauthorization.accepted is not true.
422Validation failedA required field is missing, or a text field is too long; details names it.
422idempotency_key_conflictThe same Idempotency-Key was used for a different request.
503idempotency_unavailableThe key store is unavailable. Nothing ran: retry later with the same key.

Support and Resources​

If you need assistance or have any questions, our support team is here to help. You can contact our support team at support@blockwyre.com.

Stay Updated​

Stay up-to-date with the latest news, updates, and features from BlockWyre by following us on social media:

We are excited to have you on board and look forward to seeing how you leverage BlockWyre's powerful tools to enhance your financial operations. Happy integrating!