Migration Guides2026-02-09

Classify Runs Migration

What You Get

  • Fully typed SDK responsesclassifyRun.output is typed, no more casting
  • Run without a classifier — Pass your classifications inline with config
  • Cleaner request/response format — Simpler property names, predictable nullable fields
  • Better IDE experience — Autocomplete works out of the box

The old /processor_runs endpoint is still supported in this API version for backward compatibility. You can migrate incrementally.


Quick Start: Common Patterns

Running a Classification

Before (2025-04-21)
1const run = await client.processorRun.create({
2 processorId: "dp_abc123",
3 file: { fileUrl: "https://example.com/doc.pdf" },
4 sync: true
5});
6if (run.success) {
7 console.log(run.processorRun.output);
8}
After (2026-02-09)
1const result = await client.classify({
2 classifier: { id: "cl_abc123" },
3 file: { url: "https://example.com/doc.pdf" }
4});
5console.log(result.output?.type); // Typed!
6
7// Override a classifier's config (config moved inside classifier object)
8const result = await client.classify({
9 classifier: {
10 id: "cl_abc123",
11 overrideConfig: {
12 classifications: [
13 { id: "invoice", type: "invoice", description: "An invoice" },
14 { id: "receipt", type: "receipt", description: "A receipt" }
15 ]
16 }
17 },
18 file: { url: "https://example.com/doc.pdf" }
19});
20
21// Or with inline config (no classifier needed)
22const result = await client.classify({
23 config: {
24 classifications: [
25 { id: "invoice", type: "invoice", description: "An invoice" },
26 { id: "receipt", type: "receipt", description: "A receipt" }
27 ]
28 },
29 file: { url: "https://example.com/doc.pdf" }
30});

Listing Classify Runs

Before
1const runs = await client.processorRun.list({ processorType: "CLASSIFY", processorId: "dp_abc123" });
After
1const runs = await client.classifyRuns.list({ classifierId: "cl_abc123" });

Endpoint Changes Summary

Old EndpointNew Endpoint
POST /processor_runs (type: CLASSIFY)POST /classify_runs
GET /processor_runs?processorType=CLASSIFYGET /classify_runs
GET /processor_runs/{id}GET /classify_runs/{id}
DELETE /processor_runs/{id}DELETE /classify_runs/{id}
POST /processor_runs/{id}/cancelPOST /classify_runs/{id}/cancel

Request Changes

File Properties (All Endpoints)

OldNew
file.fileUrlfile.url
file.fileIdfile.id
file.fileNamefile.name
rawTextfile.text

Creating a Classify Run

OldNewNotes
processorIdclassifier.idNested in object
versionclassifier.versionNested in object
config (with classifier)classifier.overrideConfigMoved inside classifier object. Top-level config is now only for inline classification without a classifier
sync: true(removed)Use POST /classify (sync, for testing), or createAndPoll() / webhooks for production
config.type: "CLASSIFY"(removed)Implicit from endpoint
config.parserparseConfigRenamed. Use config.parseConfig (inline) or classifier.overrideConfig.parseConfig (with classifier)

Breaking change: If you previously passed config alongside a processorId to override classifier settings, you must now pass it as classifier.overrideConfig inside the classifier object. The top-level config property is reserved for inline classification (without a classifier).

Additionally, config.parser has been renamed to parseConfig everywhere — use config.parseConfig for inline config or classifier.overrideConfig.parseConfig when overriding a classifier.

Example: Create Request

1{
2 "processorId": "dp_abc123",
3 "version": "latest",
4 "file": {
5 "fileUrl": "https://example.com/document.pdf",
6 "fileName": "document.pdf"
7 },
8 "sync": true
9}

Example: Overriding Classifier Config

If you previously passed config alongside processorId to override the classifier’s settings, this now moves inside the classifier object as overrideConfig:

