Skip to main content

🧾 Thai Receipt OCR 🆕

🧾 ใบเสร็จรับเงิน / ใบแจ้งหนี้ / ใบวางบิล / ใบกำกับภาษี

Version Status New

Welcome to the Thai Receipt OCR API, an AI-powered solution developed by iApp Technology Co., Ltd. for extracting data from Thai receipts and invoices. This documentation will help you integrate and use our OCR service effectively.

Try Demo

Visit our API Portal to test the Thai Receipt OCR API with your own images.

Getting Started

  1. Prerequisites

    • An API key from iApp Technology
    • Thai / English receipt using printed or handwritten images
    • Supported file formats: JPEG, JPG, PNG, HEIC, HEIF, PDF
    • Maximum file size: 10MB
  2. Quick Start

    • Fast processing (5-10 seconds per document)
    • High accuracy text extraction
    • Support for multiple file formats
  3. Key Features

    • Detailed field extraction including:
      • Invoice details (type, ID, date, book number)
      • Issuer information (name, address, tax ID, contact)
      • Customer information (name, address, tax ID, contact)
      • Line item details (item code, name, quantity, unit price, total)
      • Financial summary (subtotal, discount, VAT, grand total)
    • Support for both single-page and multi-page documents (PDF)
    • Option to return original OCR text and processed images
    • Flexible JSON response format with detailed field extraction
  4. Security & Compliance

    • GDPR and PDPA compliant
    • Secure API endpoints
    • No data retention after processing

Our API is designed to handle various receipt formats and layouts commonly used in Thailand, from simple retail receipts to formal tax invoices. The post-processing AI model is trained to understand Thai receipt structures and can reliably extract information even from noisy or poorly scanned documents.

Example

Here's a sample receipt and its extracted data:

Receipt Example

Request:

cURL

curl -X POST "https://api.iapp.co.th/ocr/v3/receipt/file" \
-H "apikey: YOUR_API_KEY" \
-F "file=@/path/to/receipt.jpg" \
-F "return_image=false" \
-F "return_ocr=false"
How to get API Key?

Please visit iApp AI Portal to view your existing API key or request a new one.

Response:

{
"message": "success",
"processed": {
"invoiceType": "ใบเสร็จรับเงิน/ใบกำกับภาษีอย่างย่อ",
"invoiceBook": null,
"invoiceID": "4504RC112566/004044",
"invoiceDate": "27/11/2566",
"issuerName": "หจก.บุญรอดคอฟฟี (ตลาดรัตนบุรี)",
"issuerTaxID": "0323560000723",
"items": [
{
"itemNo": 1,
"itemName": "ชาเขียวนม ร้อน ขนาดใหญ่",
"itemUnit": 1,
"itemUnitCost": 60.0,
"itemTotalCost": 60.0
}
],
"totalCost": 60.0,
"discount": 0.0,
"totalCostAfterDiscount": 60.0,
"vat": 3.93,
"grandTotal": 60.0
},
"process_ms": 6821
}

Features & Capabilities

Core Features

  1. Document Processing

    • High accuracy text extraction and field recognition
    • Thai / English language supported.
    • Printed / Handwritten supported.
    • Fast processing time of 5-10 seconds per document
    • Multi-format support (JPEG, JPG, PNG, HEIC, HEIF, PDF)
    • Multi-page document handling
    • Option to return original OCR text and processed images
    • GDPR and PDPA compliant processing
  2. Data Extraction

    • Flexible JSON response format with detailed field extraction

Supported Fields

FieldTypeDescription
invoiceTypeStringTitle or type of invoice
invoiceBookStringBook number of invoice
invoiceIDStringID number of invoice
invoiceDateStringDate of invoice issuance
purchaseOrderIDStringID number of linked purchase order
issuerNameStringName of invoice issuer
issuerAddressStringAddress of invoice issuer
issuerTaxIDStringTax ID of invoice issuer
issuerPhoneStringContact phone of invoice issuer
customerNameStringName of customer
customerAddressStringAddress of customer
customerTaxIDStringTax ID of customer
customerPhoneStringContact phone of customer
itemsArrayArray of line items with details below
- itemNoStringItem sequence number
- itemCodeStringProduct/service code
- itemNameStringProduct/service name
- itemUnitNumberQuantity of item
- itemUnitCostNumberCost per unit
- itemTotalCostNumberTotal cost for this item
totalCostNumberSum of all item costs
discountNumberDiscount amount if applicable
totalCostAfterDiscountNumberTotal cost after applying discount
vatNumberValue Added Tax amount (7%)
grandTotalNumberFinal total amount including VAT

