Quickstart
Mint a sandbox key, submit an invoice to a seeded pipeline, and read the extracted fields back — without leaving your terminal.
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.
# 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.
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"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_8H2K3FQimport { 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{
"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.
curl https://api.idpforge.ai/v1/jobs/job_8H2K3FQ \
-H "X-API-Key: $IDP_API_KEY"job = client.jobs.retrieve("job_8H2K3FQ")
for doc in job.documents:
print(doc.id, doc.status, doc.fields["total"].value)const job = await idp.jobs.retrieve("job_8H2K3FQ");
job.documents.forEach(d => console.log(d.id, d.status, d.fields.total.value));{
"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 }
}
}]
}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.