How Ingestion Works: From Uploaded Filing to Verified Data
A walk through what happens between dropping a filing PDF into Rexfin and having its numbers ready to use: identity, classification, and a refusal to guess.
By The Rexfin team
Most finance tools treat ingestion as a solved problem: point a connector at your ERP, and rows show up. Rexfin’s ingestion starts somewhere different, because the input is a PDF (an annual report, a scanned statutory filing, a bilingual disclosure) nobody has cleaned up for you. Ingestion is the process of turning that document into data a model can trust, and it starts before a single number is read.
Step one: identity, not extraction
The first thing that happens to a filing is not extraction: it’s identity. Rexfin hashes the file’s raw bytes into a content-addressed ID. Upload the same PDF twice, by two people, on two days, and it resolves to the same ID rather than creating a duplicate. That ID paired with a page number becomes the citation address every other part of the product points back to. If a corrected or restated filing shows up later, that’s a different file with a different ID, linked to the original as a supersession, never an edit made in place.
Alongside the ID, ingestion records what the filing says about itself: currency, reporting scale, whether it’s audited, which accounting framework it claims, where it came from. None of that gets inferred downstream from context. It’s captured at the door, because a number’s scale and currency determine how verification later decides whether a total actually ties out.
Digital, scanned, or both, and refusal when it can’t tell
Not every filing has usable embedded text. Some are clean digital PDFs, some are fully scanned images with nothing machine-readable, and a growing number are mixed: a digital cover page in front of scanned statement faces, or an English section buried behind pages of Arabic disclosure. Ingestion checks which situation it’s looking at before deciding how to read a page, because reading a scanned page as if it were digital text produces garbage with a straight face.
Once that’s settled, ingestion locates each primary statement (balance sheet, income statement, cash flow, changes in equity) by matching headers and period banners, not by assuming a fixed page number that breaks the moment a filing’s layout shifts. When a page can’t be classified with real confidence, or a filing’s structure doesn’t match anything Rexfin recognizes, the file is quarantined rather than force-fit into a region: a scanned notes page that happens to mention “cash flow” in passing does not get glued onto the actual cash flow statement. The same fail-closed posture applies to picking the fiscal year: filings carry comparative years and predecessor-auditor dates that can look like the reporting year at a glance, so ingestion takes the latest plausible year-end rather than the first date on the cover.
One command, the same answer every time
Ingestion runs as a single batch job over a folder of source PDFs, never a background service quietly polling for work. Feed it a deal’s filings and it works through detection, extraction, classification, reconciliation, and packaging as one ordered sequence, then prints a plain result: which numbers are usable, which were held back, and why. Some steps depend on others having already run: reporting scale has to be known before figures get reconciled to printed totals, or a rounding difference gets mistaken for a real error, and that order is enforced, not left as a convention someone could skip.
It’s also reproducible: run the same filings through ingestion twice, with nothing changed, and you get the identical result, byte for byte. If a platform’s read of your annual report can drift between runs, you can’t tell whether a number changed because your business changed or because the tool changed its mind. And if a single filing in a batch is corrupted, it doesn’t take the rest down with it: that file gets isolated and flagged while the rest of the batch still completes.
Why the honesty matters more than the coverage
The instinct in most ingestion pipelines is to extract something rather than admit nothing. Rexfin’s default, when confidence isn’t there, is the opposite: quarantine rather than guess. That’s a deliberate trade: fewer numbers out of a genuinely ambiguous filing, but every number you do get has a page it came from. It’s also why ingestion sits underneath everything else in this pillar: it’s the reason the canonical atom store can hold one fact per figure instead of conflicting copies, and why deterministic math downstream is worth building: there’s no point computing precisely on a page that was misclassified in the first place.
Who this is for
Anyone who has watched a finance tool confidently extract a number from the wrong page, or mislabel a comparative column as this year’s actual. If your team needs “FY2024 revenue” to have actually come from the FY2024 income statement (not a note, not last year’s column relabeled, not an OCR artifact) ingestion is the layer doing that checking before you see the figure. See how it fits the rest of the platform at the pillar overview, or book a demo to watch a scanned, bilingual filing go through ingestion live.
Part of Inside the Rexfin Platform: How the Trust Machinery Works