> 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.

# Extractors Migration

> Migrate from /processors to /extractors for extractor management

## What You Get

* **Dedicated `/extractors` endpoints** — No more `type: "EXTRACT"` filters, cleaner API surface
* **New `GET /extractors/{id}` endpoint** — Retrieve a single extractor with its draft version (not available in old API)
* **Typed SDK responses** — `extractor` objects are typed, no casting needed
* **Simpler config** — No more `type` field required in config

> **Note**
>
> The old `/processors` endpoint is still supported in this API version for backward compatibility. You can migrate incrementally.

---

## Quick Start: Common Patterns

### Creating an Extractor

#### TypeScript

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

```typescript title="Before (2025-04-21)"
const processor = await client.processor.create({
  name: "Invoice Extractor",
  type: "EXTRACT",
  config: { type: "EXTRACT", baseProcessor: "extraction_performance", schema: {...} }
});
console.log(processor.processor.id);
```

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

```typescript title="After (2026-02-09)"
const extractor = await client.extractors.create({
  name: "Invoice Extractor",
  config: { baseProcessor: "extraction_performance", schema: {...} }
});
console.log(extractor.id);
```

#### Python

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

```python title="Before (2025-04-21)"
processor = client.processor.create(
    name="Invoice Extractor",
    type="EXTRACT",
    config={"type": "EXTRACT", "base_processor": "extraction_performance", "schema": {...}}
)
print(processor.processor.id)
```

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

```python title="After (2026-02-09)"
extractor = client.extractors.create(
    name="Invoice Extractor",
    config={"base_processor": "extraction_performance", "schema": {...}}
)
print(extractor.id)
```

#### Java

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

```java title="After (2026-02-09)"
var extractor = client.extractors().create(ExtractorsCreateRequest.builder()
    .name("Invoice Extractor")
    .config(ExtractConfigJson.builder()
        .baseProcessor(ExtractBaseProcessor.EXTRACTION_PERFORMANCE)
        .schema(schema)
        .build())
    .build());
System.out.println(extractor.getId());
```

### Retrieving an Extractor (New!)

#### TypeScript

```typescript
const extractor = await client.extractors.retrieve("ex_abc123");
console.log(extractor.draftVersion.config);
```

#### Python

```python
extractor = client.extractors.retrieve("ex_abc123")
print(extractor.draft_version.config)
```

#### Java

```java
var extractor = client.extractors().retrieve("ex_abc123");
System.out.println(extractor.getDraftVersion().getConfig());
```

### Listing Extractors

#### TypeScript

**`Before`**

```typescript title="Before"
const processors = await client.processor.list({ type: "EXTRACT" });
```

**`After`**

```typescript title="After"
const extractors = await client.extractors.list();
```

#### Python

**`Before`**

```python title="Before"
processors = client.processor.list(type="EXTRACT")
```

**`After`**

```python title="After"
extractors = client.extractors.list()
```

#### Java

**`After`**

```java title="After"
var extractors = client.extractors().list();
```

### Publishing a Version

#### TypeScript

**`Before`**

```typescript title="Before"
const version = await client.processorVersion.create("dp_abc123", { releaseType: "minor" });
```

**`After`**

```typescript title="After"
const version = await client.extractorVersions.create("ex_abc123", { releaseType: "minor" });
```

#### Python

**`Before`**

```python title="Before"
version = client.processor_version.create("dp_abc123", release_type="minor")
```

**`After`**

```python title="After"
version = client.extractor_versions.create("ex_abc123", release_type="minor")
```

#### Java

**`After`**

```java title="After"
var version = client.extractorVersions().create("ex_abc123",
    ExtractorVersionsCreateRequest.builder().releaseType(ReleaseType.MINOR).build());
```

---

## Endpoint Changes Summary