1{
2 "processorId": "dp_abc123",
3 "config": {
4 "classifications": [
5 { "id": "invoice", "type": "invoice", "description": "An invoice" },
6 { "id": "receipt", "type": "receipt", "description": "A receipt" }
7 ],
8 "parser": { "type": "SIMPLE" }
9 },
10 "file": { "fileUrl": "https://example.com/document.pdf" },
11 "sync": true
12}

Response Changes

Response shape changes: Single object responses are now returned directly (no wrapper key), and list responses use { "object": "list", "data": [...] } format. See Simplified Response Shapes for details.

Key Differences

OldNew
success: true(removed) — Use HTTP status codes
{ "classifyRun": {...} }{...} (object returned directly)
processorRun.processorIdclassifyRun.classifier.id
processorRun.processorVersionIdclassifyRun.classifierVersion.id
processorRun.files[]classifyRun.file (single object)
processorRun.urlclassifyRun.dashboardUrl
Optional fieldsRequired but nullable

Example: Response

1{
2 "success": true,
3 "processorRun": {
4 "object": "document_processor_run",
5 "id": "dpr_abc123",
6 "processorId": "dp_xyz789",
7 "processorVersionId": "dpv_456",
8 "processorName": "Doc Classifier",
9 "type": "CLASSIFY",
10 "status": "PROCESSED",
11 "output": {
12 "id": "invoice",
13 "type": "invoice",
14 "confidence": 0.95
15 }
16 }
17}

SDK Method Reference

Old MethodNew Method
client.processorRun.create()client.classifyRuns.create()
client.processorRun.get()client.classifyRuns.retrieve()
client.processorRun.list()client.classifyRuns.list()
client.processorRun.delete()client.classifyRuns.delete()
client.processorRun.cancel()client.classifyRuns.cancel()
client.classify() (new sync endpoint)
client.classifyRuns.createAndPoll() (new)

ClassifyRun Schema

PropertyOld (ProcessorRun)New (ClassifyRun)Change
object"document_processor_run""classify_run"Value changed
idRequired stringRequired stringNo change
processorIdRequiredRemoved, see classifier.id
processorVersionIdRequiredRemoved, see classifierVersion.id
classifierRequired ClassifierSummary | nullNew
classifierVersionRequired ClassifierVersionSummary | nullNew
typeRequired "CLASSIFY"Removed
outputClassifierOutputClassifyOutput | nullNow nullable
initialOutputOptionalRequired but nullableNow required
reviewedOutputOptionalRequired but nullableNow required
failureReasonOptionalRequired but nullableNow required
configClassificationConfigClassifyConfigNo change
filesRequired arrayRemoved
fileRequired FileSummaryNew
editsRequiredRemoved
urlRequiredRenamed to dashboardUrl
dashboardUrlRequiredNew

ClassifyConfig Schema

PropertyOld (ClassificationConfig)New (ClassifyConfig)Change
typeRequired "CLASSIFY"Removed
baseProcessorOptionalOptionalNo change
classificationsRequiredRequiredNo change
parserOptionalRenamed
parseConfigOptionalNew

Need Help?

If you encounter any issues while migrating, please contact our support team at support@extend.app.


Migration Guides

GuideMigrating FromMigrating To
OverviewWhat’s new and how to upgrade
Extract Runs/processor_runs/extract_runs + /extract
Classify Runs/processor_runs/classify_runs + /classify
Split Runs/processor_runs/split_runs + /split
Parse Runs/parse, /parse/async/parse_runs + /parse
Edit Runs/edit, /edit/async/edit_runs + /edit
Extractors/processors/extractors
Classifiers/processors/classifiers
Splitters/processors/splitters
Files/files/files (breaking changes)
Evaluation Setsevaluation endpointsUpdated evaluation endpoints
Workflow Runs/workflow_runs/workflow_runs (breaking changes)
Webhooksprocessor_run.* eventsextract_run.*, classify_run.*, etc.