Skip to content

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/v2

Authentication

Required. Uses the same branch API key as the synchronous verify endpoints. See Authentication Guide.

http
Authorization: Bearer YOUR_API_KEY

Endpoints

EndpointMethodDescription
/verify/bank/asyncPOSTEnqueue one slip → 202 with a jobId
/verify/bank/batchPOSTEnqueue many slips (max 100) → 202 with a batchId + jobs
/verify/bank/jobs/:jobIdGETPoll 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

  1. Enqueue a slip with POST /verify/bank/async (or many with /batch). You get back a jobId immediately (202 Accepted) — the slip has not been verified yet.
  2. The job is processed in the background. If the slip data isn't ready yet (e.g. Bangkok Bank pending), the job stays retrying and is re-attempted over a few minutes.
  3. When the job finishes, Thunder sends a webhook to your callbackUrl with the result — the data field is the same shape as the sync verify success response.
  4. If you miss the webhook, GET /verify/bank/jobs/:jobId returns 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.

RuleBehaviour
callbackUrl providedThe result webhook is POSTed there (overrides the branch default)
callbackUrl omittedThe branch's configured default webhook URL is used
Neither set400 VALIDATION_ERROR
Not https400 INVALID_CALLBACK_URL
Resolves to a private/internal address400 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

CodeHTTP StatusDescription
VALIDATION_ERROR400Invalid body, an empty slip, a batch over 100 slips, or a missing callbackUrl with no branch default
INVALID_CALLBACK_URL400callbackUrl is not https, or resolves to a private/internal address
JOB_NOT_FOUND404Unknown/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.

Bank Slip Verification API for Thai Banking