
Security News
Ruby's Bundler 4.0.18 Extends Cooldown to bundle lock and bundle cache
The supply chain control that delays freshly published gems now covers lockfile generation and gem vendoring in Ruby projects.
@suparse/sdk
Advanced tools
Official JavaScript and TypeScript SDK for the Suparse Document Processing API.
Suparse is an AI-powered document processing API for extracting structured data from any document type, including invoices, receipts, bank statements, purchase orders and many more.
fetch, Blob, and FormDatanpm install @suparse/sdk
You'll need an API key to use the SDK. To obtain one:
Set it as an environment variable when using the Node client:
export SUPARSE_API_KEY="your_api_key_here"
Or pass it directly to the SDK constructor:
import { SuparseNodeClient } from "@suparse/sdk/node";
const client = new SuparseNodeClient({ apiKey: "your_api_key_here" });
// Node.js SDK, with SUPARSE_API_KEY set
import { SuparseNodeClient } from "@suparse/sdk/node";
const client = new SuparseNodeClient();
try {
const result = await client.extract("invoice.pdf");
for (const item of result.succeeded) {
console.log(item.original_file);
console.log(item.documents.map((doc) => doc.extracted_data));
}
} finally {
await client.close();
}
// Browser or edge runtime
import { SuparseClient } from "@suparse/sdk";
const client = new SuparseClient({ apiKey: "your_api_key_here" });
const file = new File([fileBytes], "invoice.pdf", { type: "application/pdf" });
const result = await client.extract(file);
console.log(result.succeeded);
The SDK exports two clients:
SuparseClient from @suparse/sdk: browser/edge-compatible client for Blob, File, and URL inputsSuparseNodeClient from @suparse/sdk/node: Node.js client with file paths, folder processing, and disk output helpersBoth clients handle uploads, polling, exports, retries, rate limits, and parallel batch processing. Batch extraction runs up to 10 files concurrently.
Use @suparse/sdk/node for local files and server-side applications.
import { SuparseNodeClient } from "@suparse/sdk/node";
const client = new SuparseNodeClient();
try {
const result = await client.extract(["invoice1.pdf", "invoice2.pdf"]);
for (const item of result.succeeded) {
console.log(item.original_file);
console.log(item.documents.map((doc) => doc.extracted_data));
}
for (const failed of result.failed) {
console.error(failed.file, failed.error);
}
} finally {
await client.close();
}
The Node client reads SUPARSE_API_KEY and SUPARSE_API_URL from environment variables by default, so you can use new SuparseNodeClient() if those are set. Pass apiKey and baseUrl directly when you do not want to use environment variables.
Use @suparse/sdk for runtimes without Node.js file-system APIs.
import { SuparseClient } from "@suparse/sdk";
const client = new SuparseClient({ apiKey: "your_api_key_here" });
const result = await client.extract(fileInput.files![0], {
split: true,
});
for (const item of result.succeeded) {
console.log(item.documents.map((doc) => doc.extracted_data));
}
You can also pass a URL; the SDK fetches it and uploads the response body:
const result = await client.extract(new URL("https://example.com/invoice.pdf"));
extract() is the primary SDK API.
import { SuparseNodeClient } from "@suparse/sdk/node";
const client = new SuparseNodeClient();
const result = await client.extract("invoice.pdf", {
template_id: "276a0aa8-84bc-4491-a2e7-1ea13381790c",
split: true,
cleanup: true,
onProgress: (item) => {
if ("file" in item) {
console.error(`Failed: ${item.file} - ${item.error}`);
} else {
console.log(`Done: ${item.original_file}`);
}
},
});
SuparseNodeClient accepts a single file path, an array of file paths, Blob/File objects, URL objects, or an array mixing those input types.
const result = await client.extract(["receipts/jan.pdf", "receipts/feb.pdf"]);
for (const item of result.succeeded) {
console.log(item.original_file, item.documents);
}
for (const failed of result.failed) {
console.error(failed.file, failed.error);
}
console.log(`Total: ${result.total}`);
import { SuparseClient } from "@suparse/sdk";
const client = new SuparseClient({ apiKey: "your_api_key_here" });
const files = Array.from(fileInput.files ?? []);
const result = await client.extract(files, {
split: false,
auto_approve: true,
});
SuparseClient accepts Blob, File, and URL inputs. Use SuparseNodeClient when you need local file paths or disk output helpers.
extractFolder() is available from SuparseNodeClient. It scans a directory for supported files and delegates to extract().
import { SuparseNodeClient } from "@suparse/sdk/node";
const client = new SuparseNodeClient();
const result = await client.extractFolder("./receipts/", {
template_id: "276a0aa8-84bc-4491-a2e7-1ea13381790c",
split: true,
cleanup: true,
});
for (const item of result.succeeded) {
console.log(item.original_file, item.documents);
}
extractFolder() scans the immediate directory only, filters to supported extensions, sorts the files by name, and returns an empty BatchResult when no supported files are found.
Each successful item is a TaskExport. Its documents array contains the extracted document records and parsed fields:
for (const item of result.succeeded) {
console.log(item.task_id);
console.log(item.original_file);
for (const document of item.documents) {
console.log(document.document_id);
console.log(document.template_id);
console.log(document.page_start, document.page_end);
console.log(document.credits_used);
console.log(document.extracted_data);
}
}
For single-page documents, documents usually has one entry. When split is enabled, a single uploaded PDF can produce multiple document entries with their own page ranges and template IDs.
Use the low-level methods when you need direct control over upload, polling, export, and deletion.
import { SuparseNodeClient } from "@suparse/sdk/node";
const client = new SuparseNodeClient();
// Upload a file and get back a task ID
const taskId = await client.uploadFile("invoice.pdf", {
template_id: "276a0aa8-84bc-4491-a2e7-1ea13381790c",
split: false,
auto_approve: true,
});
// Poll until processing completes
const { status, documentIds } = await client.pollTaskStatus(taskId);
// Fetch results in memory
const exportsJson = await client.fetchResults(documentIds);
// Or write results to disk
await client.downloadResults(documentIds, "output.json");
// Delete documents by ID
await client.deleteDocuments(["550e8400-e29b-41d4-a716-446655440000"]);
// List available templates
const templates = await client.listTemplates();
for (const template of templates) {
console.log(`${template.name} (${template.template_language})`);
}
// Include system templates too
const allTemplates = await client.listTemplates({ includeSystem: true });
Browser and edge runtimes can use uploadFromSource() instead of uploadFile():
import { SuparseClient } from "@suparse/sdk";
const client = new SuparseClient({ apiKey: "your_api_key_here" });
const taskId = await client.uploadFromSource(fileInput.files![0], {
split: true,
auto_approve: true,
});
const { documentIds } = await client.pollTaskStatus(taskId);
const exportsJson = await client.fetchResults(documentIds);
SuparseNodeClient also exposes convenience methods for file-based workflows:
import { SuparseNodeClient } from "@suparse/sdk/node";
const client = new SuparseNodeClient();
// Process one document and write the JSON export to disk.
await client.processDocument("invoice.pdf", "results.json", {
template_id: "276a0aa8-84bc-4491-a2e7-1ea13381790c",
split: false,
cleanup: true,
});
// Process multiple files and receive raw task/document IDs.
const { succeeded, failed } = await client.processBatch(["a.pdf", "b.pdf"], {
template_id: "276a0aa8-84bc-4491-a2e7-1ea13381790c",
split: true,
});
for (const item of succeeded) {
console.log(item.filePath, item.taskId, item.documentIds);
}
for (const item of failed) {
console.error(item.filePath, item.taskId, item.error);
}
All SDK exceptions inherit from SuparseError.
import {
SuparseNodeClient,
SuparseError,
SuparseAuthError,
SuparseNetworkError,
SuparsePollingTimeoutError,
} from "@suparse/sdk/node";
const client = new SuparseNodeClient({ apiKey: "your_api_key_here" });
try {
const result = await client.extract("invoice.pdf");
console.log(result.succeeded);
} catch (error) {
if (error instanceof SuparseAuthError) {
console.error("Invalid API key");
} else if (error instanceof SuparseNetworkError) {
console.error("Connection failed");
} else if (error instanceof SuparsePollingTimeoutError) {
console.error("Processing timed out");
} else if (error instanceof SuparseError) {
console.error(`Unexpected Suparse error: ${error.message}`);
} else {
throw error;
}
}
For batch operations, check result.failed to handle per-file errors without catching exceptions:
const result = await client.extract(["a.pdf", "b.pdf", "c.pdf"]);
for (const item of result.succeeded) {
console.log(`OK: ${item.original_file} -> ${item.documents.map((doc) => doc.document_id)}`);
}
for (const failed of result.failed) {
console.error(`FAIL: ${failed.file} -> ${failed.error}`);
}
SuparseClient requires apiKey directly. SuparseNodeClient can read apiKey and baseUrl from environment variables.
| Parameter | Type | Default | Description |
|---|---|---|---|
apiKey | string | SUPARSE_API_KEY in SuparseNodeClient only | Your API key |
baseUrl | string | SUPARSE_API_URL env var or https://api.suparse.com/api/v1 | API base URL |
timeoutMs | number | 60000 | Request timeout in milliseconds |
maxRetries | number | 3 | Max retry attempts for retryable network/API errors |
pollInterval | number | 5 | Initial seconds between polling attempts |
maxPollAttempts | number | 300 | Max polling attempts before timeout |
Polling uses exponential backoff starting from pollInterval seconds and caps the delay at 15 seconds. maxPollAttempts limits the total number of poll attempts before SuparsePollingTimeoutError is thrown.
| Object | Properties | Description |
|---|---|---|
TaskExport | task_id, original_file, total_documents_extracted, documents | Successfully extracted file |
DocumentExport | document_id, file_name, page_start, page_end, template_id, credits_used, extracted_data | Extracted document and parsed fields |
FailedResult | file, error | File that failed during extraction |
BatchResult | succeeded, failed, total | Container for batch results |
All exceptions inherit from SuparseError.
| Exception | Raised When |
|---|---|
SuparseError | Base exception for all SDK errors |
SuparseNetworkError | Network connection fails or times out |
SuparsePollingTimeoutError | Polling exceeds maxPollAttempts |
SuparseProcessingError | Document fails to process on the server |
SuparseAPIError | Base for HTTP error responses; has statusCode and responseBody |
SuparseAuthError | 401/403 authentication or authorization error |
SuparseNotFoundError | 404 resource not found |
SuparseRateLimitError | 429 too many requests |
SuparseServerError | 5xx server error |
SuparseSDKError | SDK fails to parse or handle the expected API response |
extract() Parameters| Parameter | Type | Default | Description |
|---|---|---|---|
files | Node: string, Blob, File, URL, or array; browser/edge: Blob, File, URL, or array | required | One or more files to process |
template_id | string | undefined | Template ID (auto-detect if omitted) |
split | boolean | false | Auto-split multi-page documents |
auto_approve | boolean | true | Set to false to require human review in the Suparse UI |
cleanup | boolean | false | Delete documents from server after extraction |
onProgress | (result) => void | undefined | Called with each TaskExport or FailedResult as it completes |
cleanup deletes the uploaded parent task documents after results have been fetched. Deleting a parent document also deletes its child documents server-side.
extractFolder() ParametersextractFolder() is available only in @suparse/sdk/node.
| Parameter | Type | Default | Description |
|---|---|---|---|
folder | string | required | Directory to scan |
pattern | string | currently reserved | Present in the options type; current implementation scans supported files in the directory |
template_id | string | undefined | Template ID (auto-detect if omitted) |
split | boolean | false | Auto-split multi-page documents |
auto_approve | boolean | true | Set to false to require human review in the Suparse UI |
cleanup | boolean | false | Delete documents from server after extraction |
onProgress | (result) => void | undefined | Called with each result as it completes |
| Extension | MIME Type |
|---|---|
.pdf | application/pdf |
.jpg, .jpeg | image/jpeg |
.png | image/png |
.heic | image/heic |
.heif | image/heif |
The companion CLI is published as suparse:
npm install -g suparse
suparse process invoice.pdf -o results.json
Full API documentation is available at suparse.com/docs.
FAQs
Official TypeScript SDK for the Suparse Document Processing API
The npm package @suparse/sdk receives a total of 3 weekly downloads. As such, @suparse/sdk popularity was classified as not popular.
We found that @suparse/sdk demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
The supply chain control that delays freshly published gems now covers lockfile generation and gem vendoring in Ruby projects.

Security News
During a UK cyber test, a Mythos 5 agent used sockpuppets, social engineering, and prompt injection to try to get a maintainer to merge malware.

Company News
Socket is now in the AWS Security Hub Extended plan. Adopt it through AWS, apply committed spend, and block malicious open source packages.