OCR / Structify

PDFs and images, into schema-filled JSON.

Every field returns value, confidence and source.

Preview: opening to allowlisted organizations first

  • Confidence on every field

    Model, OCR and combined scores per field.

  • A source block on every field

    Page, block and bbox with every value.

  • Results become data

    Results land as rows you search again.

Schift runs the document pipeline

  1. Run it yourself: OCR vendor integration

    With Schift: One API key

  2. Run it yourself: Page splitting and concurrency

    With Schift: Parallel extraction, merged

  3. Run it yourself: Schema and citation checks

    With Schift: Real blocks as sources

  4. Run it yourself: 429 backoff and reprocessing

    With Schift: SDK retries built in

  5. Run it yourself: Result tables and load jobs

    With Schift: Rows, searchable right away

One API key to wire it up

npm install @schift-io/sdk

// npm install @schift-io/[email protected]
import { readFile } from "node:fs/promises";
import { StructifyClient } from "@schift-io/sdk/structify";

const client = new StructifyClient({
  apiKey: process.env.SCHIFT_API_KEY,
  gatewayUrl: "https://gw.schift.io",
});

const pdf = await readFile("invoice.pdf");
const ocr = await client.ocr(pdf, { contentType: "application/pdf" });

const result = await client.structify({
  schema: {
    type: "object",
    properties: {
      vendor: { type: ["string", "null"] },
      total: { type: ["number", "null"] },
    },
    required: ["vendor", "total"],
    additionalProperties: false,
  },
  ocr, // reuse the OCR result
});

const total = result.structured.fields.total;
const confidence = result.structured.field_confidence.total?.combined;
const evidence = result.structured.evidence.total;
curl https://gw.schift.io/v1/ocr \
  -H "Authorization: Bearer $SCHIFT_API_KEY" \
  -F "[email protected];type=application/pdf"

curl https://gw.schift.io/v1/structify \
  -H "Authorization: Bearer $SCHIFT_API_KEY" \
  -H "Content-Type: application/json" \
  -d @- <<EOF
{
  "schema": {
    "type": "object",
    "properties": {
      "vendor": { "type": ["string", "null"] },
      "total":  { "type": ["number", "null"] }
    },
    "required": ["vendor", "total"],
    "additionalProperties": false
  },
  "content_type": "application/pdf",
  "file_base64": "$(base64 < invoice.pdf | tr -d '\n')"
}
EOF

POST /v1/structify → 200

{
  "document_id": "…",
  "structured": {
    "fields": { "vendor": "Hanbit Trading", "total": 12000 },
    "field_confidence": {
      "total": {
        "model": 0.90, "ocr_min": 0.91, "combined": 0.90
      }
    },
    "evidence": {
      "total": [{ "page_no": 1, "block_indices": [4] }]
    }
  },
  "raw": { "pages": [ … ], "usage": { "pages": 1 } },
  "usage": { "input_tokens": …, "output_tokens": … }
}

Structify app

Quotes and purchase orders,
checked against the source.

Upload a document in the console. Structify organizes items and prices, you review them against the source, then save them as rows.

Start with a document

Included in Schift Context

Illustrative example, from source to a row for review
QuotationBolt M8, 120 units × ₩800
Item
Bolt M8
Quantity
120
Subtotal
₩96,000

01 / Source to review

The extracted value, beside its source.

Review the recognized text alongside its source region. Available region coordinates locate it on the original; recognition confidence appears when provided.

Recognition confidence describes text recognition. Check the source to verify the business details.

Try your own document

Upload → automatic structure → review against the source

Illustrative example, fictional quotation and recognized region
HANBIT PARTS2026.09.03

QUOTATION

Supplier, Hanbit Parts

Stainless steel bolt M8120 × ₩800
Subtotal₩96,000

VAT excluded, Valid for 14 days

1 / 1

Selected source region

Stainless steel bolt M8
120 × 800
Region
Page 1, line items
Recognition confidence
98% (example)
↖ Compare with the highlighted source region

When coordinates or confidence are absent, review the available source text.

02 / Recognized text to business fields

After recognition, give the result a useful shape.

Upload your document to recognize and structure its contents automatically. Review the source beside the result, then adjust the fields and values you need.

Try your own document

Upload → automatic structure → review against the source

Illustrative example, three ways to organize the same information

Fields and values KV

Supplier
Hanbit Parts
Subtotal
₩96,000

Your own fields

Item name
Bolt M8
Inspector
Needs review

Line-item table

ItemQty
Bolt M8120

Missing source values remain for review. Save the reviewed result to use it in tables and CSV.

Free every month, then pay per page

Pay only for the pages you process.

  • OCR pages

    Free every month100 pagesfree every month
    Pay as you go$0.02per page
    Monthly commit100K pages, $1,333/mo$0.0133/page
  • Structify extraction

    Free every month100 pagesfree every month
    Pay as you go+$0.015per page, With file upload, OCR included: $0.035 per page
Full price table (OCR / Structify)

Extraction with a source on every field

Based on each vendor's official docs.

SchiftLlamaExtractReductoAWS TextractMistral OCR
Per-field confidence, by defaultModel, OCR, combinedOpt-in, slows extractionWith citations onPer Queries answerPer OCR block
Per-field source location, by defaultPage, block, bboxOpt-in, slows extractionOpt-in, disables chunkingPer Queries answerNot in annotations docs
Your own JSON SchemaYour JSON Schema as isJSON Schema subsetSchema or promptNatural-language questionsJSON Schema
Free usage every monthOCR 100 pages + extraction 100 pages10,000 credits a monthFirst $150 of usageNew customers, 3 monthsNot on price page
Plain per-page priceOCR and extraction, per page1–45 credits by modePer 1,000 pagesPer page, by featurePer 1,000 pages
Sources (checked 2026-09-27)

FAQ

Can I use OCR on its own?

Yes. Reuse the result; pay extraction only.

How do I use the confidence scores?

Route only low-scoring fields to human review.

Does it handle large documents?

Above 25MB, documents run as async jobs.

How can I try it?

Request a demo and tell us about your documents and required fields. We will review the available scope and guide you through access.

Start with the next document you receive.

Review your documents and required fields with us.

SDKs and other document workflows