Skip to main content

📄 General Thai Document OCR

🧾 ระบบอ่านจดหมายราชการ รายงาน เอกสารไทยทั่วไป

Version Status New

Welcome to Thai Document OCR API, version 2.0, an AI product developed by iApp Technology Co., Ltd. Our API automatically converts printed Thai documents into editable text formats with high accuracy. The API supports images (PNG, JPEG, JPG) and PDF files, processing them into three different output formats.

Try Demo

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

Getting Started

  1. Prerequisites

    • An API key from iApp Technology
    • Thai document images or PDFs
    • Supported formats: PNG, JPEG, JPG, PDF
    • Maximum file size: 30MB
  2. Quick Start

    • Fast processing time
    • High accuracy text extraction
    • Multiple output format options
  3. Key Features

    • Three output formats:
      • Editable Text (.txt)
      • Structured JSON (.json)
      • Microsoft Word file (.docx)
    • Automatic document component recognition
    • Support for both Thai and English text
  4. Security & Compliance

    • GDPR and PDPA compliant
    • URL file paths valid for 10 minutes only
How to get API Key?

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

Features & Capabilities

Core Features

  • Text extraction from documents
  • Document structure analysis
  • Multiple output formats
  • Support for Thai and English text
  • PDF file support

Supported Fields

  • Page boundary detection
  • Title recognition
  • Paragraph detection
  • Image detection
  • Table recognition
  • Thai character recognition
  • English character recognition
  • Special character support

Example

Perform OCR and Return Raw Text

  • Sample Request
    curl --location 'https://api.iapp.co.th/document-ocr/ocr' \
--header 'apikey: {YOUR API KEY}' \
--form 'file=@"{YOUR UPLOADED FILE}"'
  • Sample Response
{
"text": ["ด่วนที่สุด\nที่ มท ๐๔๐๒.๖ มั่นคงและชุมชนพึ่งตนเองได้\nภายในปี ๒๕๖๕ ..."],
"time": 1.1443967819213867,
"iapp": { "page": 0, "char": 1376 }
}

Perform Document Structure Analysis, OCR and return JSON formatted bounding box and raw text

  • Sample Request