Note: All currency values are rounded to two decimal places.

API Reference

Welcome to the Thai Receipt OCR API, a powerful tool for converting Thai receipts and invoices into structured JSON data. This API leverages advanced OCR and AI technologies to extract key information such as invoice details, issuer and customer data, line items, and financial totals.

Recognizing Receipt

This endpoint processes a receipt image or PDF and returns the extracted data in a structured format.

POST https://api.iapp.co.th/ocr/v3/receipt/file

Request Headers

NameTypeRequiredDescription
apikeystringYesYour API key

Request Body (multipart/form-data)

ParameterTypeRequiredDescription
filefileYesReceipt image (JPEG, PNG) or PDF document
return_imagebooleanNoInclude base64 encoded image in response (default: false)
return_ocrbooleanNoInclude raw OCR text in response (default: false)

Supported File Types

  • Images: JPEG, PNG
  • Documents: PDF (single or multiple pages)

Response Format

{
"message": "success",
"raw": {
"image": "string", // Base64 encoded, only if return_image=true
"text": "string" // Only if return_ocr=true
},
"processed": {
"invoiceType": "string",
"invoiceBook": "string",
"invoiceID": "string",
"invoiceDate": "string",
"purchaseOrderID": "string",
"issuerName": "string",
"issuerAddress": "string",
"issuerTaxID": "string",
"issuerPhone": "string",
"customerName": "string",
"customerAddress": "string",
"customerTaxID": "string",
"customerPhone": "string",
"items": [
{
"itemNo": "string",
"itemCode": "string",
"itemName": "string",
"itemUnit": "number",
"itemUnitCost": "number",
"itemTotalCost": "number"
}
],
"totalCost": "number",
"discount": "number",
"totalCostAfterDiscount": "number",
"vat": "number",
"grandTotal": "number"
},
"template": "receipt",
"iapp": "string",
"process_ms": "number"
}

Error Handling

StatusCodeDescription
400BAD_REQUESTInvalid parameters or file format
401UNAUTHORIZEDInvalid or missing API key
404NOT_FOUNDInvalid endpoint
500INTERNAL_SERVER_ERRORProcessing failed

Code Examples

Python

import requests
apiKey = 'YOUR_API_KEY'
filePath = '/path/to/receipt.jpg'
url = "https://api.iapp.co.th/ocr/v3/receipt/file"

headers = {'apikey': apiKey}
files = {'file': ('receipt.jpg', open(filePath, 'rb'), 'image/jpeg')}
data = {'return_image': 'false', 'return_ocr': 'false'}

response = requests.post(url, headers=headers, files=files, data=data)
print(response.json())

Javascript

const axios = require("axios")
const FormData = require("form-data")
const fs = require("fs")

const apiKey = "YOUR_API_KEY"
const filePath = "/path/to/receipt.jpg"
const url = "https://api.iapp.co.th/ocr/v3/receipt/file"

const form = new FormData()
form.append("file", fs.createReadStream(filePath))
form.append("return_image", "false")
form.append("return_ocr", "false")

try {
const response = await axios.post(url, form, {
headers: {
...form.getHeaders(),
apikey: apiKey,
},
})
return response.data
} catch (error) {
throw error
}

PHP

$url = 'https://api.iapp.co.th/ocr/v3/receipt/file';
$apiKey = 'YOUR_API_KEY';
$filePath = '/path/to/receipt.jpg';

$headers = array(
'apikey: ' . $apiKey
);

$postFields = array(
'file' => new CURLFile($filePath),
'return_image' => 'false',
'return_ocr' => 'false'
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$response = curl_exec($ch);
curl_close($ch);

echo $response;

Swift

import Foundation

let url = URL(string: "https://api.iapp.co.th/ocr/v3/receipt/file")!
let filePath = "/path/to/receipt.jpg"
let apiKey = "YOUR_API_KEY"

var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue(apiKey, forHTTPHeaderField: "apikey")

let boundary = UUID().uuidString
request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")

var body = Data()
body.append("--\(boundary)\r\n".data(using: .utf8)!)
body.append("Content-Disposition: form-data; name=\"file\"; filename=\"receipt.jpg\"\r\n".data(using: .utf8)!)
body.append("Content-Type: image/jpeg\r\n\r\n".data(using: .utf8)!)
body.append(try! Data(contentsOf: URL(fileURLWithPath: filePath)))
body.append("\r\n--\(boundary)\r\n".data(using: .utf8)!)
body.append("Content-Disposition: form-data; name=\"return_image\"\r\n\r\nfalse\r\n".data(using: .utf8)!)
body.append("--\(boundary)\r\n".data(using: .utf8)!)
body.append("Content-Disposition: form-data; name=\"return_ocr\"\r\n\r\nfalse\r\n".data(using: .utf8)!)
body.append("--\(boundary)--\r\n".data(using: .utf8)!)

request.httpBody = body

let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data, error == nil else {
print("Error: \(error?.localizedDescription ?? "Unknown error")")
return
}
print(String(data: data, encoding: .utf8)!)
}

