Passport OCR

Seamlessly automate identity verification with our enterprise-grade Passport OCR API. We provide high-precision data extraction for passports from over 195 countries and regions, supporting both standard ICAO-compliant Machine-Readable Zones (MRZ) and complex non-standard formats. Transform passport images into clean, structured JSON in seconds to streamline your global onboarding and KYC workflows.


Endpoint

POSThttps://api.structocr.com/v1/passport

Request Parameters

Important: This endpoint requires application/json Content-Type. Images must be sent as Base64 strings.

ParameterInRequiredDescription
x-api-keyHeaderRequiredYour unique API key generated from the dashboard.
Content-TypeHeaderRequiredMust be set to application/json.
imgBody (JSON)RequiredThe Base64 encoded string of the passport image.
  • Supports standard Data URI (e.g., data:image/jpeg;base64,...)
  • Supports raw Base64 strings
  • Max file size: 4.5MB
  • Formats: JPG, PNG, WebP

Response Schema

The following fields are extracted into the data object. All dates are normalized to YYYY-MM-DD.

FieldDescription
typeDocument type indicator (e.g., 'P' for Passport).
country_codeISO 3166-1 alpha-3 country code (e.g., 'USA', 'CAN').
nationalityThe full nationality of the passport holder.
passport_numberThe unique document number found on the data page.
surnameThe holder's family name (Last Name).
given_namesThe holder's first and middle names.
sexGender of the holder (e.g., 'M', 'F', or 'X').
date_of_birthHolder's birth date in YYYY-MM-DD format.
place_of_birthThe location/city of birth as listed on the passport.
date_of_issueThe date when the passport was officially issued.
date_of_expiryThe date when the passport validity expires.
place_of_issueThe location or authority that issued the document.

Code Examples

Request Implementation

curl -X POST https://api.structocr.com/v1/passport \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "img": "data:image/jpeg;base64,/9j/4AAQSkZJRg..."
  }'

Success Response (200 OK)

{
  "success": true,
  "data": {
    "type": "passport",
    "country_code": "USA",
    "nationality": "UNITED STATES",
    "passport_number": "E12345678",
    "surname": "DOE",
    "given_names": "JOHN",
    "sex": "M",
    "date_of_birth": "1990-01-01",
    "place_of_birth": "NEW YORK, USA",
    "date_of_issue": "2020-01-01",
    "date_of_expiry": "2030-01-01",
    "place_of_issue": "PASSPORT AGENCY"
  }
}

Error Responses

400 Bad Request - Invalid Input

Returned when JSON is invalid or image data is missing/corrupt.

{
  "error": "INVALID_JSON" 
  // or "NO_IMAGE_DATA", "INVALID_BASE64"
}

402 Payment Required - Insufficient Credits

{
  "success": false,
  "error": "INSUFFICIENT_CREDITS",
  "message": "Your account balance is insufficient to complete this operation."
}

413 Payload Too Large

The Base64 decoded image size exceeds 4.5MB.

{
  "error": "FILE_TOO_LARGE"
}

415 Unsupported Media Type

{
  "error": "INVALID_CONTENT_TYPE_USE_JSON"
}

422 Unprocessable Entity - Policy Violation

{
  "success": false,
  "error": "CONTENT_POLICY_VIOLATION",
  "message": "The document content could not be processed due to safety policies."
}

500 Internal Server Error

{
  "success": false,
  "error": "PROCESSING_ERROR",
  "message": "An internal error occurred while processing the document..."
}

503 Service Unavailable - System Busy

{
  "success": false,
  "error": "SYSTEM_BUSY",
  "message": "StructOCR is currently processing a high volume of requests..."
}

Status Code Definitions

CodeError CodeDescription
200SUCCESSRecognition success
400INVALID_JSONInvalid Body or corrupted Base64
402INSUFFICIENT_CREDITSAccount balance too low
413FILE_TOO_LARGEDecoded image exceeds 4.5MB
415INVALID_CONTENT_TYPENot using application/json
422CONTENT_POLICY_VIOLATIONAI safety/policy block
503SYSTEM_BUSYAPI Rate limit reached