> This page is for version v2026-02-09 (default).
> For other versions, use one of these documentation indexes:
> - v2026-02-09 (default): https://docs.extend.ai/2026-02-09/llms.txt
> - v2025-04-21: https://docs.extend.ai/2025-04-21/llms.txt
> - v2024-12-23: https://docs.extend.ai/2024-12-23/llms.txt

> ## Documentation Index
> Fetch the complete documentation index at: https://docs.extend.ai/llms.txt
> Use this file to discover all available pages before exploring further.
>
> ## API version
> The current API version is `2026-02-09`, served at the site root (no version prefix in URLs).
> If this page URL contains `/2025-04-21/` or `/2024-12-23/`, you are reading an older API version.
> Prefer the current docs at https://docs.extend.ai/llms.txt unless the user explicitly needs that older version.
> Do not treat older-version pages as the source of truth for new integrations.

# Classify Runs Migration

> Migrate from /processor_runs to /classify_runs

## What You Get

* **Fully typed SDK responses** — `classifyRun.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

> **Note**
>
> 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

#### TypeScript

**`Before (2025-04-21)`**

```typescript title="Before (2025-04-21)"
const run = await client.processorRun.create({
  processorId: "dp_abc123",
  file: { fileUrl: "https://example.com/doc.pdf" },
  sync: true
});
if (run.success) {
  console.log(run.processorRun.output);
}
```

**`After (2026-02-09)`**

```typescript title="After (2026-02-09)"
const result = await client.classify({
  classifier: { id: "cl_abc123" },
  file: { url: "https://example.com/doc.pdf" }
});
console.log(result.output?.type);  // Typed!

// Override a classifier's config (config moved inside classifier object)
const result = await client.classify({
  classifier: {
    id: "cl_abc123",
    overrideConfig: {
      classifications: [
        { id: "invoice", type: "invoice", description: "An invoice" },
        { id: "receipt", type: "receipt", description: "A receipt" }
      ]
    }
  },
  file: { url: "https://example.com/doc.pdf" }
});

// Or with inline config (no classifier needed)
const result = await client.classify({
  config: {
    classifications: [
      { id: "invoice", type: "invoice", description: "An invoice" },
      { id: "receipt", type: "receipt", description: "A receipt" }
    ]
  },
  file: { url: "https://example.com/doc.pdf" }
});
```

#### Python

**`Before (2025-04-21)`**

```python title="Before (2025-04-21)"
run = client.processor_run.create(
    processor_id="dp_abc123",
    file={"file_url": "https://example.com/doc.pdf"},
    sync=True
)
if run.success:
    print(run.processor_run.output)
```

**`After (2026-02-09)`**

```python title="After (2026-02-09)"
result = client.classify(
    classifier={"id": "cl_abc123"},
    file={"url": "https://example.com/doc.pdf"}
)
print(result.output.type)  # Typed!

# Override a classifier's config (config moved inside classifier object)
result = client.classify(
    classifier={
        "id": "cl_abc123",
        "override_config": {
            "classifications": [
                {"id": "invoice", "type": "invoice", "description": "An invoice"},
                {"id": "receipt", "type": "receipt", "description": "A receipt"}
            ]
        }
    },
    file={"url": "https://example.com/doc.pdf"}
)

# Or with inline config (no classifier needed)
result = client.classify(
    config={
        "classifications": [
            {"id": "invoice", "type": "invoice", "description": "An invoice"},
            {"id": "receipt", "type": "receipt", "description": "A receipt"}
        ]
    },
    file={"url": "https://example.com/doc.pdf"}
)
```

#### Java

**`After (2026-02-09)`**

```java title="After (2026-02-09)"
var result = client.classify(ClassifyRequest.builder()
    .file(ClassifyRequestFile.of(FileFromUrl.builder().url("https://example.com/doc.pdf").build()))
    .classifier(ClassifyRequestClassifier.builder().id("cl_abc123").build())
    .build());
result.getOutput().ifPresent(output -> System.out.println(output.getType()));
```

### Listing Classify Runs

#### TypeScript

**`Before`**

```typescript title="Before"
const runs = await client.processorRun.list({ processorType: "CLASSIFY", processorId: "dp_abc123" });
```

**`After`**

```typescript title="After"
const runs = await client.classifyRuns.list({ classifierId: "cl_abc123" });
```

#### Python

**`Before`**

```python title="Before"
runs = client.processor_run.list(processor_type="CLASSIFY", processor_id="dp_abc123")
```

**`After`**

```python title="After"
runs = client.classify_runs.list(classifier_id="cl_abc123")
```

#### Java

**`After`**

```java title="After"
var runs = client.classifyRuns().list(ClassifyRunsListRequest.builder()
    .classifierId("cl_abc123")
    .build());