task.resume()

Kotlin

import okhttp3.*
import java.io.File

val client = OkHttpClient()
val apiKey = "YOUR_API_KEY"
val filePath = "/path/to/receipt.jpg"
val url = "https://api.iapp.co.th/ocr/v3/receipt/file"

val file = File(filePath)
val requestBody = MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("file", file.name, RequestBody.create(MediaType.parse("image/jpeg"), file))
.addFormDataPart("return_image", "false")
.addFormDataPart("return_ocr", "false")
.build()

val request = Request.Builder()
.url(url)
.post(requestBody)
.addHeader("apikey", apiKey)
.build()

client.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
e.printStackTrace()
}

override fun onResponse(call: Call, response: Response) {
response.use {
if (!response.isSuccessful) throw IOException("Unexpected code $response")
println(response.body()?.string())
}
}
})

Java

import okhttp3.*;
import java.io.File;
import java.io.IOException;

public class Main {
public static void main(String[] args) {
OkHttpClient client = new OkHttpClient();

String apiKey = "YOUR_API_KEY";
String url = "https://api.iapp.co.th/ocr/v3/receipt/file";
String filePath = "/path/to/receipt.jpg";

File file = new File(filePath);
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("file", file.getName(), RequestBody.create(MediaType.parse("image/jpeg"), file))
.addFormDataPart("return_image", "false")
.addFormDataPart("return_ocr", "false")
.build();

Request request = new Request.Builder()
.url(url)
.post(requestBody)
.addHeader("apikey", apiKey)
.build();

client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}

@Override
public void onResponse(Call call, Response response) throws IOException {
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
System.out.println(response.body().string());
}
});
}
}

Dart

import 'dart:convert';
import 'dart:io';
import 'package:http/http.dart' as http;

String url = 'https://api.iapp.co.th/ocr/v3/receipt/file';
String filePath = '/path/to/receipt.jpg';
String apiKey = 'YOUR_API_KEY';

void main() async {
var url = Uri.parse(url);
var request = http.MultipartRequest('POST', url)
..headers['apikey'] = apiKey
..files.add(await http.MultipartFile.fromPath('file', filePath))
..fields['return_image'] = 'false'
..fields['return_ocr'] = 'false';

var response = await request.send();

if (response.statusCode == 200) {
var responseData = await response.stream.bytesToString();
print(responseData);
} else {
print('Error: ${response.statusCode}');
}
}

Limitations & Best Practices

Limitations

  • Maximum file size: 10MB
  • Supported languages: Thai
  • PDF files: Up to 10 pages
  • Rate limit: 10 requests per second per API key

Best Practices

  1. Ensure good image quality for optimal results
  2. Use JPEG or PNG format for images
  3. Implement error handling for failed requests
  4. Cache responses when processing the same document multiple times
  5. Set appropriate timeouts for large files

Accuracy & Performance

Overall Accuracy

Based on our benchmark dataset of 10,000 Thai receipts:

Field TypeAccuracy (%)Notes
Invoice Numbers99.2%Including tax invoice numbers
Amounts99.5%Currency values and totals
Dates98.7%Various Thai date formats
Line Items97.8%Product details and prices
Overall98.8%Weighted average

Processing Speed

  • Average processing time: 5-10 seconds
  • 95th percentile: 12 seconds
  • Maximum processing time: 15 seconds

Factors Affecting Accuracy

  1. Image Quality

    • Resolution (minimum 300 DPI recommended)
    • Lighting conditions
    • Image focus and clarity
  2. Document Condition

    • Physical damage
    • Fading or wear
    • Handwritten modifications
  3. Receipt Format

    • Standard formats: 99%+ accuracy
    • Non-standard layouts: 95%+ accuracy
    • Handwritten elements: 90%+ accuracy

History

Our model is continuously trained on new data to improve accuracy:

VersionRelease DateAccuracyKey Improvements
3.02024-12-2796.5%Base version

Pricing

AI API Service NameEndpointIC Per RequestOn-Premise
Receipt OCR [v1.0]receipt-ocr1 IC/RequestContact