---
site_search: "GET /ask?q={query} (read-only search over extend.ai and docs.extend.ai; returns links and quoted passages, not generated answers)"
title: "Migrate from Reducto to Extend"
description: "A developer guide to moving from Reducto to Extend: how parse, extract, and split map, before-and-after Python code, and a side-by-side migration plan."
canonical: https://www.extend.ai/migrate/reducto
---

# Migrate from Reducto to Extend

> Search this site and the docs: [`/ask?q=…`](/ask?q=webhook+retries) returns matching pages from extend.ai and docs.extend.ai, with quoted passages.

Migrate · Reducto to Extend

Reducto and Extend share a parse, extract, and split model, so most of the work is renaming calls.

[Get an API key](https://dashboard.extend.ai/) · [Extend vs. Reducto](https://www.extend.ai/compare/extend-vs-reducto.md)

[View as Markdown](https://www.extend.ai/migrate/reducto.md)

## Five steps

1. Get an API key
2. Swap one call
3. Run both side by side
4. Scale with async
5. Cut over

- **Calls to swap:** parse, extract, split
- **SDK:** pip install extend-ai or npm install extend-ai
- **API key variable:** EXTEND_API_KEY
- **Parsing accuracy:** Extend 95.7% vs. Reducto Agentic 91.1% on RealDoc-Bench

On this page:

- Concept map
- Steps
- Agent prompt
- SDK, CLI, and MCP
- FAQ

## Concept map

| Reducto | Extend | What to know |
| --- | --- | --- |
| `client.parse.run(input=...)` | `client.parse(file=...)` | Pass a URL or a file ID. Output is output.chunks, each with Markdown content and typed blocks. |
| `client.extract.run(instructions={'schema': ...})` | `client.extract(config={'schema': ...})` | Same JSON Schema idea. Turn on citationsEnabled for per-field citations and confidence. |
| `client.split.run(split_description=[...])` | `client.split(config={'splitClassifications': [...]})` | Each split returns a page range, type, identifier, a written observation, and its own file ID. |
| `jobid:// to reuse a parse` | `File ID` | Upload once with client.files.upload and pass the same file ID to every processor. |
| `Async jobs and job polling` | `Run endpoints with create_and_poll or webhooks` | parse_runs, extract_runs, split_runs, and classify_runs, plus batches of up to 1,000 files. |
| `REDUCTO_API_KEY` | `EXTEND_API_KEY` | Both SDKs read the key from the environment. |

## 01 Get an API key

Sign up, then export your key as EXTEND_API_KEY. You start with 10,000 free credits.

## 02 Swap one call

Add Extend next to your current call, behind a flag.

Start with parse or extract. Move split last.

### Parse a document

Read output.chunks instead of result.result.chunks.

Remove · Reducto (Python):

```python
from reducto import Reducto

client = Reducto()  # reads REDUCTO_API_KEY

result = client.parse.run(input="https://example.com/invoice.pdf")

for chunk in result.result.chunks:
    print(chunk.content)
```

Add · Extend (Python):

```python
from extend_ai import Extend

client = Extend()  # reads EXTEND_API_KEY

response = client.parse(
    file={"url": "https://example.com/invoice.pdf"}
)

for chunk in response.output.chunks:
    print(chunk.content)  # Markdown for the chunk
    for block in chunk.blocks:
        print(block.type, block.content)
```

### Extract fields with a schema

Move your schema from instructions into config.

Remove · Reducto (Python):

```python
result = client.extract.run(
    input="https://example.com/invoice.pdf",
    instructions={
        "schema": {
            "type": "object",
            "properties": {
                "invoice_number": {"type": "string"},
                "total": {"type": "number"},
            },
        },
    },
)

print(result.result)
```

Add · Extend (Python):

```python
from extend_ai import Extend

client = Extend()

result = client.extract(
    file={"url": "https://example.com/invoice.pdf"},
    config={
        "schema": {
            "type": "object",
            "properties": {
                "invoice_number": {"type": ["string", "null"]},
                "total": {"type": ["number", "null"]},
            },
        },
        "advancedOptions": {"citationsEnabled": True},
    },
)

print(result.output.value)     # shaped like your schema
print(result.output.metadata)  # per-field confidence and citations
```

### Split a packet into documents

Each split_description entry becomes a split classification.

Remove · Reducto (Python):

```python
result = client.split.run(
    input="https://example.com/packet.pdf",
    split_description=[
        {"name": "invoice", "description": "An invoice requesting payment."},
    ],
)

for split in result.splits:
    print(split.name, split.pages)
```

Add · Extend (Python):

```python
from extend_ai import Extend

client = Extend()

result = client.split(
    file={"url": "https://example.com/packet.pdf"},
    config={
        "splitClassifications": [
            {"id": "invoice", "type": "invoice",
             "description": "An invoice requesting payment."},
            {"id": "other", "type": "other",
             "description": "Any other document."},
        ],
    },
)

for split in result.output.splits:
    print(split.type, split.start_page, split.end_page)
    # split.file_id is a standalone file for Extract
```

### Reuse one upload across processors

Upload once and reuse the file ID instead of jobid://.

Add · Extend (Python):

```python
from extend_ai import Extend

client = Extend()

with open("invoice.pdf", "rb") as f:
    uploaded = client.files.upload(file=f)

# Reuse the same file ID for Parse, Extract, Split, and Classify
response = client.parse(file={"id": uploaded.id})
```

## 03 Run both side by side

Compare both on 50 to 100 of your documents, and save them as an evaluation set.

- [Evaluation sets](https://docs.extend.ai/evaluation/overview)
- [Async processing](https://docs.extend.ai/general/async-processing)
- [Batch processing](https://docs.extend.ai/general/batch-processing)

## 04 Scale with async

Use async runs with webhooks, or batches of up to 1,000 files.

## 05 Cut over

Switch traffic once results pass, and rerun the set after changes.

### What you gain

- 95.7% vs. 91.1% on RealDoc-Bench parsing.
- 99.2% vs. 97.4% on LongArray-Extract, 2.8× faster.
- Built-in human review and Review Agent.
- Evaluation sets to test every change.
- Zero data retention on every plan.
- Self-serve pricing with 10,000 free credits.

### When to keep both

- You already parse with Reducto and depend on reusing a parse job across split and extract inside that pipeline.
- You need Reducto's partition_key behavior for documents where one category repeats per account, until you have rebuilt it with Extend identifiers.

## Agent prompt

Paste into Claude Code, Cursor, or Codex to run the migration.

Prompt:

```text
Migrate this codebase from Reducto to Extend. Read the guide at https://www.extend.ai/migrate/reducto.md, install the extend-ai SDK, and replace each Reducto call using its concept map and code samples. Keep the Reducto path behind a flag until both paths have run on the same documents, and read the API key from EXTEND_API_KEY.
```

## SDK, CLI, and MCP

Pick how you want to work.

### SDKs

Python, TypeScript, Java, and Go.

```bash
pip install extend-ai
npm install extend-ai
```

- [SDK guide](https://www.extend.ai/agents/sdk.md)
- [SDK docs](https://docs.extend.ai/sdks)

### CLI

Run any processor from your terminal.

```bash
curl -fsSL https://extend.ai/install.sh | sh
extend setup
extend parse invoice.pdf > invoice.md
```

- [CLI guide](https://www.extend.ai/agents/cli.md)
- [CLI docs](https://docs.extend.ai/cli)

### MCP server

Let your coding agent call Extend.

```bash
claude mcp add --transport http extend https://mcp.extend.ai/mcp
```

- [MCP guide](https://www.extend.ai/agents/mcp.md)
- [MCP docs](https://docs.extend.ai/mcp)

### Agent quickstart

Give your agent current Extend docs.

```bash
npx skills add extend-hq/extend-agent-plugin --skill extend-api
```

- [Agent quickstart](https://docs.extend.ai/agent-quickstart)

## FAQ

### Reducto is down. What should I do?

Check Reducto's status page first. To keep documents moving during an outage, send the same files to Extend: sign up at dashboard.extend.ai, export EXTEND_API_KEY, and call client.parse or client.extract with the same file URL. New accounts get 10,000 free credits with no contract or sales call, and Extend publishes its own status at status.extend.ai.

### Can I use Extend as a fallback for Reducto?

Yes. Keep Reducto as your primary path and route a request to Extend when it fails, times out, or returns low-confidence output. Reducto returns result.result.chunks and Extend returns response.output.chunks, both with Markdown content and blocks, so a fallback adapter only renames a few fields. Score both paths on the same Extend evaluation set so you know the fallback meets your bar before you need it.

### Reducto is slow or timing out on large documents. What are my options?

Use Extend's async run endpoints: create_and_poll while you test, or webhooks in production, instead of holding a connection open. Synchronous calls time out after five minutes, and batch requests accept up to 1,000 files each. For mixed batches, the parse_auto engine sends simple pages through the faster Light engine and only complex pages through Performance.

### Reducto is returning wrong or incomplete results. Is there a more accurate alternative?

On RealDoc-Bench, Extend Parse 2.0 scored 95.7% field-level document Q&A accuracy against 91.1% for Reducto Agentic. On LongArray-Extract, Extend MAX reached 99.2% against 97.4% for Reducto Deep Extract. With citations enabled, every extracted value points to its page and region, so you can see exactly where a wrong value came from.

### Is Extend more accurate than Reducto?

On RealDoc-Bench, Extend Parse 2.0 scored 95.7% field-level document Q&A accuracy against 91.1% for Reducto Agentic. On LongArray-Extract, Extend MAX reached 99.2% against 97.4% for Reducto Deep Extract and finished 2.8× faster. Run both on your own documents before deciding.

### Reducto is getting expensive. How does Extend pricing work?

Extend publishes per-page pricing on a credit system: Parse costs $5 per 1,000 pages on Light and $20 per 1,000 pages on Performance on pay-as-you-go, at $0.01 per credit after 10,000 free credits, with no contract, monthly minimum, or platform fee. The parse_auto engine bills each page by its complexity, so clean pages stay cheap.

### Does Extend keep my documents if I switch from Reducto?

Not if you don't want it to. Zero data retention can be enabled on every plan, including pay-as-you-go, and AI subprocessors operate under contractual zero-retention and no-training terms. Extend supports SOC 2 Type II, HIPAA with BAAs, GDPR, and EU processing.

### Can I run Extend in my own cloud?

Yes. Extend runs as managed cloud in US or EU regions, as BYOC inside your own cloud account and VPC, or as a hybrid deployment.

### When should I consider migrating from Reducto to Extend?

Consider Extend when accuracy on complex documents, traceable output, or production review starts to limit your pipeline. Extend Parse 2.0 scored 95.7% on RealDoc-Bench against 91.1% for Reducto Agentic, and Extend MAX reached 99.2% on LongArray-Extract against 97.4% for Reducto Deep Extract while finishing 2.8× faster. Extend is self-serve, so you can test it on your own documents the same day with 10,000 free credits.

### Can a coding agent migrate my Reducto integration for me?

Yes. Connect the Extend MCP server to Claude Code, Cursor, Codex, or VS Code, or install the extend-api context file with npx skills add extend-hq/extend-agent-plugin --skill extend-api, then ask the agent to replace each call using the concept map on this page.

### How long does it take to migrate from Reducto to Extend?

Most teams swap the parse or extract call first and run both paths side by side on their own documents before cutting over. Because both APIs use a parse, extract, and split model with JSON Schema, the code change is mostly renaming calls and reading output.chunks and output.value instead of result.result.

### Can I keep my Reducto extraction schemas?

Yes. Move the JSON Schema from Reducto's instructions object into the schema field of Extend's extract config. Add field descriptions where Reducto relied on a system prompt, and turn on citationsEnabled to get per-field citations and confidence.

## Related

- [Extend vs. Reducto](https://www.extend.ai/compare/extend-vs-reducto.md)
- [Document splitting APIs: Extend vs. Reducto](https://www.extend.ai/resources/document-splitting-api-source-citations-extend-vs-reducto.md)
- [Extend docs](https://docs.extend.ai/)

## Other guides

- [Migrate from LlamaParse to Extend](https://www.extend.ai/migrate/llamaparse.md)
- [Migrate from AWS Textract to Extend](https://www.extend.ai/migrate/aws-textract.md)
- [Migrate from Google Cloud Document AI to Extend](https://www.extend.ai/migrate/google-document-ai.md)
- [Migrate from Unstructured to Extend](https://www.extend.ai/migrate/unstructured.md)