```

---

## Endpoint Changes Summary

| Old Endpoint                                 | New Endpoint                      |
| -------------------------------------------- | --------------------------------- |
| `POST /processor_runs` (type: CLASSIFY)      | `POST /classify_runs`             |
| `GET /processor_runs?processorType=CLASSIFY` | `GET /classify_runs`              |
| `GET /processor_runs/{id}`                   | `GET /classify_runs/{id}`         |
| `DELETE /processor_runs/{id}`                | `DELETE /classify_runs/{id}`      |
| `POST /processor_runs/{id}/cancel`           | `POST /classify_runs/{id}/cancel` |

---

## Request Changes

### File Properties (All Endpoints)

| Old             | New         |
| --------------- | ----------- |
| `file.fileUrl`  | `file.url`  |
| `file.fileId`   | `file.id`   |
| `file.fileName` | `file.name` |
| `rawText`       | `file.text` |

### Creating a Classify Run

| Old                        | New                         | Notes                                                                                                             |
| -------------------------- | --------------------------- | ----------------------------------------------------------------------------------------------------------------- |
| `processorId`              | `classifier.id`             | Nested in object                                                                                                  |
| `version`                  | `classifier.version`        | Nested in object                                                                                                  |
| `config` (with classifier) | `classifier.overrideConfig` | **Moved 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.parser`            | `parseConfig`               | **Renamed.** Use `config.parseConfig` (inline) or `classifier.overrideConfig.parseConfig` (with classifier)       |

> **Warning**
>
> **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

**`Before (2025-04-21)`**

```json title="Before (2025-04-21)"
{
  "processorId": "dp_abc123",
  "version": "latest",
  "file": {
    "fileUrl": "https://example.com/document.pdf",
    "fileName": "document.pdf"
  },
  "sync": true
}
```

**`After (2026-02-09)`**

```json title="After (2026-02-09)"
{
  "classifier": {
    "id": "cl_abc123",
    "version": "latest"
  },
  "file": {
    "url": "https://example.com/document.pdf",
    "name": "document.pdf"
  }
}
```

### 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`:

**`Before (2025-04-21)`**

```json title="Before (2025-04-21)"
{
  "processorId": "dp_abc123",
  "config": {
    "classifications": [
      { "id": "invoice", "type": "invoice", "description": "An invoice" },
      { "id": "receipt", "type": "receipt", "description": "A receipt" }
    ],
    "parser": { "type": "SIMPLE" }
  },
  "file": { "fileUrl": "https://example.com/document.pdf" },
  "sync": true
}
```

**`After (2026-02-09)`**

```json title="After (2026-02-09)"
{
  "classifier": {
    "id": "cl_abc123",
    "overrideConfig": {
      "classifications": [
        { "id": "invoice", "type": "invoice", "description": "An invoice" },
        { "id": "receipt", "type": "receipt", "description": "A receipt" }
      ],
      "parseConfig": { "type": "SIMPLE" }
    }
  },
  "file": { "url": "https://example.com/document.pdf" }
}
```

---

## Response Changes

> **Note**
>
> **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](/api-reference/migrations/2026-02-09/overview#simplified-response-shapes) for details.

### Key Differences

| Old                               | New                                 |
| --------------------------------- | ----------------------------------- |
| `success: true`                   | *(removed)* — Use HTTP status codes |
| `{ "classifyRun": {...} }`        | `{...}` (object returned directly)  |
| `processorRun.processorId`        | `classifyRun.classifier.id`         |
| `processorRun.processorVersionId` | `classifyRun.classifierVersion.id`  |
| `processorRun.files[]`            | `classifyRun.file` (single object)  |
| `processorRun.url`                | `classifyRun.dashboardUrl`          |
| Optional fields                   | Required but nullable               |

### Example: Response

**`Before (2025-04-21)`**

```json title="Before (2025-04-21)"
{
  "success": true,
  "processorRun": {
    "object": "document_processor_run",
    "id": "dpr_abc123",
    "processorId": "dp_xyz789",
    "processorVersionId": "dpv_456",
    "processorName": "Doc Classifier",
    "type": "CLASSIFY",
    "status": "PROCESSED",
    "output": {
      "id": "invoice",
      "type": "invoice",
      "confidence": 0.95
    }
  }
}
```

**`After (2026-02-09)`**

```json title="After (2026-02-09)"
{
  "object": "classify_run",
  "id": "clr_abc123",
  "classifier": {
    "object": "classifier",
    "id": "cl_xyz789",
    "name": "Doc Classifier"
  },
  "classifierVersion": {
    "object": "classifier_version",
    "id": "clv_456",
    "version": "1.0"
  },
  "status": "PROCESSED",
  "output": {
    "id": "invoice",
    "type": "invoice",
    "confidence": 0.95
  },
  "failureReason": null,
  "reviewedOutput": null
}
```

---

## SDK Method Reference

| Old Method                     | New 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)* |

