Receipt OCR API
Automate your expense tracking and reimbursement workflows with our specialized Receipt OCR API. Built to handle the messy reality of physical receipts—including crumpled paper, faded thermal ink, and complex multi-item retail layouts. Instantly extract the merchant name, date, total amount, taxes, and purchased items. Perfect for expense management apps, loyalty programs, and personal finance tracking.
Endpoint
POSThttps://api.structocr.com/v1/receiptRequest Parameters
Note: Receipts are often long and narrow. Ensure the image captures the top (Merchant) and bottom (Total Amount) clearly. We automatically handle perspective distortion and rotation.
| Parameter | In | Required | Description |
|---|---|---|---|
| x-api-key | Header | Required | Your unique API key generated from the dashboard. |
| Content-Type | Header | Required | Must be set to application/json. |
| img | Body (JSON) | Required | The Base64 encoded string of the receipt image.
|
Response Schema
The API returns a clean, structured JSON object containing the essential details required for expense reporting.
| Field | Description |
|---|---|
| Metadata & Validation | |
| is_valid | Boolean indicating if core data (like total_amount) was successfully found. |
| confidence | Extraction confidence level. Returns 'high', 'medium', or 'low'. |
| Receipt Details | |
| merchant_name | Name of the store, restaurant, or vendor. |
| date | Transaction date (formatted as YYYY-MM-DD if recognizable). |
| time | Transaction time (e.g., '14:30' or '02:30 PM'). |
| currency | Currency symbol or ISO code (e.g., 'USD', '$', '¥'). |
| total_amount | The final total amount paid (Float). |
| tax_amount | Total tax or VAT amount applied (Float). |
| Line Items (Array) | |
| items[].name | Description of the purchased product or service. |
| items[].quantity | Number of units purchased (Number). |
| items[].price | Line total for this item (String format). |
Code Examples
Request Implementation
curl -X POST https://api.structocr.com/v1/receipt \
-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": {
"is_valid": true,
"confidence": "high",
"merchant_name": "Blue Bottle Coffee",
"date": "2026-04-22",
"time": "08:45 AM",
"currency": "USD",
"total_amount": 14.5,
"tax_amount": 1.25,
"items": [
{
"name": "Caffe Latte - Large",
"quantity": 2,
"price": "11.00"
},
{
"name": "Butter Croissant",
"quantity": 1,
"price": "3.50"
}
],
"validation_error": null
}
}Live API Test
Live Demo: Receipt scanner
No registration required. Upload a file to test the extraction.
Drop files here or click to browse
JPG · PNG · WebP · up to 500 files · max 4.5 MB each
Error Responses
400 Bad Request - Invalid Input
Returned when JSON is invalid or image data is missing/corrupt.
{
"status": 400,
"code": "INVALID_REQUEST_FORMAT",
// or "INVALID_JSON", "INVALID_BASE64_FORMAT"
"message":"The image data in 'img' field is malformed. Please check for illegal characters (spaces, newlines) or incorrect Base64 encoding."
}402 Payment Required - Insufficient Credits
{
"status": 402,
"code": "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
{
"status": 422,
"code": "CONTENT_POLICY_VIOLATION",
"message": "The document content could not be processed due to safety policies."
}500 Internal Server Error
{
"status": 500,
"code": "PROCESSING_ERROR",
"message": "An internal error occurred while processing the document..."
}503 Service Unavailable - System Busy
{
"status": 503,
"code": "SYSTEM_BUSY",
"message": "StructOCR is currently processing a high volume of requests..."
}Status Code Definitions
| Code | Error Code | Description |
|---|---|---|
| 200 | SUCCESS | Recognition success |
| 400 | INVALID_REQUEST_FORMAT | Invalid payload or corrupted Base64. Ensure the image string has no whitespace, newlines, or illegal characters. |
| 402 | INSUFFICIENT_CREDITS | Insufficient credits (Cost: 1/req) |
| 413 | FILE_TOO_LARGE | Decoded image exceeds 4.5MB |
| 503 | SYSTEM_BUSY | API Rate limit reached or upstream AI provider is busy. |