| Old Endpoint                                | New Endpoint                                         |
| ------------------------------------------- | ---------------------------------------------------- |
| `POST /processors` (type: EXTRACT)          | `POST /extractors`                                   |
| `GET /processors?type=EXTRACT`              | `GET /extractors`                                    |
| *(not available)*                           | `GET /extractors/{id}` **(new!)**                    |
| `POST /processors/{id}`                     | `POST /extractors/{id}`                              |
| `POST /processors/{id}/publish`             | `POST /extractors/{extractorId}/versions`            |
| `GET /processors/{id}/versions`             | `GET /extractors/{extractorId}/versions`             |
| `GET /processors/{id}/versions/{versionId}` | `GET /extractors/{extractorId}/versions/{versionId}` |

---

## Request Changes

### Creating an Extractor

| Old                      | New                    | Notes                  |
| ------------------------ | ---------------------- | ---------------------- |
| `type: "EXTRACT"`        | *(removed)*            | Implicit from endpoint |
| `cloneProcessorId`       | `cloneExtractorId`     | Renamed                |
| `config.type: "EXTRACT"` | *(removed)*            | Implicit from endpoint |
| `config.parser`          | `config.parseConfig`   | Renamed                |
| `config.baseProcessor`   | `config.baseProcessor` | No change (optional)   |
| `config.schema`          | `config.schema`        | Now **required**       |
| `config.fields`          | *(removed)*            | Use `schema` instead   |

> **Warning**
>
> **`cloneExtractorId` and `config` are mutually exclusive.** You can either clone an existing extractor or provide a config, but not both. The API will return a validation error if both are provided.

### Example: Create Request

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

```json title="Before (2025-04-21)"
{
  "name": "Invoice Extractor",
  "type": "EXTRACT",
  "config": {
    "type": "EXTRACT",
    "baseProcessor": "extraction_performance",
    "schema": {
      "type": "object",
      "properties": {
        "vendorName": { "type": ["string", "null"] }
      }
    },
    "parser": { "target": "markdown" }
  }
}
```

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

```json title="After (2026-02-09)"
{
  "name": "Invoice Extractor",
  "config": {
    "baseProcessor": "extraction_performance",
    "schema": {
      "type": "object",
      "properties": {
        "vendorName": { "type": ["string", "null"] }
      }
    },
    "parseConfig": { "target": "markdown" }
  }
}
```

---

## 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  |
| `{ "extractor": {...} }`     | `{...}` (object returned directly)   |
| `processors`                 | `extractors`                         |
| `processorVersion`           | `extractorVersion`                   |
| `versions`                   | `extractorVersions`                  |
| `processor.type: "EXTRACT"`  | *(removed)* — Implicit from endpoint |
| `draftVersion.processorId`   | `draftVersion.extractorId`           |
| `draftVersion.processorType` | *(removed)*                          |
| `draftVersion.processorName` | *(removed)*                          |
| `draftVersion.updatedAt`     | *(removed)*                          |
| List includes `versions[]`   | *(removed)* — Use versions endpoint  |

### Example: Response

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

```json title="Before (2025-04-21)"
{
  "success": true,
  "processor": {
    "object": "document_processor",
    "id": "dp_abc123",
    "name": "Invoice Extractor",
    "type": "EXTRACT",
    "draftVersion": {
      "object": "document_processor_version",
      "id": "dpv_xyz789",
      "processorId": "dp_abc123",
      "processorName": "Invoice Extractor",
      "processorType": "EXTRACT",
      "version": "draft",
      "config": { ... },
      "createdAt": "2024-03-21T15:30:00Z",
      "updatedAt": "2024-03-21T16:45:00Z"
    }
  }
}
```

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

```json title="After (2026-02-09)"
{
  "object": "extractor",
  "id": "ex_abc123",
  "name": "Invoice Extractor",
  "draftVersion": {
    "object": "extractor_version",
    "id": "exv_xyz789",
    "extractorId": "ex_abc123",
    "version": "draft",
    "config": { ... },
    "createdAt": "2024-03-21T15:30:00Z"
  }
}
```

