Everything you need to read a document with us.
What the engine takes, what it hands back, how you connect to it, and how your documents are handled — written down rather than promised.
Getting it into what you already run
Sonar is a read, not a destination. The result belongs in your systems, so everything here exists to get it there without a person in the middle.
Schema-validated JSON
Every read comes back against a schema, so the shape of the response is a contract rather than a surprise. If a field is in the schema, it is in the payload — with a value, or with a flag saying the engine could not read it.
A documented REST API
Authenticate, post documents, get structured records. Up to 200 documents in a single call, with a sub-second median read.
Signed webhooks
Long jobs do not need polling. We sign the callback, you verify it, and the result lands in your system the moment it is ready.
Native connectors
The output goes into the ATS, CRM, or warehouse you already run. There is no export step, no CSV in the middle, and nothing for your team to re-key.
Custom builds
If the shape of your workflow does not fit Capture, Spend or Govern, we build the one that does — same engine, engineered and supported by us.
Hand it the document as it actually arrives
Not the clean version you wish you had. The scan, the photo, the export nobody can open.
PDF and DOCX
The everyday cases: exports, generated documents, and the master agreement someone sent as a Word file with tracked changes still in it.
Images and scans
Scanned paper goes through OCR before the read, so a document that was never digital to begin with is still a document.
Photographed on a phone
A page held under a desk lamp and shot at an angle. It is how a lot of documents actually arrive, so it is a first-class input, not an edge case.
Writing code against a score
Every field comes back with a confidence, which means your integration gets to make a decision rather than a leap of faith.
The score is per field, not per document
One number for the whole file would tell you nothing useful. A licence number you can act on and an expiry date the engine squinted at are two different facts, and they arrive as two different scores.
Route on it, don't just display it
Pick a threshold and let the score do the triage: auto-accept above it, queue the rest for a human. That single branch is the difference between a pipeline that runs unattended and one that someone checks by hand.
A flagged field is not an error
It is a value the engine declined to invent. Your code should expect it, and treat it as work routed to a person — not as a failed call to retry.
The rest of it lives elsewhere
Rather than say the same things again in different words, here is where each answer actually is.
How your documents are handled
TLS, private workspaces, role-based access and SSO, with the full privacy terms.
Why it scores itself
The one opinion the engine holds, and the four numbers behind it.
Everything else
A security questionnaire, a schema to match, a document type you do not see here.
Anything this page did not answer, a person will.
A security questionnaire, a schema you need matched, a document type you do not see covered here. Tell us what you are trying to read and we will tell you plainly whether we can read it.