Async Verify — Bank
Verify Thai bank transfer slips asynchronously. Instead of waiting for the result in the HTTP response, you enqueue one or more slips and receive each result via a webhook callback (with a polling fallback).
This runs alongside the synchronous POST /verify/bank — the sync endpoint is unchanged. Use async when you need to:
- Verify in bulk (submit up to 100 slips in one call).
- Handle high request rates without hitting rate limits — requests queue and drain instead of being rejected.
- Verify slips whose data is slow to arrive (e.g. Bangkok Bank), where the job retries in the background until the data is available.
Base URL
https://api.thunder.in.th/v2Authentication
Required. Uses the same branch API key as the synchronous verify endpoints. See Authentication Guide.
Authorization: Bearer YOUR_API_KEYEndpoints
| Endpoint | Method | Description |
|---|---|---|
/verify/bank/async | POST | Enqueue one slip → 202 with a jobId |
/verify/bank/batch | POST | Enqueue many slips (max 100) → 202 with a batchId + jobs |
/verify/bank/jobs/:jobId | GET | Poll a job's status/result (fallback if you miss the webhook) |
Each enqueued slip produces one webhook callback — including each slip inside a batch (one callback per slip, not one per batch).
How it works
- Enqueue a slip with
POST /verify/bank/async(or many with/batch). You get back ajobIdimmediately (202 Accepted) — the slip has not been verified yet. - The job is processed in the background. If the slip data isn't ready yet (e.g. Bangkok Bank pending), the job stays
retryingand is re-attempted over a few minutes. - When the job finishes, Thunder sends a webhook to your
callbackUrlwith the result — thedatafield is the same shape as the sync verify success response. - If you miss the webhook,
GET /verify/bank/jobs/:jobIdreturns the job record (retained ~7 days).
Providing a callback URL
Each request may include a callbackUrl. If omitted, your branch's configured default webhook URL is used.
| Rule | Behaviour |
|---|---|
callbackUrl provided | The result webhook is POSTed there (overrides the branch default) |
callbackUrl omitted | The branch's configured default webhook URL is used |
| Neither set | 400 VALIDATION_ERROR |
Not https | 400 INVALID_CALLBACK_URL |
| Resolves to a private/internal address | 400 INVALID_CALLBACK_URL |
HTTPS only
callbackUrl must be a public https:// URL. Non-HTTPS URLs and URLs that resolve to private/internal IP ranges are rejected for security.
The default webhook URL and the signing secret are configured in your branch's webhook settings. See the webhook callback page for signature verification.
Quota & duplicates
Async verification behaves the same as sync for billing:
- Quota — only a successful verification consumes quota. Failures and duplicates do not.
- Duplicates — a slip already verified (whether via sync or async) is recognized as a duplicate.
Error Codes
| Code | HTTP Status | Description |
|---|---|---|
VALIDATION_ERROR | 400 | Invalid body, an empty slip, a batch over 100 slips, or a missing callbackUrl with no branch default |
INVALID_CALLBACK_URL | 400 | callbackUrl is not https, or resolves to a private/internal address |
JOB_NOT_FOUND | 404 | Unknown/expired job, or a job not owned by your branch |
Standard authentication errors (MISSING_API_KEY, INVALID_API_KEY, SERVICE_EXPIRED, QUOTA_EXCEEDED, …) also apply. See Error Codes Reference.
