AI-powered OCR API
The Cost-saving
Passport OCR Software
Valitract’s passport OCR software reads the MRZ and VIZ simultaneously, validates checksums against ICAO 9303 standards, and returns clean structured JSON, regardless of image angle, glare, or scan quality.
Upload a Passport
See Extraction in Action
Drop a passport image – phone photo, flatbed scan, or PDF – and watch Valitract’s OCR passport scanner extract every identity field into a structured table instantly. No account needed.
Drop, Upload and Paste your file here to Extract Text from Image
Supported file types: PNG | JPG | JPEG
Your privacy is protected! Your files are secure and never stored.
Data security is our top priority
Valitract prioritises the confidentiality and integrity of your data. As a testament to our commitment, we adhere to stringent compliance standards, including GDPR and HIPAA.


One Passport Scanner API
for Every Business
Banking & Fintech
Travel & Airlines
Government
HR & Corporate
Hotel
Digital Platforms
Why choose Valitract
OCR Passport
Automated Passport Processing
Automate both MRZ and VIZ extraction simultaneously, catching mismatches that indicate transcription errors or document tampering
3 Second Per Passport
Your team spends an average of 23 minutes per expense report on data entry alone. Valitract’s Passport OCR software cuts that to under 3 seconds.
Reduced Operational Costs
Automated Passport OCR costs $0.05–$0.10 per document, compared to $3–$10 per passport for manual data entry or outsourcing.
Seamless System Integration
JSON output plugs directly into QuickBooks, SAP, NetSuite, Xero, or any custom accounting system with minimal engineering effort.
Scalable Solution
Effortlessly scale to handle growing passport volumes, processing over 100,000 passports per hour with 99.9% uptime.
Enhanced Security
Secure Passport in the cloud to protect against loss, theft, and unauthorized access – far superior to paper-based systems.
Passport Scanning with OCR
in 4 Easy Steps
Supported formats include: jpg, png, gif, jpeg, tiff, webp, and more.
The cost-saving
Passport Scanner API
Designed for real engineering teams – not demo-ware. Full SDK support. Webhook-ready.
Handles high-volume bursts without rate-limit surprises.
import java.io.*;
import java.net.*;
import org.json.*;
public class ValitractOCR {
private static final String API_KEY = "your_api_key_here";
private static final String API_URL = "https://api.valitract.com/api/v1/extract-generic";
public static void main(String[] args) {
try {
File file = new File("document.pdf");
String result = processOCR(file);
System.out.println("Extracted Data: " + result);
} catch (Exception e) {
e.printStackTrace();
}
}
public static String processOCR(File file) throws Exception {
HttpURLConnection conn = (HttpURLConnection) new URL(API_URL).openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Authorization", "Bearer " + API_KEY);
conn.setDoOutput(true);
// Upload file and get response
return "JSON Response";
}
}package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"mime/multipart"
"net/http"
"os"
)
const (
apiKey = "your_api_key_here"
apiURL = "https://api.valitract.com/api/v1/extract-generic"
)
type OCRResponse struct {
FileName string `json:"file_name"`
ExtractedData map[string]interface{} `json:"extracted_data"`
}
func processOCR(filePath string) (*OCRResponse, error) {
file, err := os.Open(filePath)
if err != nil {
return nil, err
}
defer file.Close()
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
part, _ := writer.CreateFormFile("file", filePath)
io.Copy(part, file)
writer.Close()
req, _ := http.NewRequest("POST", apiURL, body)
req.Header.Set("Authorization", "Bearer "+apiKey)
req.Header.Set("Content-Type", writer.FormDataContentType())
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
var result OCRResponse
json.NewDecoder(resp.Body).Decode(&result)
return &result, nil
}
func main() {
result, err := processOCR("document.pdf")
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Printf("Extracted Data: %+v\n", result)
}const axios = require('axios');
const FormData = require('form-data');
const fs = require('fs');
const API_KEY = 'your_api_key_here';
const API_URL = 'https://api.valitract.com/api/v1/extract-generic';
async function processOCR(filePath) {
try {
const form = new FormData();
form.append('file', fs.createReadStream(filePath));
const response = await axios.post(API_URL, form, {
headers: {
'Authorization': `Bearer ${API_KEY}`,
...form.getHeaders()
}
});
console.log('Extracted Data:', response.data);
return response.data;
} catch (error) {
console.error('Error processing OCR:', error.message);
throw error;
}
}
// Usage
processOCR('document.pdf')
.then(data => console.log('Success:', data))
.catch(err => console.error('Failed:', err));<?php
define('API_KEY', 'your_api_key_here');
define('API_URL', 'https://api.valitract.com/api/v1/extract-generic');
function processOCR($filePath) {
if (!file_exists($filePath)) {
throw new Exception("File not found: $filePath");
}
$ch = curl_init();
$cfile = new CURLFile($filePath, mime_content_type($filePath), basename($filePath));
$data = [
'file' => $cfile
];
curl_setopt_array($ch, [
CURLOPT_URL => API_URL,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $data,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . API_KEY
]
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode === 200) {
return json_decode($response, true);
} else {
throw new Exception("API Error: $response");
}
}
// Usage
try {
$result = processOCR('document.pdf');
echo "Extracted Data:\n";
print_r($result);
} catch (Exception $e) {
echo "Error: " . $e->getMessage();
}
?>import requests
import json
API_KEY = 'your_api_key_here'
API_URL = 'https://api.valitract.com/api/v1/extract-generic'
def process_ocr(file_path):
"""
Process OCR on a document using Valitract API
Args:
file_path (str): Path to the document file
Returns:
dict: Extracted data from the document
"""
headers = {
'Authorization': f'Bearer {API_KEY}'
}
with open(file_path, 'rb') as file:
files = {
'file': (file_path, file, 'application/pdf')
}
try:
response = requests.post(API_URL, headers=headers, files=files)
response.raise_for_status()
result = response.json()
return result
except requests.exceptions.RequestException as e:
print(f'Error processing OCR: {e}')
raise
# Usage
if __name__ == '__main__':
try:
data = process_ocr('document.pdf')
print('Extracted Data:')
print(json.dumps(data, indent=2))
except Exception as e:
print(f'Failed to process document: {e}')require 'net/http'
require 'uri'
require 'json'
API_KEY = 'your_api_key_here'
API_URL = 'https://api.valitract.com/api/v1/extract-generic'
def process_ocr(file_path)
uri = URI.parse(API_URL)
File.open(file_path, 'rb') do |file|
request = Net::HTTP::Post.new(uri)
request['Authorization'] = "Bearer #{API_KEY}"
boundary = "-----------RubyMultipartBoundary"
request['Content-Type'] = "multipart/form-data; boundary=#{boundary}"
post_body = []
post_body << "--#{boundary}\r\n"
post_body << "Content-Disposition: form-data; name=\"file\"; filename=\"#{File.basename(file_path)}\"\r\n"
post_body << "Content-Type: application/pdf\r\n\r\n"
post_body << file.read
post_body << "\r\n--#{boundary}--\r\n"
request.body = post_body.join
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
if response.code == '200'
JSON.parse(response.body)
else
raise "API Error: #{response.body}"
end
end
end
# Usage
begin
result = process_ocr('document.pdf')
puts "Extracted Data:"
puts JSON.pretty_generate(result)
rescue StandardError => e
puts "Error: #{e.message}"
endusing System;
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using Newtonsoft.Json;
namespace ValitractOCR
{
public class OCRClient
{
private const string API_KEY = "your_api_key_here";
private const string API_URL = "https://api.valitract.com/api/v1/extract-generic";
public static async Task<string> ProcessOCR(string filePath)
{
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", API_KEY);
using (var form = new MultipartFormDataContent())
{
var fileContent = new ByteArrayContent(
File.ReadAllBytes(filePath)
);
fileContent.Headers.ContentType =
MediaTypeHeaderValue.Parse("application/pdf");
form.Add(fileContent, "file", Path.GetFileName(filePath));
var response = await client.PostAsync(API_URL, form);
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadAsStringAsync();
return result;
}
}
}
public static async Task Main(string[] args)
{
try
{
var result = await ProcessOCR("document.pdf");
Console.WriteLine("Extracted Data:");
var formatted = JsonConvert.DeserializeObject(result);
Console.WriteLine(
JsonConvert.SerializeObject(formatted, Formatting.Indented)
);
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}
}
}Try Passport OCR Software
for Free
Test Valitract on your actual passport samples before committing to a plan.
Dedicated developer support to help you get set up quickly.
Frequently asked question
Find quick solutions to common queries and get the most out of your learning experience
Passport OCR software reads both MRZ (Machine-Readable Zone) and the Visual Inspection Zone (VIZ) above it — the human-readable fields like full name as displayed, place of birth, and issuing authority, which are not always encoded in the MRZ.
Yes. Valitract is trained on the same conditions your team actually faces — thermal paper that’s faded to near-invisible, passport photographed at an angle, folded or creased paper, and poor lighting. Our field-level accuracy stays above 99.8% even on degraded documents. Low-confidence fields are automatically flagged for human review rather than silently returned as wrong.
Valitract achieves 99.8% data extraction accuracy across all supported formats and layouts. The AI is trained on millions of real-world passport variations and includes a validation layer that automatically flags any low-confidence fields so your team can review them before they hit your system.
Valitract accepts PDF, JPG, JPEG, PNG, TIFF, WEBP, GIF, and BMP. Both native digital PDFs and scanned or photographed passport are supported — including low resolution, skewed, or partially handwritten invoices.
Yes. Valitract returns clean JSON output, making it immediately compatible with any system that accepts JSON — including QuickBooks, SAP, NetSuite, Xero, Sage, and Microsoft Dynamics. Pre-built connectors are available for the most popular platforms.
Valitract’s OCR passport extraction is trained on passport formats from 200+ ICAO member countries, covering Latin, Cyrillic, Arabic, CJK, Devanagari, and other scripts. It handles biometric e-passports, older non-chip passports, and both TD3 (standard booklet) formats. Country-specific variants — different layouts, additional security features, regional typefaces — are supported with custom template configuration.
A free tier includes 50 documents per month at no cost. Paid plans start at $0.05–$0.10 per document, compared to $3–$10 per passport for manual data entry. Enterprise volume pricing is negotiated directly based on monthly throughput.
