Saff API — Convert PDFs to Structured Data From Your Own Code

A REST API and signed webhooks for turning PDFs, scans and photographs into rows with the columns you define. Same per-document price as the app.

  • Last updated2026-10-09

How an integration works

  1. Define the table once

    Name the fields you want and their types. Every document submitted against that table comes back with those columns, in that order.

  2. Open a batch, upload the files

    Two calls. Both take an idempotency key, so a request that times out can be repeated safely instead of charging twice.

  3. Be told when it finishes

    A signed webhook carries identifiers and status — never extracted values, never document contents. You fetch what you need with the key you already hold.

  4. Read the rows

    JSON with the value, the confidence, the evidence it came from, and whether anyone has corrected it since.

What the API gives you that a conversion endpoint does not

Your columns, not the document's

Output is the table you defined. Two suppliers with different invoice layouts produce the same row shape, so nothing downstream has to branch per vendor.

Confidence and evidence

Every value says how sure the extraction is and which part of the page it came from, so your own code can route the doubtful ones to a person.

Idempotent writes

Every mutation takes an Idempotency-Key. Repeating a request returns the first result rather than acting twice — a timeout is safe to retry.

Scoped keys

A key carries only the permissions you grant and, if you want, only the tables you name. A read-only integration cannot submit or delete.

Also reachable from an AI assistant

Saff speaks MCP, so ChatGPT or Claude can read the tables you approve and answer questions about results you already have. That connection is read-only, spends nothing, and is separate from the API: the assistant can never submit, edit or export.

What it costs

The same per-document rate as the app, taken from the same prepaid wallet. There is no separate API plan, no per-seat charge and no minimum. API extraction uses wallet balance only; the free monthly documents are not consumed by it.

What it will not do

It does not promise accuracy. Values the extraction is unsure about come back flagged rather than guessed, and handwriting or very poor scans may return empty cells. An integration that posts straight into a ledger without checking the flags is using it wrongly.

It is not a PDF toolkit. There is no merging, splitting, signing or conversion to Word — it reads documents into fields and nothing else.

Where is the full reference?

Inside your workspace, under Integrations. It lists every endpoint, the permission each one needs, and request examples — and it is behind sign-in because it is written for somebody already holding a key.

Do you store the documents I send?

Originals are not retained after processing unless the workspace connects its own storage bucket. Extracted values and corrections are encrypted at rest and are never used to train any extraction system.

How do I verify a webhook really came from Saff?

Every delivery is signed. Verify the signature against the raw request body before parsing it, and reject anything older than five minutes. The reference carries a worked example.

What happens if a document fails?

You get a webhook saying so and the document is not charged. Failures are a status you can act on, not a silent gap in the output.

Build against it

Create an account, define a table, and issue a key from Integrations. The first documents are free and no card is needed to try it.