Skip to main content

Request an ACH Pull

Debits a pull account into the account's USD bank account. The amount shows at once as pending on the balance. For five minutes, until grace_ends_at, the pull can be cancelled; then it is submitted to the bank. See How ACH Pulls Work for what follows.

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/ach-pulls

Headers​

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

Query parameters​

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

Request Body Sample​

{
"pull_account_id": "bpa_01k8x4p6sx9t5v7x1z3b5d7f9h",
"amount": "250.00",
"reference": "top-up-2026-10-19",
"description": "Top up"
}

Request Body Schema​

FieldTypeDescription
pull_account_idstring (bpa_…)Required. The pull account to debit.
amountstring (decimal)Required. US dollars, greater than zero, in whole cents ("250.00"), as a decimal string, never a number.
referencestringOptional. Your own reference, up to 255 characters.
descriptionstringOptional. Up to 255 characters. Its first ten characters are the line the holder sees on their bank statement; FUNDING when empty.

Response Sample​

201 Created

{
"id": "ach_01k8x5c4ze2a6b8d0f2h4j6k8m",
"account_id": "cst_01h455vb4pex5vsknk084sn02q",
"pull_account_id": "bpa_01k8x4p6sx9t5v7x1z3b5d7f9h",
"bank_account_id": "bnk_01k8x4m2qv7r3t5w9y1a3c5e7g",
"amount": { "amount": "250.00", "currency": "USD" },
"fee": { "amount": "0.00", "currency": "USD" },
"total": { "amount": "250.00", "currency": "USD" },
"status": "pending",
"status_reason": "Pull requested, waiting for the grace period",
"sec_code": "WEB",
"reference": "top-up-2026-10-19",
"description": "Top up",
"grace_ends_at": "2026-10-19T15:05:00Z",
"created_at": "2026-10-19T15:00:00Z",
"updated_at": "2026-10-19T15:00:00Z"
}

Response Schema​

FieldTypeDescription
idstring (ach_…)The pull.
account_idstring (cst_…)The account it funds.
pull_account_idstring (bpa_…)The pull account debited.
bank_account_idstring (bnk_…)The USD bank account credited: the account's default.
amountmoneyWhat is debited from the pull account.
feemoneyWhat the platform keeps. No fee is charged today.
totalmoneyWhat the bank account is credited. Once the pull completes, all of it but reserved is available.
reservedmoneyThe share of total set aside in the account's reserve when the pull completed: held, not spendable. Absent until then, and when nothing was set aside. See The reserve.
availablemoneyWhat of total became spendable when the pull completed: total less reserved. Absent until then.
sourceobjectThe account debited, as it stood when the pull was requested — kept if that pull account is later edited or deleted: name, bank_name, holder_name, holder_type, routing_number, account_number_last4, account_type. Never the full account number.
statusstringpending, processing, posted, completed, cancelled, failed or returned. See How ACH Pulls Work.
status_reasonstringWhy the pull is where it is, in words.
return_codestringThe NACHA return reason (R01, R10, …) once returned.
sec_codestringThe NACHA class the debit travels under: WEB for a person's account, CCD for a business's.
reference, descriptionstringAs sent; absent when empty.
heldbooleantrue while the bank reviews the debit before sending it. Absent otherwise.
grace_ends_atstring (date-time)Until when the pull can be cancelled.
posted_atstring (date-time)When the debit settled. Absent until posted.
available_atstring (date-time)When the money becomes available: posted_at, as no hold applies. Absent until posted.
completed_atstring (date-time)When the money became available. Absent until completed.
created_at / updated_atstring (date-time)RFC 3339, UTC.

A money value is { "amount": "<decimal string>", "currency": "USD" }.

Errors​

StatusmessageWhen
400account_id_requiredA workspace-scoped key named no account_id.
400failed to parse requestThe body is not valid JSON, amount is not a decimal, or an id has the wrong form.
400invalid_amountamount is missing, not greater than zero, or has fractions of a cent.
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.
404pull_account_not_foundNo such pull account, or it belongs to another account.
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.
422pull_account_disabledA return or a notification of change stopped the pull account. See Update a Pull Account.
422ach_pull_amount_above_limitamount is above the per-pull limit (Get ACH Pull Limits).
422ach_pull_customer_limit_exceededWith this pull, the account's open pulls would exceed their limit.
422deposit_account_not_foundThe account has no active USD bank account to credit.
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!