Docs/Get started/Quickstart
How-to5 min read

Quickstart

Mint a sandbox key, submit an invoice to a seeded pipeline, and read the extracted fields back — without leaving your terminal.

Before you start

You need a workspace. Signing up creates one, seeds a sample pipeline matched to your use case, and mints a sandbox key automatically.

1. Get your sandbox key

In the app, go to Admin → API keys and copy the key labelled Sandbox — default. New workspaces have one already. Keys are shown once at creation; if you have lost it, mint a new one and revoke the old.

bash
# keep it out of your shell history
export IDP_API_KEY="idpf_sandbox_••••••••••••••••"

2. Submit a document

A job is one submission to one pipeline. Post the file as multipart form data against the seeded std-invoice pipeline. The response returns immediately with a job id — processing is asynchronous.

bash
curl https://api.idpforge.ai/v1/jobs \
  -H "X-API-Key: $IDP_API_KEY" \
  -F "pipeline_id=std-invoice" \
  -F "file=@Globex-INV-4471.pdf"
python
from idpforge import Client

client = Client(api_key=os.environ["IDP_API_KEY"])

job = client.jobs.create(
    pipeline_id="std-invoice",
    file=open("Globex-INV-4471.pdf", "rb"),
)
print(job.id)  # job_8H2K3FQ
ts
import { IDPForge } from "@idpforge/sdk";

const idp = new IDPForge({ apiKey: process.env.IDP_API_KEY! });

const job = await idp.jobs.create({
  pipelineId: "std-invoice",
  file: fs.createReadStream("Globex-INV-4471.pdf"),
});
console.log(job.id); // job_8H2K3FQ
json
{
  "id": "job_8H2K3FQ",
  "status": "processing",
  "pipeline": { "id": "std-invoice", "name": "Standard Invoice → ERP" },
  "documents": 1,
  "created_at": "2026-07-29T06:12:44Z"
}

3. Read the result

Poll the job, or — better — subscribe to job.completed with a webhook. When the job finishes, each document carries its extracted fields with per-field confidence.

bash
curl https://api.idpforge.ai/v1/jobs/job_8H2K3FQ \
  -H "X-API-Key: $IDP_API_KEY"
python
job = client.jobs.retrieve("job_8H2K3FQ")
for doc in job.documents:
    print(doc.id, doc.status, doc.fields["total"].value)
ts
const job = await idp.jobs.retrieve("job_8H2K3FQ");
job.documents.forEach(d => console.log(d.id, d.status, d.fields.total.value));
json
{
  "id": "job_8H2K3FQ",
  "status": "completed",
  "documents": [{
    "id": "DOC-100245",
    "schema": "AP Invoice v3",
    "classes": [{ "code": "FIN.INV", "confidence": 0.94 }],
    "fields": {
      "invoice_number": { "value": "INV-4471", "confidence": 0.99 },
      "vendor":         { "value": "Globex",   "confidence": 0.97 },
      "total":          { "value": "1240.00",  "confidence": 0.61 }
    }
  }]
}
Low confidence does not mean wrong

Here total came back at 0.61. On a pipeline with review enabled, that field would raise a low_confidence exception and land in a work queue instead of being delivered silently. See Exceptions & human review.

Next steps

Was this page helpful?
Last updated 19 Aug 2026