🚗 Vehicle Registration Book OCR
Welcome to the Vehicle Registration Book OCR API, part of iApp Any Documents OCR by iApp Technology Co., Ltd. Extracts vehicle and ownership data from Department of Land Transport vehicle registration books (คู่มือจดทะเบียนรถ), including the latest owner entry. Supports scanned PDFs and photographs of the blue book.
Try Demo!
Try Our AI Demo
Login or create a free account to use this AI service demo and explore our powerful APIs.
Get 100 Free Credits (IC) when you sign up!
Offer ends December 31, 2025
Getting Started
-
Prerequisites
- An API key from iApp Technology
- Document file: Vehicle Registration Book (เล่มทะเบียนรถ (คู่มือจดทะเบียนรถ))
- Supported file formats: PDF, JPG, JPEG, PNG, WEBP
- Maximum file size: 50MB
-
Quick Start
- Single
POSTwithmultipart/form-data - Structured JSON out, with a per-field confidence score
- Multi-page PDFs are combined into a single
docsentry.
- Single
-
Key Features
- Field-level extraction with confidence scoring
- Thai and English output via
target_lang - Optional raw OCR text via
return_ocr - Handles photographs and scanned PDFs
-
Security & Compliance
- GDPR and PDPA compliant
- Secure API endpoints
- No data retention after processing
Please visit API Key Management page to view your existing API key or request a new one.
API Endpoints
| Endpoint | Method | Description | Cost |
|---|---|---|---|
/ocr/v3/vehicle-registration/file/v3/store/ocr/vehicle-registration | POST | Extract vehicle and ownership data from Thai vehicle registration books | 1 IC per page |
Both forms are equivalent. There is no base64 variant for this endpoint — file upload only.
Request
Request Headers
| Header | Value | Required |
|---|---|---|
apikey | Your iApp API key | Yes |
Request Body (multipart/form-data)
| Parameter | Type | Default | Description |
|---|---|---|---|
file | File (repeatable) | — | Required. Document file. PDF pages are processed automatically. |
return_ocr | Boolean | false | Include the raw OCR text in the response. |
target_lang | String | th | Language of extracted values: th or en. |
include_confidence | Boolean | true | Include a per-field confidence score (0.00–1.00). |
cURL
curl -X POST "https://api.iapp.co.th/ocr/v3/vehicle-registration/file" \
-H "apikey: YOUR_API_KEY" \
-F "file=@/path/to/document.pdf" \
-F "target_lang=th" \
-F "include_confidence=true"
Response
{
"docs": [
{
"message": "success",
"raw": {},
"processed": {
"registration_date": "27 มิถุนายน 2562",
"license_plate": "1กข 1234",
"province": "กรุงเทพมหานคร",
"vehicle_type": "รถยนต์นั่งส่วนบุคคลไม่เกิน 7 คน",
"brand": "ISUZU",
"model": "mu-X",
"year": 2019,
"color": "ขาว",
"body_number": "MP1TFR85XKT000000",
"engine_number": "4JJ1XX0000",
"fuel_type": "ดีเซล",
"seating_capacity": 7,
"owner_name": "นายสมชาย ตัวอ ย่าง",
"owner_id": "1100000000001",
"owner_address": "123 ถนนพหลโยธิน แขวงจตุจักร เขตจตุจักร กรุงเทพมหานคร",
"occupant_name": null,
"occupant_id": null
},
"confidence": {
"registration_date": 0.95,
"license_plate": 0.95,
"province": 0.95,
"vehicle_type": 0.95,
"brand": 0.95,
"model": 0.95
},
"process_ms": 4120
}
],
"docs_count": 1,
"process_ms": 4300
}
The iapp-input-pages response header reports the number of billed pages.
Supported Fields
| Field | Type | Description |
|---|---|---|
| registration_date | String | Registration date |
| license_plate | String | Licence plate number |
| province | String | Province of registration |
| vehicle_type | String | Vehicle type |
| brand | String | Make, e.g. ISUZU |
| model | String | Model, e.g. mu-X |
| year | Integer | Model year (CE) |
| color | String | Colour |
| body_number | String | Chassis / body number |
| engine_number | String | Engine number |
| fuel_type | String | Fuel type |
| seating_capacity | Integer | Number of seats |
| owner_name | String | Name of the most recent registered owner |
| owner_id | String | National ID / juristic person ID of the owner |
| owner_address | String | Owner address |
| occupant_name | String | Name of the possessor, if any |
| occupant_id | String | National ID / juristic person ID of the possessor, if any |
Error Handling
| Status | Meaning |
|---|---|
| 400 | Unsupported file extension, or file larger than 50MB |
| 401 | Missing or invalid apikey |
| 402 | Insufficient credit balance |
| 404 | Unknown document type in the URL |
| 422 | No file attached to the request |
| 500 | Processing error — the response contains an error code to quote to support |
Code Examples
Python
import requests
url = "https://api.iapp.co.th/ocr/v3/vehicle-registration/file"
headers = {"apikey": "YOUR_API_KEY"}
files = {"file": open("document.pdf", "rb")}
data = {"target_lang": "th", "include_confidence": "true"}
response = requests.post(url, headers=headers, files=files, data=data)
result = response.json()
print(result["docs"][0]["processed"])
print(result["docs"][0]["confidence"])
JavaScript
const form = new FormData();
form.append("file", fileInput.files[0]);
form.append("target_lang", "th");
form.append("include_confidence", "true");
const res = await fetch("https://api.iapp.co.th/ocr/v3/vehicle-registration/file", {
method: "POST",
headers: { apikey: "YOUR_API_KEY" },
body: form,
});
const result = await res.json();
console.log(result.docs[0].processed);
PHP
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://api.iapp.co.th/ocr/v3/vehicle-registration/file");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ["apikey: YOUR_API_KEY"]);
curl_setopt($ch, CURLOPT_POSTFIELDS, [
"file" => new CURLFile("/path/to/document.pdf"),
"target_lang" => "th",
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
Java
OkHttpClient client = new OkHttpClient();
RequestBody body = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("file", "document.pdf",
RequestBody.create(new File("/path/to/document.pdf"),
MediaType.parse("application/pdf")))
.addFormDataPart("target_lang", "th")
.build();
Request request = new Request.Builder()
.url("https://api.iapp.co.th/ocr/v3/vehicle-registration/file")
.addHeader("apikey", "YOUR_API_KEY")
.post(body)
.build();
try (Response response = client.newCall(request).execute()) {
System.out.println(response.body().string());
}
Swift
let url = URL(string: "https://api.iapp.co.th/ocr/v3/vehicle-registration/file")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("YOUR_API_KEY", forHTTPHeaderField: "apikey")
let boundary = UUID().uuidString
request.setValue("multipart/form-data; boundary=\(boundary)",
forHTTPHeaderField: "Content-Type")
var data = Data()
let fileData = try Data(contentsOf: URL(fileURLWithPath: "/path/to/document.pdf"))
data.append("--\(boundary)\r\n".data(using: .utf8)!)
data.append("Content-Disposition: form-data; name=\"file\"; filename=\"document.pdf\"\r\n\r\n".data(using: .utf8)!)
data.append(fileData)
data.append("\r\n--\(boundary)--\r\n".data(using: .utf8)!)
URLSession.shared.uploadTask(with: request, from: data) { responseData, _, _ in
if let responseData, let json = String(data: responseData, encoding: .utf8) {
print(json)
}
}.resume()
Kotlin
val client = OkHttpClient()
val body = MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart(
"file", "document.pdf",
File("/path/to/document.pdf").asRequestBody("application/pdf".toMediaType())
)
.addFormDataPart("target_lang", "th")
.build()
val request = Request.Builder()
.url("https://api.iapp.co.th/ocr/v3/vehicle-registration/file")
.addHeader("apikey", "YOUR_API_KEY")
.post(body)
.build()
client.newCall(request).execute().use { response ->
println(response.body?.string())
}
Dart
import 'package:http/http.dart' as http;
final request = http.MultipartRequest(
'POST',
Uri.parse('https://api.iapp.co.th/ocr/v3/vehicle-registration/file'),
);
request.headers['apikey'] = 'YOUR_API_KEY';
request.fields['target_lang'] = 'th';
request.files.add(
await http.MultipartFile.fromPath('file', '/path/to/document.pdf'),
);
final response = await request.send();
print(await response.stream.bytesToString());
Limitations & Best Practices
Limitations
- Maximum file size 50MB per request
- Supported formats: PDF, JPG, JPEG, PNG, WEBP
- Accuracy depends on image quality — heavily degraded scans, glare and handwriting over printed values reduce field-level accuracy
- Extraction is limited to the fields listed above
Best Practices
- Prefer the original PDF over a photograph where you have one
- Photograph the whole document, square-on and in even lighting
- Use at least 300 DPI for scans
- Check the
confidencescore per field and route low-confidence values to manual review - Send multiple documents in one request where supported to reduce round trips
Accuracy & Performance
Field-level extraction accuracy measured on the internal ChindaOCR-M3 golden evaluation set — visually re-verified labels over real Thai documents, including low-resolution photographs and bills partly obscured by handwriting.
| Document Type | Docs | Fields | Accuracy |
|---|---|---|---|
| Vehicle Registration Book | 2 | 13 | 92.3% |
| Overall, all six document types | 25 | 147 | 98.6% |
Support
Need help? Contact us:
- Email: sale@iapp.co.th
- Phone: 086-322-5858
- Discord: iApp Technology