Extract & Poll
Extraction is asynchronous. When you submit a document for extraction, Tracore creates a run and returns immediately with a 202 status and a run ID. You then poll the run until it reaches a terminal status.
Start extraction
const run = await client.extract("my-workspace", "invoice", {
documentId: "doc_abc123",
});
console.log(run.id); // "run_xyz789"
console.log(run.status); // "pending"
Auto-polling
Pass poll: true to have the SDK automatically poll until the run completes or fails:
const run = await client.extract("my-workspace", "invoice", {
documentId: "doc_abc123",
poll: true,
});
// Resolves only when the run reaches a terminal status
console.log(run.status); // "completed"
console.log(run.result); // extracted data
Custom poll options
Control the polling interval and timeout:
const run = await client.extract("my-workspace", "invoice", {
documentId: "doc_abc123",
poll: true,
pollIntervalMs: 2000, // check every 2 seconds (default: 1000)
pollTimeoutMs: 120000, // give up after 2 minutes (default: 60000)
});
Manual polling
If you prefer to control the polling loop yourself:
const run = await client.extract("my-workspace", "invoice", {
documentId: "doc_abc123",
});
let result = run;
while (result.status === "pending" || result.status === "processing") {
await new Promise((resolve) => setTimeout(resolve, 1000));
result = await client.runs.get(result.id);
}
if (result.status === "completed") {
console.log(result.result);
} else {
console.error("Extraction failed:", result.error);
}
Inline upload and extract
You can upload a file and start extraction in one request:
import { readFileSync } from "node:fs";
const file = new Blob([readFileSync("./invoice.pdf")], {
type: "application/pdf",
});
const run = await client.extract("my-workspace", "invoice", {
file,
fileName: "invoice.pdf",
poll: true,
});
Run statuses
| Status | Description |
|---|---|
pending | Run created, waiting to be picked up |
processing | Extraction in progress |
completed | Extraction finished successfully, results available |
failed | Extraction encountered an unrecoverable error |
validation_failed | Extraction completed but results did not match the schema |
Error handling
try {
const run = await client.extract("my-workspace", "invoice", {
documentId: "doc_abc123",
poll: true,
});
if (run.status === "completed") {
console.log(run.result);
} else if (run.status === "validation_failed") {
console.error("Validation failed:", run.error);
} else {
console.error("Extraction failed:", run.error);
}
} catch (error) {
// Network or timeout errors
console.error("Request failed:", error);
}