Any table in → clean rows out

Table & Line Item
Extraction Software

Every row from every table, no matter how the document mangles it. Parsli extracts invoice line items, statement transactions, and PO tables into clean rows — delivered to Excel, Google Sheets, your accounting system, or JSON via API.

No credit card required · 10 free pages to start

Every row from every table

A document has two kinds of data. Header fields appear once per document — invoice number, vendor, date, total. Line items repeat: one row per product, service, transaction, or charge, each with its own quantity, unit price, and amount. The header tells you who and how much; the line items tell you what you're actually paying for.

Line item extraction is pulling those repeating rows out of a document's table into structured data — every row, every column, with types intact. It's the part most "data capture" tools skip: header-only extraction reads the total but not the ten rows behind it, which is why job costing, category coding, and spend analysis still end up done by hand. Parsli treats tables as first-class: you define the columns once, and every document yields its complete set of rows.

Built for tables that break OCR

Clean, bordered, single-page tables are a solved problem. Real documents are not clean. These are the table shapes that break conventional OCR-based extractors — and how Parsli's AI engine, which reads the page like a person instead of hunting for grid lines, handles each:

Multi-page and split tables

A 60-line invoice runs the table across three pages, repeating headers (or not) on each. Parsli follows the table across page breaks and returns one continuous set of rows — not three fragments with the totals row glued to the wrong page.

Borderless and free-form tables

Many documents align columns with nothing but whitespace — no grid lines for a table detector to find. Because the AI reads meaning rather than borders, a visually implied table extracts as reliably as a ruled one.

Merged cells and stacked columns

A description cell spanning several rows, a quantity-and-unit stacked in one column, a subtotal row wedged mid-table — layouts that shift OCR columns by one and corrupt every following row. Parsli assigns each value to the field it means, not the pixel column it sits in.

Nested multi-line items

Line items with sub-lines — a service row with itemized components, an item description that wraps four lines with serial numbers. Parsli keeps children with their parent row instead of promoting every text line to its own record.

Handwritten and scanned tables

Delivery logs, field tickets, and handwritten registers — rows a template tool can't even see. The same engine behind Parsli's handwriting-to-text work reads handwritten quantities and amounts into the same clean rows, and photographed or faxed tables get the same treatment via AI OCR.

How it works

1

Define your columns

Add a table field to your schema and name the columns — description, quantity, unit price, amount — with types. Plain English, no code, no zone drawing.

2

Send documents

Upload, forward by email, or POST via API. Any layout, any vendor, native PDF or phone photo — the same schema handles them all.

3

Rows land where you work

Every table row arrives as a structured record in Sheets, Excel, your accounting system, or a JSON array on the API response.

From rows to your systems

Extracted rows are only useful where you work. Parsli delivers tables as rows in Google Sheets (one row per line item, appended live) and as Excel/CSV downloads. Accounting teams post invoices with their full line items to QuickBooks, Xero, or ZohoBooks — the line-item depth is what makes real job, class, and category coding possible downstream. Zapier and Make fan rows out to thousands of other apps, and webhooks push the structured payload to your own system the moment extraction completes.

One setup, every future document

A converter is a one-off: upload a PDF, download a spreadsheet, repeat tomorrow. Table extraction software is a pipeline: you define the columns once, and every document that arrives from now on — by email, upload, or API — yields its rows automatically into the same destination.

That distinction is the whole ROI. If your team extracts tables from documents more than once a week, the converter workflow quietly becomes someone's recurring job: download, upload, fix, paste. A pipeline does the recurring part itself and only surfaces the exceptions — Parsli holds low-confidence rows for review rather than letting a misread quantity slide into your books.

For developers: tables as JSON arrays

On the API, a table field returns as a typed JSON array — one object per row, keys matching your schema. No cell coordinates, no reconstruction step: iterate the array and insert into your database. Webhook payloads carry the same structure for async processing. Endpoints and auth are in the docs.

Documents with tables we extract every day

Table extraction shows up wherever documents carry repeating rows:

  • Invoices — line items with quantity, unit price, and amount, the depth header-only capture skips.
  • Bank statements — every transaction row with date, description, debit, credit, and balance, exported ledger-ready.
  • Purchase orders — ordered items and quantities, structured for matching against the invoices that follow.
  • Receipts — itemized purchases, not just the total.

Code Example

Line items as a JSON array

Line items as a JSON array
const response = await fetch('https://api.parsli.co/v1/extract', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    parser_id: 'your_invoice_parser_id',
    file_url: 'https://example.com/invoice.pdf'
  })
});

const { data } = await response.json();
console.log(data.fields.line_items);
// [
//   { description: "Widget A", quantity: 10, unit_price: 100.00, amount: 1000.00 },
//   { description: "Widget B", quantity: 5,  unit_price: 50.00,  amount: 250.00 },
//   { description: "Rush shipping", quantity: 1, unit_price: 112.50, amount: 112.50 }
// ]
Start Free

No credit card required · 10 free pages to start

FAQ

Frequently asked questions

Can Parsli extract line items automatically?

Yes. Define a table field with your columns (description, quantity, unit price, amount) once, and every document you send — upload, email, or API — returns its complete set of line-item rows automatically. No per-vendor templates or zone drawing.

Does it handle tables that span multiple pages?

Yes. Parsli follows a table across page breaks — with or without repeated headers — and returns one continuous set of rows, so a 60-line invoice spread over three pages comes back as a single table.

Can I extract a table from a PDF to Excel or Google Sheets?

Yes. Rows can be downloaded as Excel/CSV or appended live to a Google Sheet — one row per line item, columns matching your schema. Unlike a one-off converter, the Sheets connection keeps filling as new documents arrive.

Does it work on scanned or handwritten tables?

Yes. The AI engine reads scanned, photographed, and handwritten tables — delivery logs, field tickets, handwritten registers — using the same models behind Parsli's handwriting-to-text and OCR capabilities, with confidence scores on every field.

What if every supplier's table looks different?

That's the normal case, and it's why Parsli doesn't use layout templates. The AI reads each table semantically — meaning, not position — so one schema handles every supplier's format, including new suppliers you've never processed before.

Can line items be exported to QuickBooks, Xero, or ZohoBooks?

Yes. Invoices post as bills with their full line items — description, quantity, unit price, amount per row — into QuickBooks Online, Xero, or ZohoBooks, with the source document attached.

What's the difference between header fields and line items?

Header fields appear once per document — invoice number, vendor, date, total. Line items are the repeating table rows — one per product, service, or transaction, each with its own columns. Header-only tools capture the total but not the rows behind it; Parsli extracts both.

Is there an API that returns tables as JSON?

Yes. A table field comes back as a typed JSON array — one object per row, keys matching your schema — on both the synchronous API response and webhook payloads. See /docs for endpoints and authentication.

Works with your stack

Route extracted data straight into the tools your team already uses.

Documents we parse

Document types this capability handles out of the box.

Stop rebuilding tables by hand

Define your columns once and let every future document deliver its own rows. 10 free pages on signup — no credit card required.

No credit card required · 10 free pages to start · Cancel anytime