---

## Versions Endpoint Changes

### List Versions

The list endpoint now returns **summaries without config**. Use the get version endpoint for full details.

**`Before: Full versions with config`**

```json title="Before: Full versions with config"
{
  "versions": [
    {
      "id": "dpv_abc123",
      "version": "1.0",
      "config": { ... }  // Included
    }
  ]
}
```

**`After: Summaries only`**

```json title="After: Summaries only"
{
  "extractorVersions": [
    {
      "object": "extractor_version",
      "id": "exv_abc123",
      "version": "1.0",
      "extractorId": "ex_xyz789",
      "createdAt": "2024-03-21T15:30:00Z"
      // No config - use GET .../versions/{id} for full details
    }
  ]
}
```

---

## SDK Method Reference

| Old Method                         | New Method                              |
| ---------------------------------- | --------------------------------------- |
| `client.processor.create()`        | `client.extractors.create()`            |
| `client.processor.list()`          | `client.extractors.list()`              |
| `client.processor.update()`        | `client.extractors.update()`            |
| —                                  | `client.extractors.retrieve()` *(new!)* |
| `client.processorVersion.create()` | `client.extractorVersions.create()`     |
| `client.processorVersion.list()`   | `client.extractorVersions.list()`       |
| `client.processorVersion.get()`    | `client.extractorVersions.retrieve()`   |

---

#### Detailed Schema Changes

### Extractor Schema

| Property       | Old (Processor)        | New (Extractor)    | Change        |
| -------------- | ---------------------- | ------------------ | ------------- |
| `object`       | `"document_processor"` | `"extractor"`      | Value changed |
| `id`           | Required `string`      | Required `string`  | No change     |
| `name`         | Required               | Required           | No change     |
| `type`         | Required `"EXTRACT"`   | —                  | Removed       |
| `draftVersion` | `ProcessorVersion`     | `ExtractorVersion` | No change     |
| `createdAt`    | Required               | Required           | No change     |
| `updatedAt`    | Required               | Required           | No change     |

### ExtractorSummary Schema (List Response)

| Property   | Old                    | New           | Change        |
| ---------- | ---------------------- | ------------- | ------------- |
| `object`   | `"document_processor"` | `"extractor"` | Value changed |
| `type`     | Required               | —             | Removed       |
| `versions` | Required array         | —             | Removed       |

### ExtractorVersion Schema

| Property        | Old (ProcessorVersion)         | New (ExtractorVersion) | Change                   |
| --------------- | ------------------------------ | ---------------------- | ------------------------ |
| `object`        | `"document_processor_version"` | `"extractor_version"`  | Value changed            |
| `id`            | Required `string`              | Required `string`      | No change                |
| `processorId`   | Required                       | —                      | Renamed to `extractorId` |
| `extractorId`   | —                              | Required               | New                      |
| `processorName` | Optional                       | —                      | Removed                  |
| `processorType` | Required                       | —                      | Removed                  |
| `version`       | Required                       | Required               | No change                |
| `description`   | Optional                       | Optional               | No change                |
| `config`        | `ExtractionConfig`             | `ExtractConfig`        | No change                |
| `createdAt`     | Required                       | Required               | No change                |
| `updatedAt`     | Required                       | —                      | Removed                  |

### ExtractConfig Schema

| Property        | Old (ExtractionConfig) | New (ExtractConfig) | Change                  |
| --------------- | ---------------------- | ------------------- | ----------------------- |
| `type`          | Required `"EXTRACT"`   | —                   | Removed                 |
| `baseProcessor` | Optional               | Optional            | No change               |
| `schema`        | Optional               | Required            | Now required            |
| `fields`        | Optional (deprecated)  | —                   | Removed                 |
| `parser`        | Optional               | —                   | Renamed                 |
| `parseConfig`   | —                      | Optional            | New (replaces `parser`) |

---

## 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. |