curl --location 'https://api.iapp.co.th/document-ocr/layout' \
--header 'apikey: {YOUR API KEY}' \
--form 'file=@"{YOUR UPLOADED FILE}"'
  • Sample Response
{
"pages": [
{
"page": 1,
"components": [
{
"text": "ให้ไว้ ณ วันที่ 10 กุมภาพันธ์ 2554\n(นาย น ง ปานทอง\nอัยการผู้เชี่ยวชาญ สํานักงานอัยการภาค 5\nรักษาการในตาแหน่งอัยการจังหวัดเชียงใหม่",
"bb_left": 228.6162872314453,
"bb_top": 433.568115234375,
"bb_right": 436.36279296875,
"bb_bottom": 554.9218139648438,
"type": "Signature"
},
{
"text": "หนังสือรับรองฉบับนี้ออกให้เพื่อรับรองว่า ห้างหุ้นส่วนจำกัด เชียงใหม่แฮร์แคร์เอ็นจิเนียริ่ง ซึ่ง\nจดทะเบียนเป็นนิติบุคคล ณ สำนักงานทะเบียนหุ้นส่วนบริษัทจังหวัดเชียงใหม่ กรมพัฒนาธุรกิจการค้า\nกระทรวงพาณิชย์ มีสำนักงานใหญ่ ตั้งอยู่ เลขที่ 58/19 หมู่ที่ 4 ตำบลหนองหอย อำาเภอเมืองเชียงใหม่ จังหวัด\nเชียงใหม่ 50000 จ้างเหมาครุภัณฑ์สำนักงานเครื่องปรับอากาศพร้อมติดตั้ง ทั้งนี้",
"bb_left": 120.08554077148438,
"bb_top": 194.70896911621094,
"bb_right": 560.1184692382812,
"bb_bottom": 271.0887756347656,
"type": "Para1"
},
{
"text": "FUSION รุ่น FUC24Ff124 (ฉลากเบอร์ 5) แบบฟอกอากาศ จํานวน 3 เครื่อง พร้อมติดตั้ง\nรายละเอียดตาม สัญญาเลขที่ 1/2554 ลงวันที่ 13 มกราคม พ.ศ. 2554 จํานวนเงินตามสัญญารวมทั้ง\nสามรายการ เป็นเงินทั้งสิ้น 512,255 บาท (ห้าแสนหนึ่งหมื่นสองพันสองร้อยห้าสิบห้าบาทถ้วน) ซึ่งผู้จ้างได้",
"bb_left": 109.7691650390625,
"bb_top": 353.8553161621094,
"bb_right": 551.1951293945312,
"bb_bottom": 418.5770568847656,
"type": "Para1"
},
{ "text": "", "bb_left": 281.7373046875, "bb_top": 47.54597854614258, "bb_right": 348.1979675292969, "bb_bottom": 117.07936096191406, "type": "Logo" },
{
"text": "FISION รุ่น FIC MARUDT1 (ฉลากเบอร์ 5) แบบฟอกอากาศ จํานวน 11 เครื่อง พร้อมติดตั้ง\n3. เครื่องปรับอากาศแบบแยกส่วน ชนิดตั้งพื้นหรือชนิดแขวน ขนาด 25,182.95 ยู ยี่ห้อ",
"bb_left": 107.63800048828125,
"bb_top": 313.69549560546875,
"bb_right": 527.8297119140625,
"bb_bottom": 355.0850524902344,
"type": "Para1"
},
{
"text": "FUSION รุ่น FUCK1201128 (ฉลากเบอร์ 5) แบบฟอกอากาศ จํานวน 11 เครื่อง พร้อมติดตั้ง\n2. เครื่องปรับอากาศแบบแยกส่วน ชนิดตั้งพื้นหรือชนิดแขวน ขนาด 18,087.01 บีทียู ยี่ห้อ",
"bb_left": 108.46659088134766,
"bb_top": 279.6349182128906,
"bb_right": 536.12890625,
"bb_bottom": 322.54345703125,
"type": "Para1"
},
{
"text": "สํานักงานอัยการจังหวัดเชียงใหม่\nคน ราชการจังหวัดเชียงใหม่\nถ.โชตนา ชม 50300",
"bb_left": 374.2991638183594,
"bb_top": 95.19263458251953,
"bb_right": 509.24542236328125,
"bb_bottom": 156.33181762695312,
"type": "UpperRight"
},
{ "text": "หนังสือรับรองผลงาน", "bb_left": 282.33282470703125, "bb_top": 165.2444610595703, "bb_right": 374.5608215332031, "bb_bottom": 184.74752807617188, "type": "Date" },
{
"text": "1. เครื่องปรับอากาศแบบแยกส่วน ชนิดตั้งพื้นหรือชนิดแขวน ขนาด 13,942.80 บีทียู ยี่หัอ\nFUSION 1UCk120112 (ฉลากเบอร์ 5) แบบฟอกอากาศ จํานวน 11 เครื่อง พร้อมติดตั้ง",
"bb_left": 114.9815902709961,
"bb_top": 269.22735595703125,
"bb_right": 521.8577270507812,
"bb_bottom": 306.366943359375,
"type": "Para1"
},
{ "text": "ที่ ทส (ชม) 0037/435", "bb_left": 122.62628936767578, "bb_top": 98.11686706542969, "bb_right": 224.76698303222656, "bb_bottom": 116.89942932128906, "type": "NextPage" },
{
"text": "FLE\n2. เครื่องปรับอากาศแบบแยกส่วน ชนิดตั้งพื้นหรือชนิดแขวน ขนาด 18,087.01 บีทียู ยี่ห้อ\nFIISION รุ่น FIC MARUIDT1 (ฉลากเบอร์ 5) แบบฟอกอากาศ จํานวน 11 เอง พร้อมติดตั้ง",
"bb_left": 108.22515106201172,
"bb_top": 293.6889953613281,
"bb_right": 529.6473388671875,
"bb_bottom": 338.7919616699219,
"type": "Para1"
},
{
"text": "เชียงใหม่ 50000 จ้างเหมาครุ ณ สานักงานเครื่องปรับอากาศพร้อมสด ง.\n1. เครื่องปรับอากาศแบบแยกส่วน ชนิดตั้งพื้นหรือชนิดแขวน ขนาด 13,942.80 บีทียู ยี่ห้อ",
"bb_left": 112.15975189208984,
"bb_top": 255.9883575439453,
"bb_right": 546.0884399414062,
"bb_bottom": 290.6558532714844,
"type": "Para1"
}
]
}
],
"time": 4.234404563903809,
"iapp": { "page": 1, "char": 1673 }
}

