ACH Pull Webhooks
New in v3: v2 has no equivalent.
Every step of an ACH pull is sent to the workspace's webhook endpoints that subscribe to the banking category. The envelope is the one every webhook uses (Webhooks). The details object is the pull in the v3 format: the same field names Get an ACH Pull returns, with TypeIDs for every id and money as an amount and its currency.
Event types
| Event type | When |
|---|---|
ach_pull_created | The pull was accepted. Its credit is pending while the grace period runs, and it can still be cancelled. |
ach_pull_status_updated | The pull moved to another status. details.status is the new one and details.previous_status the one it left. |
ach_pull_status_updated is sent for each of these statuses:
status | Meaning |
|---|---|
cancelled | Cancelled inside the grace period. Nothing is debited. |
processing | The bank took the debit. |
posted | The debit settled. The credit is still pending: the holder's bank can return it for days. |
completed | The hold ended. total became available, less reserved when the workspace holds a reserve. A return can still follow. |
failed | The bank refused the debit, or it was never made. The pending credit was dropped. |
returned | The holder's bank sent the debit back. return_code names the NACHA reason (R01, R10, …). The credit was dropped, or taken back out of the available balance if the pull had completed. |
Webhooks are delivered at least once and can arrive out of order. Use details.status and the pull's updated_at from Get an ACH Pull as the source of truth.
Sample
{
"webhookId": "00000000-0000-0000-0000-000000000000",
"type": "ach_pull_status_updated",
"accountId": "019f05a0-8529-7bec-86ed-9344ad654f43",
"timestamp": "2026-10-23T13:00:02Z",
"details": {
"id": "ach_01k8x4p6sx9t5v7x1z3b5d7f9h",
"account_id": "cst_01kfx5b1a9f8yv3ky2hd5anhbk",
"pull_account_id": "bpa_01k8x4p6sx9t5v7x1z3b5d7f9h",
"bank_account_id": "bnk_01k8x4m2qv7r3t5w9y1a3c5e7g",
"amount": { "amount": "100.00", "currency": "USD" },
"fee": { "amount": "1.50", "currency": "USD" },
"total": { "amount": "98.50", "currency": "USD" },
"reserved": { "amount": "9.85", "currency": "USD" },
"available": { "amount": "88.65", "currency": "USD" },
"source": {
"name": "Chase checking",
"bank_name": "JPMorgan Chase",
"holder_name": "Samantha Montenegro",
"holder_type": "individual",
"routing_number": "021000021",
"account_number_last4": "6789",
"account_type": "checking"
},
"status": "completed",
"previous_status": "posted",
"sec_code": "WEB",
"created_at": "2026-10-20T17:42:15Z"
},
"systemNotes": "Do not rely solely on this webhook for final state. Always verify the current status via the API to ensure consistency. Consult the developer documentation and guides for more information."
}
Details fields
| Field | Type | Description |
|---|---|---|
id | string (ach_…) | The pull. |
account_id | string (cst_…) | The account the pull belongs to. The envelope's accountId names the same account by its UUID, as in every webhook. |
pull_account_id | string (bpa_…) | The external account debited. |
bank_account_id | string (bnk_…) | The deposit account credited. |
amount | money | What is debited. |
fee | money | What the platform keeps. |
total | money | What the deposit account is credited. |
reserved | money | The share of total set aside in the account's reserve when the pull completed. Absent until then, and when the workspace holds no reserve. |
available | money | What of total became spendable when the pull completed. Absent until then. |
source | object | The account debited, as it stood when the pull was requested. Never its full number. Absent on pulls requested before it was kept. |
status | string | The pull's status after this step. |
previous_status | string | The status this step left. Absent on ach_pull_created. |
status_reason | string | Why the pull is in this status, when there is a reason. |
return_code | string | The NACHA return reason, once returned. |
sec_code | string | CCD or WEB. |
created_at | string (RFC 3339) | When the pull was requested. |
The webhook does not carry the pull's reference, description or the time of each step. Get an ACH Pull returns them.
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:
- Instagram: BlockWyre Instagram
- Twitter: BlockWyre Twitter
- Facebook: BlockWyre Facebook
- LinkedIn: BlockWyre LinkedIn
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!