Pull balance sheets, income statements, and cash flow statements out of annual and quarterly reports as structured JSON. Every line item keeps its section and both period columns stay separate, so a spreading model can consume the output directly.
Send the statement page and a schema. Each line comes back with its section label and its figures already split by period, so nothing downstream depends on reading a column header by eye.
curl -X POST \
https://api-parse.conversiontools.io/v1/extract \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "file=@annual-report.pdf" \
-F 'schema={
"company": "string",
"statement_type": "string",
"fiscal_period": "string",
"period_end": "date",
"currency": "string",
"units": "string",
"line_items": [{
"label": "string",
"section": "string",
"current_period": "number",
"prior_period": "number"
}],
"total_assets": "number",
"total_liabilities": "number",
"total_equity": "number",
"revenue": "number",
"net_income": "number"
}'{
"status": "completed",
"pages": 2,
"data": {
"company": "Halbrook Materials Inc.",
"statement_type": "balance_sheet",
"fiscal_period": "FY2025",
"period_end": "2025-12-31",
"currency": "USD",
"units": "thousands",
"line_items": [
{
"label": "Cash and cash equivalents",
"section": "current_assets",
"current_period": 184320,
"prior_period": 151806
},
{
"label": "Accounts receivable, net",
"section": "current_assets",
"current_period": 96455,
"prior_period": 88012
},
{
"label": "Property, plant and equipment, net",
"section": "non_current_assets",
"current_period": 411208,
"prior_period": 398765
},
{
"label": "Accounts payable",
"section": "current_liabilities",
"current_period": 64907,
"prior_period": 59320
}
],
"total_assets": 764123,
"total_liabilities": 302588,
"total_equity": 461535,
"revenue": null,
"net_income": null
}
}On a statement the period lives in the column header, and everything downstream depends on getting that mapping right.
Current and prior period are separate fields on every line item, so a figure never drifts into the wrong year when a filer swaps the column order or slips in a restated column.
Cash belongs under current assets, a lease obligation under non-current liabilities. Each line carries its section label, so a subtotal can be checked against the lines that actually make it up.
No two companies word their statements the same way. The schema decides the output shape, so a model built on one issuer does not fall over on the next one you load.
Yes, and on annual accounts filed under other regimes too. Extraction is schema-driven rather than form-specific, so an IFRS annual report and a quarterly interim statement are handled the same way, with the same request.
The period sits in the column header, and your schema is where you say what you want back. Ask for current_period and prior_period on each line item and the columns are separated for you. If a statement prints three or five years, add one field per column and name them however your model expects.
The units line is captured as its own field and figures come back as printed rather than silently rescaled, so the multiplier stays under your control. Accounting negatives written in parentheses are returned as negative numbers.
Yes. Submit the full document and poll for the result, or register a webhook and get called when it finishes. Long filings do not have to be split by hand, and a statement that runs across a page break stays one set of line items.
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.
Carrier, parties, ports, containers, and cargo.
Credit amounts matched back to the original invoice.
Payments split across invoices for cash application.
Meter readings, charges, and totals from any provider.
Vendor quotes in one shape so you can compare them.
Earnings, deductions, taxes, and year-to-date totals.
Experience, education, and skills from any CV layout.
Fields and MRZ from passports and ID cards.
Rent, term, deposits, and renewal deadlines.
Claim and policy numbers, dates, and claimed amounts.
Packages and SKU-level lines for receiving.
Ordered versus delivered quantities and sign-off.
Free tier covers your first 100 pages a month. No credit card to start.