> Source: https://txtfetch.com/migrate/mindee > Plain-text twin — every page on txtfetch.com has one. https://txtfetch.com/text --- # Migrate from Mindee to txtfetch Typed fields, not text. Read this one before you switch anything. Here's what your code looks like before and after. txtfetch does not return typed fields. Its structured-output capability is not yet shipped. Keep Mindee for field extraction, or move to plain text plus your own parser. This page does not claim parity. ## Where you are today The call below is the v1 InvoiceV4 product API, checked against Mindee's current docs. Python ```python import os from mindee import PathInput from mindee.v1 import Client, product client = Client(api_key=os.environ["MINDEE_API_KEY"]) input_doc = PathInput("invoice.pdf") result = client.parse(product.InvoiceV4, input_doc) invoice = result.document ``` Mindee runs two API generations. Mindee does not call V1 deprecated. Its own V1 overview says V1 stays maintained, gets no new features, and has no shut-off date. You cannot open a new V1 account today. New signups use Mindee's V2 model-id extraction API instead. Checked against [Mindee's docs](https://mindee.github.io/mindee-api-python/) on 2026-09-10, using mindee 5.3.0. the call that replaces it One HTTP call. No SDK to install, and no job to poll. curl ```curl curl -X POST https://api.txtfetch.com/v1/extract \ -H "Authorization: Bearer $TXTFETCH_KEY" \ -F file=@invoice.pdf ``` Python ```python import os import requests with open("invoice.pdf", "rb") as f: r = requests.post( "https://api.txtfetch.com/v1/extract", headers={"Authorization": f"Bearer {os.environ['TXTFETCH_KEY']}"}, files={"file": f}, ) print(r.json()["extracted_text"]) ``` JavaScript ```javascript import { readFile } from "node:fs/promises"; const file = new Blob([await readFile("invoice.pdf")]); const form = new FormData(); form.append("file", file, "invoice.pdf"); const res = await fetch("https://api.txtfetch.com/v1/extract", { method: "POST", headers: { Authorization: `Bearer ${process.env.TXTFETCH_KEY}` }, body: form, }); const { extracted_text } = await res.json(); console.log(extracted_text); ``` drop-in adapter A short function standing in for `result.document..value (no equivalent, see below)`. Change one function, not your whole pipeline. Python ```python import os import requests def extracted_text_only(file_path: str) -> str: """Not a drop-in for result.document. There is no typed-field equivalent here, only the raw text those fields were pulled from. Use this to feed your own parser, not to replace field reads. """ with open(file_path, "rb") as f: r = requests.post( "https://api.txtfetch.com/v1/extract", headers={"Authorization": f"Bearer {os.environ['TXTFETCH_KEY']}"}, files={"file": f}, ) r.raise_for_status() return r.json()["extracted_text"] ``` JavaScript ```javascript import { readFile } from "node:fs/promises"; // Not a drop-in for result.document. There is no typed-field equivalent // here, only the raw text those fields were pulled from. async function extractedTextOnly(filePath) { const file = new Blob([await readFile(filePath)]); const form = new FormData(); form.append("file", file, filePath); const res = await fetch("https://api.txtfetch.com/v1/extract", { method: "POST", headers: { Authorization: `Bearer ${process.env.TXTFETCH_KEY}` }, body: form, }); const { extracted_text } = await res.json(); return extracted_text; } ``` field mapping | Mindee field | txtfetch equivalent | Note | | --- | --- | --- | | invoice.total\_amount.value | not returned | No typed fields come back. You would parse the total out of extracted\_text yourself. | | invoice.supplier\_name.value | not returned | Same gap. This is the field extraction that makes Mindee Mindee. | | invoice.line\_items (list of typed rows) | not returned | No structured line items. The row text is in extracted\_text, unparsed. | | field.confidence (per field) | not returned | No confidence score exists, because no field exists to score. | what you lose - Every typed field: totals, dates, supplier name, line items, and the rest of the invoice schema. - Per-field confidence scores for automating approval thresholds. - Prebuilt models for receipts, passports, IDs, and driver's licenses. - Custom Document APIs for training a field-extraction model on your own document types. See the full capability table on [txtfetch vs Mindee](https://txtfetch.com/compare/mindee). what you gain - Hundreds of formats through one endpoint (see /formats/coverage), not a narrow set of invoice-shaped documents. - One flat call with no per-document-type model to pick. - 500 documents a month on the free Hobby plan, with no card and no trial clock. The pricing math behind per-document billing lives on [why per-page pricing punishes long documents](https://txtfetch.com/compare/per-page-pricing). ## Cutover This is not a cutover. Keep Mindee running for the fields your pipeline reads today. Add txtfetch only where you need the raw text Mindee's fields were extracted from, or where your own parser can read plain text well enough. - [Compare outputs side by side](https://txtfetch.com/diff), to dual-run both calls on the same file. - [Clean up extracted text](https://txtfetch.com/tools/clean-extracted-text), if the two outputs disagree on formatting. sources - [Mindee: Python client reference](https://mindee.github.io/mindee-api-python/) Accessed 2026-09-10 - [Mindee: V1 overview (maintained, no new features, no shut-off date)](https://docs.mindee.com/v1/get-started/readme) Accessed 2026-09-10 - [Mindee: V2 extraction quick start (where new signups go)](https://docs.mindee.com/extraction-models/sdk-integration/quick-start) Accessed 2026-09-10 - [PyPI: mindee](https://pypi.org/project/mindee/) Accessed 2026-09-10 - [Mindee: Pricing](https://www.mindee.com/pricing) Accessed 2026-09-10 frequently asked questions **Can txtfetch replace Mindee outright?**: No, not today. Mindee returns typed fields like total_amount and supplier_name. txtfetch returns plain text only. Keep Mindee if your pipeline reads those fields. **When would I add txtfetch alongside Mindee, not instead of it?**: Add it when you need raw text a Mindee model doesn't cover. That includes a document type with no prebuilt model, or your own parser that only needs clean input text. **Does txtfetch have a roadmap for typed field extraction?**: Structured markdown and element-JSON output already ship. Schema-defined field extraction is on the roadmap, not shipped. This page won't claim it early. other migrations - [Migrate from Unstructured.io →](https://txtfetch.com/migrate/unstructured) - [Migrate from LlamaParse →](https://txtfetch.com/migrate/llamaparse) - [Migrate from AWS Textract →](https://txtfetch.com/migrate/aws-textract) - [Migrate from Azure AI Document Intelligence →](https://txtfetch.com/migrate/azure-document-intelligence) - [All migrations →](https://txtfetch.com/migrate) ## Swap the call. Keep the pipeline. Point your Mindee code at txtfetch, then diff the output before you cut over. [Get an API key →](https://app.txtfetch.com/signup) [See the migration guide →](https://txtfetch.com/migrate)