---

#### Detailed Schema Changes

### ClassifyRun Schema

| Property             | Old (ProcessorRun)         | New (ClassifyRun)                           | Change                              |
| -------------------- | -------------------------- | ------------------------------------------- | ----------------------------------- |
| `object`             | `"document_processor_run"` | `"classify_run"`                            | Value changed                       |
| `id`                 | Required `string`          | Required `string`                           | No change                           |
| `processorId`        | Required                   | —                                           | Removed, see `classifier.id`        |
| `processorVersionId` | Required                   | —                                           | Removed, see `classifierVersion.id` |
| `classifier`         | —                          | Required `ClassifierSummary \| null`        | New                                 |
| `classifierVersion`  | —                          | Required `ClassifierVersionSummary \| null` | New                                 |
| `type`               | Required `"CLASSIFY"`      | —                                           | Removed                             |
| `output`             | `ClassifierOutput`         | `ClassifyOutput \| null`                    | Now nullable                        |
| `initialOutput`      | Optional                   | Required but nullable                       | Now required                        |
| `reviewedOutput`     | Optional                   | Required but nullable                       | Now required                        |
| `failureReason`      | Optional                   | Required but nullable                       | Now required                        |
| `config`             | `ClassificationConfig`     | `ClassifyConfig`                            | No change                           |
| `files`              | Required array             | —                                           | Removed                             |
| `file`               | —                          | Required `FileSummary`                      | New                                 |
| `edits`              | Required                   | —                                           | Removed                             |
| `url`                | Required                   | —                                           | Renamed to `dashboardUrl`           |
| `dashboardUrl`       | —                          | Required                                    | New                                 |

### ClassifyConfig Schema

| Property          | Old (ClassificationConfig) | New (ClassifyConfig) | Change    |
| ----------------- | -------------------------- | -------------------- | --------- |
| `type`            | Required `"CLASSIFY"`      | —                    | Removed   |
| `baseProcessor`   | Optional                   | Optional             | No change |
| `classifications` | Required                   | Required             | No change |
| `parser`          | Optional                   | —                    | Renamed   |
| `parseConfig`     | —                          | Optional             | New       |

---

## Need Help?

If you encounter any issues while migrating, please contact our support team at [support@extend.app](mailto:support@extend.app).

---

## Migration Guides

| Guide                            | Migrating From           | Migrating To                            |
| -------------------------------- | ------------------------ | --------------------------------------- |
| [Overview](./overview)           | —                        | What's new and how to upgrade           |
| [Extract Runs](./extract)        | `/processor_runs`        | `/extract_runs` + `/extract`            |
| [Classify Runs](./classify)      | `/processor_runs`        | `/classify_runs` + `/classify`          |
| [Split Runs](./split)            | `/processor_runs`        | `/split_runs` + `/split`                |
| [Parse Runs](./parse)            | `/parse`, `/parse/async` | `/parse_runs` + `/parse`                |
| [Edit Runs](./edit)              | `/edit`, `/edit/async`   | `/edit_runs` + `/edit`                  |
| [Extractors](./extractors)       | `/processors`            | `/extractors`                           |
| [Classifiers](./classifiers)     | `/processors`            | `/classifiers`                          |
| [Splitters](./splitters)         | `/processors`            | `/splitters`                            |
| [Files](./files)                 | `/files`                 | `/files` (breaking changes)             |
| [Evaluation Sets](./evaluation)  | evaluation endpoints     | Updated evaluation endpoints            |
| [Workflow Runs](./workflow-runs) | `/workflow_runs`         | `/workflow_runs` (breaking changes)     |
| [Webhooks](./webhooks)           | `processor_run.*` events | `extract_run.*`, `classify_run.*`, etc. |