Skip to content

POST /verify/bank

Verify Thai bank transfer slips using QR payload, image upload, Base64, or URL.

Endpoint

http
POST /verify/bank

Full URL: https://api.easyslip.com/v2/verify/bank

Authentication

Required. See Authentication Guide.

http
Authorization: Bearer YOUR_API_KEY

Request

Input Methods

MethodFieldContent-TypeDescription
Payloadpayloadapplication/jsonQR code string data
Imageimagemultipart/form-dataImage file upload
Base64base64application/jsonBase64 encoded image
URLurlapplication/jsonURL to slip image

One Input Required

You must provide exactly one of: payload, image, base64, or url.

Optional Parameters

ParameterTypeDescription
remarkstringCustom remark for tracking (1-255 chars)
matchAccountbooleanMatch receiver with registered accounts
matchAmountnumberExpected amount to validate
checkDuplicatebooleanCheck if slip was already verified (default: false)

Type Definitions

typescript
// Request Types
interface VerifyBankRequest {
  // One of the following is required
  payload?: string;      // QR payload (1-128 chars)
  image?: File;          // Image file (multipart/form-data)
  base64?: string;       // Base64 encoded image
  url?: string;          // URL to image (1-255 chars)

  // Optional parameters
  remark?: string;       // 1-255 chars
  matchAccount?: boolean;
  matchAmount?: number;
  checkDuplicate?: boolean;
}

// Response Types
interface VerifyBankResponse {
  success: true;
  data: VerifyBankData;
  message: string;
}

interface VerifyBankData {
  remark?: string;
  isDuplicate: boolean;
  matchedAccount: MatchedAccount | null;
  amountInOrder?: number;
  amountInSlip: number;
  isAmountMatched?: boolean;
  rawSlip: RawSlip;
}

interface MatchedAccount {
  bank: {
    nameTh: string;
    nameEn: string;
    code: string;
    shortCode: string;
  };
  nameTh: string;
  nameEn: string;
  type: 'PERSONAL' | 'JURISTIC';
  bankNumber: string;
}

interface RawSlip {
  payload: string;
  transRef: string;
  date: string;              // ISO 8601
  countryCode: string;
  amount: Amount;
  fee: number;
  ref1: string;
  ref2: string;
  ref3: string;
  sender: Party;
  receiver: Party & { merchantId?: string | null };
}

interface Amount {
  amount: number;
  local: {
    amount: number;
    currency: string;
  };
}

interface Party {
  bank: {
    id: string;
    name: string;
    short: string;
  };
  account: {
    name: {
      th?: string;
      en?: string;
    };
    bank?: {
      type: 'BANKAC' | 'TOKEN' | 'DUMMY';
      account: string;
    };
    proxy?: {
      type: 'NATID' | 'MSISDN' | 'EWALLETID' | 'EMAIL' | 'BILLERID';
      account: string;
    };
  };
}

// Error Response
interface ErrorResponse {
  success: false;
  error: {
    code: string;
    message: string;
  };
}

Examples

bash
curl -X POST https://api.easyslip.com/v2/verify/bank \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"payload": "00000000000000000000000000000000000000"}'
bash
curl -X POST https://api.easyslip.com/v2/verify/bank \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "image=@/path/to/slip.jpg"
bash
curl -X POST https://api.easyslip.com/v2/verify/bank \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"base64": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAA..."}'
bash
curl -X POST https://api.easyslip.com/v2/verify/bank \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com/slip.jpg"}'

Response

Success Response (200)

json
{
  "success": true,
  "data": {
    "remark": "Order #12345",
    "isDuplicate": false,
    "matchedAccount": {
      "bank": {
        "nameTh": "กสิกรไทย",
        "nameEn": "KASIKORNBANK",
        "code": "004",
        "shortCode": "KBANK"
      },
      "nameTh": "บริษัท ตัวอย่าง จำกัด",
      "nameEn": "EXAMPLE CO., LTD.",
      "type": "JURISTIC",
      "bankNumber": "123-4-56789-0"
    },
    "amountInOrder": 1500.00,
    "amountInSlip": 1500.00,
    "isAmountMatched": true,
    "rawSlip": {
      "payload": "00000000000000000000000000000000000000",
      "transRef": "68370160657749I376388B35",
      "date": "2024-01-15T14:30:00+07:00",
      "countryCode": "TH",
      "amount": {
        "amount": 1500.00,
        "local": {
          "amount": 1500.00,
          "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"
          },
          "proxy": {
            "type": "MSISDN",
            "account": "08xxxxxxxx89"
          }
        },
        "merchantId": null
      }
    }
  },
  "message": "Bank slip verified successfully"
}

Error Responses

Validation Error (400)

json
{
  "success": false,
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "At least one of payload, image, url, or base64 is required"
  }
}

Slip Not Found (404)

json
{
  "success": false,
  "error": {
    "code": "SLIP_NOT_FOUND",
    "message": "The slip could not be found or is invalid"
  }
}

Quota Exceeded (403)

json
{
  "success": false,
  "error": {
    "code": "QUOTA_EXCEEDED",
    "message": "Your API quota has been exceeded"
  }
}

Image Requirements

When using image upload, Base64, or URL:

RequirementValue
Maximum size4 MB
Supported formatsJPEG, PNG, GIF, WebP
QR codeMust be clearly visible
URL restrictionsHTTP/HTTPS only, no private IP ranges

Duplicate Handling

When checkDuplicate: true:

ScenarioResultQuota
Same branch, previously verifiedCached data, isDuplicate: trueNot consumed
Different branch, previously verifiedFresh data, isDuplicate: trueConsumed
New slipFresh data, isDuplicate: falseConsumed

Account Matching

When matchAccount: true:

  1. System checks receiver against your registered bank accounts
  2. Uses smart name matching (85% similarity threshold)
  3. Supports PromptPay, regular bank accounts, and merchant accounts
  4. Returns matchedAccount: null if no match found

Notes

  • Requests are counted against your monthly quota
  • Check /info endpoint for current usage
  • See individual method pages for detailed examples

Bank Slip Verification API for Thai Banking