Perform Document Structure Analysis, OCR and return a URL file path of a converted Microsoft Words (as .docx) file.

  • Sample Request
curl --location 'https://api.iapp.co.th/document-ocr/docx' \
--header 'apikey: {YOUR API KEY}' \
--form 'file=@"{YOUR UPLOADED FILE}"'
  • Sample Response
{
"path": "https://storage.googleapis.com/iapp-ocr-docx/document_trial2-250114-074403.docx?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=ai-ocr%40iapp-ai-357013.iam.gserviceaccount.com%2F20250114%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20250114T074407Z&X-Goog-Expires=600&X-Goog-SignedHeaders=host&X-Goog-Signature=425b62bc36eec0cc5c0ca7442f863ae960f7a41302f8da5c312b7392011cbfe6119b4814bade146fac81da427a231142cce5d67a56c35e242437cf5a7990bc48290c403052af23eb2293da55e5249cdb803bb4c18a5b15d6262caa4b773487417dd3ed62fe47a75e42d7aa5e631e08efa1320c589042b0e244c7ba0c10ec236303f6b92d1546d49f3f1b1f4aca7ceb9715036470b6bd6caf6aecb862eef180d213f8787e65dc5f97decf0b05add6ce28499a5b76ef31112884442affc3b79dde8531a014e90352a9e73ffdc1f118e2d082294509fb41c26e3f4d55c2854c73e3142298ef75d40ee95dbe63c4c2ec4de4a170c9c746986f7d248f99f0ef9a12f9",
"time": 1.728440761566162,
"iapp": { "pages": 1, "char": 1229 }
}

API Reference

Endpoints

EndpointMethodURLDescriptionContent-Type
Text ExtractionPOSThttps://api.iapp.co.th/document-ocr/ocrReturns raw text outputmultipart/form-data
Layout AnalysisPOSThttps://api.iapp.co.th/document-ocr/layoutReturns JSON with bounding boxes and textmultipart/form-data
DOCX ConversionPOSThttps://api.iapp.co.th/document-ocr/docxReturns URL to download .docx filemultipart/form-data

Required Parameter

ParameterRequiredDescription
apikeyYesYour API key
fileYesDocument image/PDF file

Code Example

Python

import requests

url = "https://api.iapp.co.th/document-ocr/ocr"

payload = {}
files=[
('file',('{YOUR UPLOADED FILE}',open('{YOUR UPLOADED FILE}','rb'),'application/pdf'))
]
headers = {
'apikey': '{YOUR API KEY}'
}

response = requests.request("POST", url, headers=headers, data=payload, files=files)

print(response.text)

JavaScript

const axios = require("axios")
const FormData = require("form-data")
const fs = require("fs")
let data = new FormData()
data.append("file", fs.createReadStream("{YOUR UPLOADED FILE}"))

let config = {
method: "post",
maxBodyLength: Infinity,
url: "https://api.iapp.co.th/document-ocr/ocr",
headers: {
apikey: "{YOUR API KEY}",
...data.getHeaders(),
},
data: data,
}

