PDF2JSON
PDF in. Clean JSON out.
One API call that reads invoices, contracts and forms the way a person does — and returns structured, semantic JSON your systems can use immediately. No templates to configure. No fields to map.
Live at POST https://pdf.blueport.io/pdf2json — most documents come back in 10–25 seconds.
Three steps. One of them is yours.
You send the document. The AI does the reading. You get back JSON shaped by what the document actually says.
Post your PDF
Send the file raw or as base64 with your organisation's API key — up to 8 MB per document. That's the whole integration.
The AI reads it
Not OCR, not a layout parser — the document is read for meaning: who the parties are, what the line items say, which totals matter.
JSON comes back
Logical entity groups with camelCase keys, real JSON numbers for money and ISO dates — typically in 10–25 seconds.
One invoice, seen both ways
On the left, the kind of PDF your inbox is full of. On the right, exactly what PDF2JSON returns for it — grouped entities, typed numbers, ISO dates.
Coastline Powersports Pty Ltd
14 Slipway Drive, Marlin Bay NSW 2430
accounts@coastlineps.example
| Description | Qty | Unit | Amount |
|---|---|---|---|
| 30,000 km service — labour | 1 | 289.00 | 289.00 |
| Oil filter HF-204 | 1 | 24.50 | 24.50 |
| Engine oil 10W-40 (3.2 L) | 1 | 58.80 | 58.80 |
| Brake pads — front set | 1 | 89.95 | 89.95 |
Response — POST /pdf2json
{
"ok": true,
"data": {
"documentType": "TAX INVOICE",
"pages": 1,
"currency": "AUD",
"supplier": {
"name": "Coastline Powersports Pty Ltd",
"abn": "84 002 749 331",
"address": "14 Slipway Drive, Marlin Bay NSW 2430",
"email": "accounts@coastlineps.example"
},
"customer": {
"name": "Jordan Avery",
"address": "8 Foreshore Rd, Marlin Bay NSW 2430",
"email": "jordan.avery@example.com"
},
"invoice": {
"invoiceNumber": "INV-20841",
"issueDate": "2026-08-12",
"dueDate": "2026-08-26"
},
"lineItems": [
{ "description": "30,000 km service - labour",
"quantity": 1, "unitPrice": 289.00, "amount": 289.00 },
{ "description": "Oil filter HF-204",
"quantity": 1, "unitPrice": 24.50, "amount": 24.50 },
{ "description": "Engine oil 10W-40 (3.2 L)",
"quantity": 1, "unitPrice": 58.80, "amount": 58.80 },
{ "description": "Brake pads - front set",
"quantity": 1, "unitPrice": 89.95, "amount": 89.95 }
],
"totals": {
"subtotalExcludingGst": 462.25,
"gst": 46.23,
"totalIncludingGst": 508.48
}
},
"meta": { "request_id": "req_9f2c41ab", "duration_ms": 12840, "model": "hkm" }
}
Fields you can use, not fragments to parse
Most PDF-to-JSON tools return the page layout — positioned text boxes with styling metadata. The fields you actually need are still your problem. Here's the same invoice through a typical layout extractor, and through PDF2JSON:
Typical layout extractor
{
"page": 1,
"objects": [
{ "text": "Coastline Powersports Pty Ltd",
"x": 56.4, "y": 48.2, "width": 214.7, "height": 15.1,
"fontName": "Helvetica-Bold", "fontSize": 15.0,
"style": "h2", "type": "text" },
{ "text": "INV-20841",
"x": 458.1, "y": 74.9, "width": 68.3, "height": 11.2,
"fontName": "Helvetica-Bold", "style": "p", "type": "text" },
{ "text": "12/08/2026",
"x": 449.6, "y": 89.4, "width": 61.8, "height": 10.6,
"style": "p", "type": "datetime" },
{ "text": "$508.48",
"x": 470.3, "y": 402.6, "width": 47.5, "height": 12.4,
"fontName": "Helvetica-Bold", "style": "p", "type": "currency" }
… 60+ more text objects
]
}
- Values are strings — "$508.48" still needs parsing
- No entities — which text box is the supplier? The customer?
- Dozens of coordinate blocks per page for you to reassemble
PDF2JSON
{
"documentType": "TAX INVOICE",
"currency": "AUD",
"supplier": {
"name": "Coastline Powersports Pty Ltd",
"abn": "84 002 749 331"
},
"customer": {
"name": "Jordan Avery"
},
"invoice": {
"invoiceNumber": "INV-20841",
"issueDate": "2026-08-12",
"dueDate": "2026-08-26"
},
"totals": {
"subtotalExcludingGst": 462.25,
"gst": 46.23,
"totalIncludingGst": 508.48
}
}
- Real JSON numbers, ISO dates, currency codes
- Entities already grouped: supplier, customer, invoice, totals
- Straight into your CRM or ledger — no mapping layer to build
Built for documents that don't behave
Every supplier formats things differently. PDF2JSON doesn't care — there is nothing to set up per document type.
No templates, ever
Invoices, sale contracts, registration forms — send any of them today without configuring a single field or zone.
Semantic entities
The JSON is grouped the way you think: dealer, customer, vehicle, pricing, totals — not a flat list of text boxes.
Typed values
Money comes back as numbers, dates as ISO, blanks as null. Your code never parses "$18,990.00" out of a string again.
Entities stay separate
A trade-in vehicle never borrows the sold vehicle's VIN; a customer's licence never fills a dealer field. Blank means blank.
Two engines
The default engine is fast and economical; a premium engine is one header away when maximum field accuracy matters.
Private by design
Documents are processed in flight and never stored — only usage counts and timings are recorded against your account.
Simple plans, priced per document
No credit systems to decode — a document is a document, whichever engine reads it. Comparable tools charge around 7¢ a document; every Blueport plan comes in under 6.5¢.
Business
Matched spend against a leading credit-based PDF API on its equivalent business plan (their USD pricing converted at 0.65). Figures follow the plan and currency toggles above.
| Typical credit-based tool | Blueport Business | |
|---|---|---|
| Cost | ||
| Monthly price | US$44.99 ≈ A$69 | A$64.99 |
| 5-page documents included | ≈ 575 | 1,250+117% |
| Cost per 5-page document | ≈ 12¢ AUD | ≈ 5.2¢ AUD−57% |
| A 20-page file | ≈ 48¢ AUD | ≈ 21¢ AUD−56% |
| Pricing model | Credits — varies per operation | Documents — flat and predictable |
| Features | ||
| What comes back | Styled text fragments you still map | Finished semantic JSON entities{ "documentType": "TAX INVOICE", … } |
| Values | Strings — "$508.48" needs parsing | Real numbers, ISO dates, currency codes508.48 · "2026-08-12" · "AUD" |
| Entity grouping | None — you reassemble the fields | Supplier, customer, line items, totalssupplier · customer · lineItems · totals |
| Templates or zone setup | Layout-dependent results | None — any document, first call |
| Engine choice | One pipeline | Fast default + premium accuracy, per requestx-model: hkm | snm |
| Typical response | ~60s, async job + polling | 10–25s, one synchronous call |
| Document handling | Files uploaded and held temporarily | Processed in flight, never stored |
Based on the alternative's published per-page credit consumption for AI extraction and plan credit allowances, September 2026. Annual mode compares our discounted rate with the alternative's published monthly rate. Exchange rates vary.
A document includes up to 5 pages — longer files count one document per 5 pages, and premium-engine extractions count double. Billing is in AUD (+ GST for Australian customers); USD prices are a guide at current rates. Need more than 8,750 documents a month, or a proof of concept first? Get in touch — enterprise plans are priced to your volume.
Your first document in five minutes
If you can make an HTTP request, you're done. The guide covers Node.js, Salesforce Apex and a ready-made Postman collection.
curl -X POST https://pdf.blueport.io/pdf2json \ -H "x-api-key: YOUR_API_KEY" \ -H "content-type: application/pdf" \ --data-binary @invoice.pdf
Ready to integrate?
Everything you need is one click away — the full guide, a ready-made Postman collection, and your organisation's API key.