Migration Guides2026-02-09

Split Runs Migration

What You Get

  • Fully typed SDK responsessplitRun.output is typed, no more casting
  • Run without a splitter — Pass your split 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 Split

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

Listing Split Runs

Before
1const runs = await client.processorRun.list({ processorType: "SPLITTER", processorId: "dp_abc123" });
After
1const runs = await client.splitRuns.list({ splitterId: "spl_abc123" });

Endpoint Changes Summary

Old EndpointNew Endpoint
POST /processor_runs (type: SPLITTER)POST /split_runs
GET /processor_runs?processorType=SPLITTERGET /split_runs
GET /processor_runs/{id}GET /split_runs/{id}
DELETE /processor_runs/{id}DELETE /split_runs/{id}
POST /processor_runs/{id}/cancelPOST /split_runs/{id}/cancel

Request Changes

File Properties

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

Creating a Split Run

OldNewNotes
processorIdsplitter.idNested in object
versionsplitter.versionNested in object
config (with splitter)splitter.overrideConfigMoved inside splitter object. Top-level config is now only for inline splitting without a splitter
sync: true(removed)Use POST /split (sync, for testing), or createAndPoll() / webhooks for production
config.type: "SPLITTER"(removed)Implicit
config.parserparseConfigRenamed. Use config.parseConfig (inline) or splitter.overrideConfig.parseConfig (with splitter)

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

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

Example: Overriding Splitter Config

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

1{
2 "processorId": "dp_abc123",
3 "config": {
4 "splitClassifications": [
5 { "id": "invoice", "name": "Invoice", "description": "An invoice document" },
6 { "id": "receipt", "name": "Receipt", "description": "A receipt document" }
7 ],
8 "parser": { "type": "SIMPLE" }
9 },
10 "file": { "fileUrl": "https://example.com/packet.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.

OldNew
success: true(removed)
{ "splitRun": {...} }{...} (object returned directly)
processorRun.processorIdsplitRun.splitter.id
processorRun.files[]splitRun.file
processorRun.urlsplitRun.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 Splitter",
9 "type": "SPLITTER",
10 "status": "PROCESSED",
11 "output": {
12 "splits": [
13 {
14 "id": "invoice",
15 "type": "Invoice",
16 "fileId": "file_123",
17 "startPage": 1,
18 "endPage": 3
19 }
20 ]
21 },
22 "files": [{ "id": "file_456", "name": "packet.pdf" }],
23 "url": "https://dashboard.extend.ai/runs/dpr_abc123"
24 }
25}

SDK Method Reference

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

SplitRun Schema

PropertyOld (ProcessorRun)New (SplitRun)Change
object"document_processor_run""split_run"Value changed
idRequired stringRequired stringNo change
processorIdRequiredRemoved, see splitter.id
processorVersionIdRequiredRemoved, see splitterVersion.id
splitterRequired SplitterSummary | nullNew
splitterVersionRequired SplitterVersionSummary | nullNew
typeRequired "SPLITTER"Removed (implicit)
statusRequiredRequiredNo change
outputSplitterOutputSplitOutput | nullNow nullable
initialOutputOptionalRequired but nullableNow required
reviewedOutputOptionalRequired but nullableNow required
failureReasonOptionalRequired but nullableNow required
configSplitterConfigSplitConfigNo change
filesRequired File[]Removed
fileRequired FileSummaryNew
urlRequiredRenamed
dashboardUrlRequiredNew (replaces url)

SplitConfig Schema

PropertyOld (SplitterConfig)New (SplitConfig)Change
typeRequired "SPLITTER"Removed
baseProcessorOptionalOptionalNo change
splitClassificationsRequiredRequiredNo change
parserOptionalRenamed
parseConfigOptionalNew (replaces parser)

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.