Convert bills of lading into structured JSON. BOL number, carrier, shipper and consignee, origin and destination ports, container and cargo details - typed and ready for your TMS or freight-audit workflow. Handles scanned and emailed BOLs.
Send the BOL and a schema. The routing, the parties, and every container and cargo line come back typed, ready for a TMS import or a customs filing.
curl -X POST \
https://api-parse.conversiontools.io/v1/extract \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "file=@bol.pdf" \
-F 'schema={
"bol_number": "string",
"booking_number": "string",
"carrier": "string",
"vessel": "string",
"voyage": "string",
"shipper": { "name": "string", "address": "string" },
"consignee": { "name": "string", "address": "string" },
"notify_party": "string",
"port_of_loading": "string",
"port_of_discharge": "string",
"freight_terms": "string",
"containers": [{
"number": "string",
"seal": "string",
"type": "string",
"weight_kg": "number"
}],
"cargo": [{
"description": "string",
"packages": "number",
"weight_kg": "number",
"volume_cbm": "number"
}]
}'{
"status": "completed",
"pages": 1,
"data": {
"bol_number": "MAEU-583920147",
"booking_number": "BK-2026-44102",
"carrier": "Maersk Line",
"vessel": "Maersk Sentosa",
"voyage": "612W",
"shipper": {
"name": "Northwind Supplies",
"address": "55 Dock St, Portland, OR"
},
"consignee": {
"name": "Globex Inc",
"address": "200 Harbor Rd, Rotterdam"
},
"notify_party": "Globex Customs Broker",
"port_of_loading": "Portland, OR",
"port_of_discharge": "Rotterdam, NL",
"freight_terms": "Prepaid",
"containers": [
{
"number": "MSKU7843219",
"seal": "SL884201",
"type": "40HC",
"weight_kg": 18250.0
}
],
"cargo": [
{
"description": "Steel brackets",
"packages": 240,
"weight_kg": 18250.0,
"volume_cbm": 58.4
}
]
}
}A BOL packs routing, parties, and cargo onto one dense page. The schema unpacks it.
Each container and cargo line comes back as its own object with number, seal, and weight, ready for a TMS or a customs filing.
Shipper, consignee, notify party, and the load and discharge ports are all captured structurally, not just as a block of address text.
Reads photographed, scanned, and emailed bills of lading with OCR applied automatically. No per-carrier template.
Yes. The API is schema-driven, so it works across ocean BOLs, air waybills, and inland BOLs - you describe the fields you need.
Yes. Define containers as an array in your schema and each container comes back as a separate object with its number, seal, type, and weight.
OCR is applied automatically, so scanned, faxed, and photographed BOLs are read without a separate pre-processing step.
Yes. The response is typed JSON that maps directly onto a TMS import or a freight-audit record, with no parsing layer in between.
Uploaded documents are deleted automatically within 24 hours. Extracted data is encrypted in transit and at rest and is never used to train models.
The same schema-driven API works across every document type. Define a schema once, extract from thousands of files.
Extract structured JSON from any document with custom schemas.
Parse any PDF into structured JSON, scanned or digital.
Vendor, line items, totals, tax, and dates from invoices.
Store, items, totals, and payment method from receipts.
PO number, vendor, buyer, and SKU-level line items.
Transactions, running balances, and dates for reconciliation.
Box-level data from W-2, 1099, and other tax forms.
Parties, dates, governing law, and key clauses.
Free tier covers your first 100 pages a month. No credit card to start.