This guide covers server-side receipt processing via the Scan API. Use this when you need to process receipt images without a mobile SDK, such as from a web app, file transfer, or batch pipeline.
How It Works
- Submit — Send receipt images to the Scan API as file uploads or publicly accessible URLs.
- Extract — The API processes the image and returns structured JSON with merchant, date, total, line items, payment method, and more.
- Enrich (optional) — If Product Intelligence is enabled, extracted line items are matched against the product catalog for UPC, brand, category, and normalized product names.
Authentication
Every request requires your license_key in the request body. Obtain your key from your Actual account manager or via the Developer Hub.
Single-Frame Requests
Send one receipt image with frame_idx=1 and last_frame=true. The API returns structured JSON with all extracted data.
Image upload (multipart form-data):
curl -X POST "https://api.blinkreceipt.com/v14" \
-H "Content-Type: multipart/form-data" \
-F "license_key=your_license_key" \
-F "image=@receipt.jpg" \
-F "frame_idx=1" \
-F "last_frame=true"
Image URL (application/x-www-form-urlencoded):
curl -X POST "https://api.blinkreceipt.com/v14" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "license_key=your_license_key" \
-d "image_urls[0]=https://example.com/receipt.jpg" \
-d "detect_duplicates=true"
Multi-Frame Requests (Long Receipts)
For receipts that span multiple images:
- Submit the first frame with
frame_idx=1andlast_frame=false. - Save the
blink_receipt_idfrom the response. - Submit subsequent frames with the same
blink_receipt_id, incrementingframe_idx. - Set
last_frame=trueon the final frame.
Frames must be submitted in order. If you don’t know the last frame during real-time processing, make a final call with just the license_key, blink_receipt_id, and last_frame=true.
Request Parameters
Image Upload (multipart/form-data)
| Parameter | Type | Required | Description |
|---|---|---|---|
license_key | string | Yes | Your Scan API license key |
image | binary | Yes | PNG or JPEG image (max 10 MB) |
frame_idx | integer | Yes | Frame index, starting at 1 |
last_frame | boolean | Yes | true for single-frame or final frame |
blink_receipt_id | string | For frames 2+ | Returned from the first frame response |
Image URL (application/x-www-form-urlencoded)
| Parameter | Type | Required | Description |
|---|---|---|---|
license_key | string | Yes | Your Scan API license key |
image_urls[0] | string | Yes | Publicly accessible URL of the receipt image |
detect_duplicates | boolean | No | Enable duplicate detection |
Duplicate Detection
Enable detect_duplicates=true in your request to check whether a receipt has been submitted before. The response includes isDuplicate and duplicateBlinkReceiptIds if a match is found. Duplicate detection uses trip and basket data and checks within a 2-week window across your instance.
Image Requirements
- Formats: PNG or JPEG
- Maximum size: 10 MB per image
- Higher quality images (good lighting, minimal blur, flat receipt) produce better results
Response
The API returns a JSON object with:
- Trip-level fields: merchant name, date, time, total, subtotal, tax, payment method, store location, transaction ID, cashier, register
- Basket-level fields: product descriptions, quantities, prices, UPCs (with Product Intelligence)
- Confidence scores:
trip_confidence,item_confidence,ocr_confidence - Quality indicators:
is_receipt,is_blurry,is_screen,is_fraudulent,is_duplicate
Scan API Reference (SwaggerHub)
Receipt Quality & Feedback
| Field | What it tells you |
|---|---|
is_receipt | Whether the image appears to be a valid receipt |
is_blurry | Whether the image is too blurry to extract reliably |
is_screen | Whether the image appears to be a photo of a screen |
is_fraudulent | Whether the receipt appears manipulated or counterfeit (US only, select banners) |
is_duplicate | Whether this receipt has been submitted before (2-week window, within your instance) |
ocr_confidence | Average OCR confidence score across all characters |
Testing Recommendations
- Test with both high-quality and low-quality images to understand accuracy thresholds
- Test multi-frame submissions with long receipts
- Test duplicate detection by submitting the same receipt twice
- Test with various receipt types: thermal, inkjet, laser-printed
Implementation Timeline
| Scope | Estimated Dev Time |
|---|---|
| Web API integration | ~1 week + QA |