axios
.request(config)
.then((response) => {
console.log(JSON.stringify(response.data))
})
.catch((error) => {
console.log(error)
})

PHP

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
CURLOPT_URL => 'https://api.iapp.co.th/document-ocr/ocr',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => array('file'=> new CURLFILE('{YOUR UPLOADED FILE}')),
CURLOPT_HTTPHEADER => array(
'apikey: {YOUR API KEY}'
),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;

Swift

let parameters = [
[
"key": "file",
"src": "{YOUR UPLOADED FILE}",
"type": "file"
]] as [[String: Any]]

let boundary = "Boundary-\(UUID().uuidString)"
var body = Data()
var error: Error? = nil
for param in parameters {
if param["disabled"] != nil { continue }
let paramName = param["key"]!
body += Data("--\(boundary)\r\n".utf8)
body += Data("Content-Disposition:form-data; name=\"\(paramName)\"".utf8)
if param["contentType"] != nil {
body += Data("\r\nContent-Type: \(param["contentType"] as! String)".utf8)
}
let paramType = param["type"] as! String
if paramType == "text" {
let paramValue = param["value"] as! String
body += Data("\r\n\r\n\(paramValue)\r\n".utf8)
} else {
let paramSrc = param["src"] as! String
let fileURL = URL(fileURLWithPath: paramSrc)
if let fileContent = try? Data(contentsOf: fileURL) {
body += Data("; filename=\"\(paramSrc)\"\r\n".utf8)
body += Data("Content-Type: \"content-type header\"\r\n".utf8)
body += Data("\r\n".utf8)
body += fileContent
body += Data("\r\n".utf8)
}
}
}
body += Data("--\(boundary)--\r\n".utf8);
let postData = body


var request = URLRequest(url: URL(string: "https://api.iapp.co.th/document-ocr/ocr")!,timeoutInterval: Double.infinity)
request.addValue("{YOUR API KEY}", forHTTPHeaderField: "apikey")
request.addValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")

request.httpMethod = "POST"
request.httpBody = postData

let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data else {
print(String(describing: error))
return
}
print(String(data: data, encoding: .utf8)!)
}

task.resume()

Kotlin

val client = OkHttpClient()
val mediaType = "text/plain".toMediaType()
val body = MultipartBody.Builder().setType(MultipartBody.FORM)
.addFormDataPart("file","{YOUR UPLOADED FILE}",
File("{YOUR UPLOADED FILE}").asRequestBody("application/octet-stream".toMediaType()))
.build()
val request = Request.Builder()
.url("https://api.iapp.co.th/document-ocr/ocr")
.post(body)
.addHeader("apikey", "{YOUR API KEY}")
.build()
val response = client.newCall(request).execute()

Java

OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("text/plain");
RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM)
.addFormDataPart("file","{YOUR UPLOADED FILE}",
RequestBody.create(MediaType.parse("application/octet-stream"),
new File("{YOUR UPLOADED FILE}")))
.build();
Request request = new Request.Builder()
.url("https://api.iapp.co.th/document-ocr/ocr")
.method("POST", body)
.addHeader("apikey", "{YOUR API KEY}")
.build();
Response response = client.newCall(request).execute();

Dart

var headers = {
'apikey': '{YOUR API KEY}'
};
var request = http.MultipartRequest('POST', Uri.parse('https://api.iapp.co.th/document-ocr/ocr'));
request.files.add(await http.MultipartFile.fromPath('file', '{YOUR UPLOADED FILE}'));
request.headers.addAll(headers);

http.StreamedResponse response = await request.send();

if (response.statusCode == 200) {
print(await response.stream.bytesToString());
}
else {
print(response.reasonPhrase);
}

Accuracy and Performance

  • Document Component Analysis Accuracy: 96.97% AP Score
  • OCR Accuracy (Word Level)
    • English Accuracy ~98%
    • Thai Accuracy ~96%

Pricing

AI API Service NameEndpointIC Per PageOn-Premise
Document OCRiapp_document_ocr_v21 IC/PageContact