GET /verify/bank/jobs/:jobId
Poll the status and result of an async verification job. Use this as a fallback if you miss the webhook callback, or to reconcile results.
Endpoint
GET /verify/bank/jobs/:jobIdFull URL: https://api.easyslip.com/v2/verify/bank/jobs/{jobId}
Authentication
Required. See Authentication Guide.
Authorization: Bearer YOUR_API_KEYOwner-only
A job can only be read by the branch that created it. Requesting a job that belongs to another branch returns 404 JOB_NOT_FOUND (indistinguishable from a job that doesn't exist).
Path Parameters
| Parameter | Type | Description |
|---|---|---|
jobId | string | The jobId returned from /async or /batch |
Job Status
| Status | Meaning |
|---|---|
queued | Accepted, waiting to be processed |
processing | Being verified right now |
retrying | Waiting for another verification attempt, rate-limit capacity, or billing recovery |
done | Verification finished: result.status is success or not_found; callback delivery may still be pending |
failed | Verification could not complete because of an error/policy restriction; see error and the failed callback |
Type Definitions
interface JobRecord {
jobId: string;
batchId?: string; // present if the job was part of a batch
status: 'queued' | 'processing' | 'retrying' | 'done' | 'failed';
result?:
| { status: 'success'; data: VerifyBankData }
| { status: 'not_found'; data: unknown };
error?: {
code?: string;
message?: string;
webhook?: 'failed';
status?: number; // callback HTTP status
url?: string;
at?: string;
};
attempts: number; // retained metadata; not a reliable verification retry count
createdAt: string; // ISO 8601
updatedAt: string; // ISO 8601
}
interface JobResponse {
success: true;
data: JobRecord;
}result wraps { status, data }. On success, result.data matches the synchronous POST /verify/bank success data. Exhausted verification retries finish as done with result.status: "not_found", not failed.
A failure callback keeps the polled job failed even when delivery succeeds. If delivery also fails, error.code/message remain intact and error.webhook plus delivery details are added. A completed success/not-found job can also have a delivery-only error.
Example
curl https://api.easyslip.com/v2/verify/bank/jobs/3f2b1c8a-9d4e-4f10-b7a2-6c5d4e3f2a1b \
-H "Authorization: Bearer YOUR_API_KEY"Response
Still processing (200)
{
"success": true,
"data": {
"jobId": "3f2b1c8a-9d4e-4f10-b7a2-6c5d4e3f2a1b",
"status": "retrying",
"attempts": 0,
"createdAt": "2024-01-15T14:30:00+07:00",
"updatedAt": "2024-01-15T14:31:10+07:00"
}
}Done (200)
{
"success": true,
"data": {
"jobId": "3f2b1c8a-9d4e-4f10-b7a2-6c5d4e3f2a1b",
"status": "done",
"result": {
"status": "success",
"data": {
"remark": "Order #1001",
"isDuplicate": false,
"amountInSlip": 1500,
"isAmountMatched": true,
"rawSlip": {
"payload": "00000000000000000000000000000000000000",
"transRef": "68370160657749I376388B35",
"date": "2024-01-15T14:30:00+07:00",
"countryCode": "TH",
"amount": {
"amount": 1500,
"local": {
"amount": 1500,
"currency": "THB"
}
},
"fee": 0,
"ref1": "",
"ref2": "",
"ref3": "",
"sender": {
"bank": {
"id": "004",
"name": "กสิกรไทย",
"short": "KBANK"
},
"account": {
"name": {
"th": "นาย ผู้โอน ทดสอบ",
"en": "MR. SENDER TEST"
},
"bank": {
"type": "BANKAC",
"account": "123-4-xxxxx-5"
}
}
},
"receiver": {
"bank": {
"id": "014",
"name": "ไทยพาณิชย์",
"short": "SCB"
},
"account": {
"name": {
"th": "บริษัท ตัวอย่าง จำกัด"
},
"bank": {
"type": "BANKAC",
"account": "xxx-x-x5678-x"
}
},
"merchantId": null
}
}
}
},
"attempts": 0,
"createdAt": "2024-01-15T14:30:00+07:00",
"updatedAt": "2024-01-15T14:32:05+07:00"
}
}Failed (200)
{
"success": true,
"data": {
"jobId": "3f2b1c8a-9d4e-4f10-b7a2-6c5d4e3f2a1b",
"status": "failed",
"error": {
"code": "API_SERVER_ERROR",
"message": "External API service is temporarily unavailable"
},
"attempts": 0,
"createdAt": "2024-01-15T14:30:00+07:00",
"updatedAt": "2024-01-15T14:35:00+07:00"
}
}Error Responses
Job Not Found (404)
Returned for an unknown or expired job, or a job that belongs to another branch.
{
"success": false,
"error": {
"code": "JOB_NOT_FOUND",
"message": "Job 3f2b1c8a-9d4e-4f10-b7a2-6c5d4e3f2a1b not found"
}
}Notes
- Jobs expire 7 days after the latest job-record write; each status/delivery update refreshes the TTL. Expired jobs return
404. attemptscurrently remains0in the worker path even after retries; do not use it to count bank calls or decide whether retries are exhausted. Readstatus,result, anderrorinstead.processingis a defined status but is not currently written by the worker; do not require every intermediate state to appear.- Non-batch polling omits
batchId; the webhook usesbatchId: null. Polling may also include numericbranchIdandserviceIdownership metadata. - Prefer the webhook for results; use polling only as a fallback or to reconcile.
- The HTTP response here is always
200while the job exists — the job's own outcome is in thestatus/result/errorfields, not the HTTP status.