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
}
}Error Responses
400 Bad Request
{
"status": 400,
"code": "INVALID_REQUEST_FORMAT",
"message":"Invalid payload or image data."
}402 Payment Required
Each successful receipt extraction costs 1 credit.
{
"success": false,
"error": "INSUFFICIENT_CREDITS",
"message": "Insufficient account balance."
}503 Service Unavailable
{
"success": false,
"error": "SYSTEM_BUSY",
"message": "Receipt OCR is currently busy. Please try again."
}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. |