extend

Turn documents into structured data: parse (OCR to markdown), extract fields, classify, split multi-document bundles, and fill PDF forms across PDFs, images…

Community: Submitted by a user or imported; check the owner before granting accessOnlineNo sign-inGlobalFreeRead-only

What it can do

  • Extract Data: Extract specific structured values (totals, line items, dates, names, tables) from a document (extract group) using a saved extractor, an inline JSON Schema, or schema-less inference. If
  • Create Extractor: Create a saved, reusable extractor (extract group). Three starting points, mutually exclusive: config (inline schema — call get_documentation with https://docs.extend.ai/extraction/s
  • Update Extractor: Update an extractor's mutable draft (extract group): rename it and/or replace the draft config (hand-editing the schema? call get_documentation with https://docs.extend.ai/extraction

What data it sees

Do you need an account

No: the server works without sign-in

Turn documents into structured data: parse (OCR to markdown), extract fields, classify, split multi-document bundles, and fill PDF forms across PDFs, images, Office docs, spreadsheets, and emails.

Server tool list (60)

Raw names from tools/list. Only developers need these.

extract_dataExtract specific structured values (totals, line items, dates, names, tables) from a document (extract group) using a saved extractor, an inline JSON Schema, or schema-less inference. If the user says "OCR" but wants specific values out, use this tool; for the raw text/markdown of the pages use parse_document instead. Provide exactly one of extractor or config, or omit both for schema-less inference (guided by config.extractionRules when config has no schema; not usable with package). If a saved extractor turns out not to exist, rerun THIS tool without the extractor (schema-less) — do not fall back to parse_document for value extraction. For one merged result across 2-50 related documents, pass package instead of file. detail: "full" returns per-field source citations and confidence — the only way to prove where a value came from (provenance); parsing cannot cite. Creates an extract run: may return status: "running" with a runId — normal, not an error; poll it with get_extract_run. Follow any llmContext guidance included in results.
create_extractorCreate a saved, reusable extractor (extract group). Three starting points, mutually exclusive: config (inline schema — call get_documentation with https://docs.extend.ai/extraction/schema.md BEFORE writing one by hand), cloneExtractorId (copy another extractor's draft config), or generate (Extend writes the schema from 1-5 sample documents plus optional instructions; no docs needed); name alone creates an empty draft. The draft is the only mutable surface — edit it with update_extractor, freeze it with publish_extractor_version, run it with extract_data. Follow any llmContext guidance included in results.
update_extractorUpdate an extractor's mutable draft (extract group): rename it and/or replace the draft config (hand-editing the schema? call get_documentation with https://docs.extend.ai/extraction/schema.md first). Published versions are immutable and unaffected — runs pinned to them keep working. Follow any llmContext guidance included in results.
get_extractorGet an extractor with its draft config, or one specific version's config via version (extract group). Use list_extractors to discover IDs. Follow any llmContext guidance included in results.
list_extractorsList the workspace's extractors, newest first (extract group). Fetch a specific one's config with get_extractor. Follow any llmContext guidance included in results.
list_extractor_versionsList an extractor's published (immutable) versions (extract group). Fetch one version's config with get_extractor. Follow any llmContext guidance included in results.
publish_extractor_versionPublish the extractor's current draft config as a new immutable semver version ("1.2"-style) that runs and evaluations can pin (extract group). releaseType picks the major or minor bump; pass config to publish that config instead of the draft. Published versions never change — keep iterating on the draft. Follow any llmContext guidance included in results.
get_extract_runGet the state and output of an extract run (extract group) — resume a status: "running" run or inspect a failed one. wait: true blocks until terminal or wait-budget expiry (call again to keep waiting). Follow any llmContext guidance included in results.
list_extract_runsList recent extract runs, newest first (extract group). Filter rather than paginate: status, extractorId, batchId, fileNameContains. Follow any llmContext guidance included in results.
cancel_extract_runCancel a queued or in-flight extract run (extract group). Best-effort: a run already finishing may still complete. Follow any llmContext guidance included in results.
delete_extract_runPermanently delete an extract run and its stored outputs (extract group). Cannot be undone. Follow any llmContext guidance included in results.
run_extract_batchSubmit up to 1,000 documents as one batch of extract runs (extract group) against a saved processor. Returns a batchId immediately; runs execute async — poll aggregate status with get_extract_batch, and fetch individual results with the extract-run list tool filtered by batchId. Follow any llmContext guidance included in results.
get_extract_batchGet the aggregate status of an extract batch (extract group) submitted by run_extract_batch. wait: true polls until terminal. Statuses: PENDING, PROCESSING, PROCESSED, FAILED, CANCELLED. Follow any llmContext guidance included in results.
classify_documentCategorize a document into one of a set of types, e.g. MSA vs SOW vs NDA (classify group), using a saved classifier or an inline list of classifications. Provide exactly one of classifier or config. Inline config.classifications must include one entry with type: "other" as the fallback and unique ids per entry. Returns the winning type with a confidence score. Creates a classify run: may return status: "running" with a runId — normal, not an error; poll it with get_classify_run. Follow any llmContext guidance included in results.
create_classifierCreate a saved, reusable classifier (classify group). Start from config (inline classifications list — call get_documentation with https://docs.extend.ai/classification/configuration.md before hand-authoring one) or cloneClassifierId (copy another classifier's draft config) — mutually exclusive; name alone creates an empty draft. There is no generate mode (extractors only). The draft is the only mutable surface — edit it with update_classifier, freeze it with publish_classifier_version, run it with classify_document. Follow any llmContext guidance included in results.
update_classifierUpdate a classifier's mutable draft (classify group): rename it and/or replace the draft config (hand-editing it? call get_documentation with https://docs.extend.ai/classification/configuration.md first). Published versions are immutable and unaffected — runs pinned to them keep working. Follow any llmContext guidance included in results.
get_classifierGet a classifier with its draft config, or one specific version's config via version (classify group). Use list_classifiers to discover IDs. Follow any llmContext guidance included in results.
list_classifiersList the workspace's classifiers, newest first (classify group). Fetch a specific one's config with get_classifier. Follow any llmContext guidance included in results.
list_classifier_versionsList a classifier's published (immutable) versions (classify group). Fetch one version's config with get_classifier. Follow any llmContext guidance included in results.
publish_classifier_versionPublish the classifier's current draft config as a new immutable semver version ("1.2"-style) that runs and evaluations can pin (classify group). releaseType picks the major or minor bump; pass config to publish that config instead of the draft. Published versions never change — keep iterating on the draft. Follow any llmContext guidance included in results.
get_classify_runGet the state and output of a classify run (classify group) — resume a status: "running" run or inspect a failed one. wait: true blocks until terminal or wait-budget expiry (call again to keep waiting). Follow any llmContext guidance included in results.
list_classify_runsList recent classify runs, newest first (classify group). Filter rather than paginate: status, classifierId, batchId, fileNameContains. Follow any llmContext guidance included in results.
cancel_classify_runCancel a queued or in-flight classify run (classify group). Best-effort: a run already finishing may still complete. Follow any llmContext guidance included in results.
delete_classify_runPermanently delete a classify run and its stored outputs (classify group). Cannot be undone. Follow any llmContext guidance included in results.
run_classify_batchSubmit up to 1,000 documents as one batch of classify runs (classify group) against a saved processor. Returns a batchId immediately; runs execute async — poll aggregate status with get_classify_batch, and fetch individual results with the classify-run list tool filtered by batchId. Follow any llmContext guidance included in results.
get_classify_batchGet the aggregate status of a classify batch (classify group) submitted by run_classify_batch. wait: true polls until terminal. Statuses: PENDING, PROCESSING, PROCESSED, FAILED, CANCELLED. Follow any llmContext guidance included in results.
split_documentDivide a combined file, e.g. a scanned bundle of invoices or a merged PDF of statements, into typed segments with page ranges (split group), using a saved splitter or inline split classifications. Also the right FIRST step to locate one document or section inside a larger bundle — split, then parse/extract only the relevant segment instead of processing the whole file. Provide exactly one of splitter or config; inline config.splitClassifications needs a type: "other" entry. Each split includes startPage/endPage and, when Extend materializes child files, a fileId usable directly in other tools. Raw text input is not supported — splitting is page-based. Creates a split run: may return status: "running" with a runId — normal, not an error; poll it with get_split_run. Follow any llmContext guidance included in results.
create_splitterCreate a saved, reusable splitter (split group). Start from config (inline split classifications — call get_documentation with https://docs.extend.ai/splitting/configuration.md before hand-authoring one) or cloneSplitterId (copy another splitter's draft config) — mutually exclusive; name alone creates an empty draft. The draft is the only mutable surface — edit it with update_splitter, freeze it with publish_splitter_version, run it with split_document. Follow any llmContext guidance included in results.
update_splitterUpdate a splitter's mutable draft (split group): rename it and/or replace the draft config (hand-editing it? call get_documentation with https://docs.extend.ai/splitting/configuration.md first). Published versions are immutable and unaffected — runs pinned to them keep working. Follow any llmContext guidance included in results.
get_splitterGet a splitter with its draft config, or one specific version's config via version (split group). Use list_splitters to discover IDs. Follow any llmContext guidance included in results.
list_splittersList the workspace's splitters, newest first (split group). Fetch a specific one's config with get_splitter. Follow any llmContext guidance included in results.
list_splitter_versionsList a splitter's published (immutable) versions (split group). Fetch one version's config with get_splitter. Follow any llmContext guidance included in results.
publish_splitter_versionPublish the splitter's current draft config as a new immutable semver version ("1.2"-style) that runs and evaluations can pin (split group). releaseType picks the major or minor bump; pass config to publish that config instead of the draft. Published versions never change — keep iterating on the draft. Follow any llmContext guidance included in results.
get_split_runGet the state and output of a split run (split group) — resume a status: "running" run or inspect a failed one. wait: true blocks until terminal or wait-budget expiry (call again to keep waiting). Follow any llmContext guidance included in results.
list_split_runsList recent split runs, newest first (split group). Filter rather than paginate: status, splitterId, batchId, fileNameContains. Follow any llmContext guidance included in results.
cancel_split_runCancel a queued or in-flight split run (split group). Best-effort: a run already finishing may still complete. Follow any llmContext guidance included in results.
delete_split_runPermanently delete a split run and its stored outputs (split group). Cannot be undone. Follow any llmContext guidance included in results.
run_split_batchSubmit up to 1,000 documents as one batch of split runs (split group) against a saved processor. Returns a batchId immediately; runs execute async — poll aggregate status with get_split_batch, and fetch individual results with the split-run list tool filtered by batchId. Follow any llmContext guidance included in results.
get_split_batchGet the aggregate status of a split batch (split group) submitted by run_split_batch. wait: true polls until terminal. Statuses: PENDING, PROCESSING, PROCESSED, FAILED, CANCELLED. Follow any llmContext guidance included in results.
parse_documentConvert a document (PDF, image, Office doc, spreadsheet) into clean structured text — markdown by default (parse group). Right when the user wants the content of the pages ("OCR this", "what does this document say", feed text to another step); for specific field values — or when values need source citations/provenance — use extract_data instead. No saved resource needed. NEVER pull a whole multi-page document into context when only a section matters: pass pageRange to return just those pages, or split_document the bundle first and parse only the relevant segment's fileId — this applies even when you have not yet located the section. Full output of a long document is large — maxChars caps it; rawBlocks returns block-level structure (tables, figures, coordinates). Creates a parse run: may return status: "running" with a runId — normal, not an error; poll it with get_parse_run. Parse runs cannot be cancelled. Follow any llmContext guidance included in results.
get_parse_runGet the state and output of a parse run (parse group) — resume a status: "running" run or inspect a failed one. wait: true blocks until terminal or wait-budget expiry (call again to keep waiting). Supports pageRange/maxChars/rawBlocks output slicing as in parse_document. Follow any llmContext guidance included in results.
list_parse_runsList recent parse runs, newest first (parse group). Filter rather than paginate: status, batchId, fileNameContains. Results come back in the upstream default order — this endpoint does not support sorting. Follow any llmContext guidance included in results.
delete_parse_runPermanently delete a parse run and its stored outputs (parse group). Cannot be undone. Follow any llmContext guidance included in results.
run_parse_batchSubmit up to 1,000 documents as one batch of parse runs (parse group); no saved processor needed — an optional inline config applies to every run. Returns a batchId immediately; poll aggregate status with get_parse_batch and fetch individual results with list_parse_runs filtered by batchId. Follow any llmContext guidance included in results.
get_parse_batchGet the aggregate status of a parse batch (parse group) submitted by run_parse_batch. wait: true polls until terminal. Statuses: PENDING, PROCESSING, PROCESSED, FAILED, CANCELLED. Follow any llmContext guidance included in results.
run_workflowStart a run of a deployed multi-step workflow on a document (workflows group; not runnable until a version is deployed, or pass version "draft"). Workflow runs commonly take minutes to hours: a status: "running" response is normal, not an error — NEEDS_REVIEW means paused for human review in the dashboard (see dashboardUrl). For one merged run over 2-50 related files, pass package instead of file. outputs injects pre-computed results for specific extractors/classifiers/splitters so the workflow skips recomputing them (not allowed with package). Follow any llmContext guidance included in results.
create_workflowCreate a workflow — a multi-step document pipeline (workflows group): parse → extract/classify/split → validations → human review. name alone creates an empty draft; steps builds the graph up front (call get_documentation with https://docs.extend.ai/workflows/configuring-workflows.md before hand-authoring a step graph). The draft is the only mutable surface — edit with update_workflow, freeze with deploy_workflow_version, run with run_workflow. Follow any llmContext guidance included in results.
update_workflowUpdate a workflow's mutable draft (workflows group): rename it and/or replace the entire draft step graph (hand-editing steps? call get_documentation with https://docs.extend.ai/workflows/configuring-workflows.md first). Deployed versions are immutable and unaffected — runs pinned to them keep working. Follow any llmContext guidance included in results.
get_workflowGet a workflow with its draft step graph, or one specific deployed version's steps via version (workflows group). Use list_workflows to discover IDs. Follow any llmContext guidance included in results.
list_workflowsList the workspace's workflows, newest first (workflows group). Fetch a specific one's step graph with get_workflow. Follow any llmContext guidance included in results.
list_workflow_versionsList a workflow's deployed (immutable) versions — integer deploy numbers with optional names (workflows group). Fetch one version's steps with get_workflow. Follow any llmContext guidance included in results.
deploy_workflow_versionDeploy the workflow's current draft as a new immutable version (workflows group). Unlike extractor/classifier/splitter publishing there is NO releaseType — workflow versions are integer deploy numbers ("1", "2", ...) with an optional display name referenced at run time. Pass steps to deploy that graph instead of the draft. Deployed versions never change — keep iterating on the draft. Follow any llmContext guidance included in results.
get_workflow_runGet the state and output of a workflow run (workflows group) — resume a status: "running" run or inspect a failed one. wait: true blocks until terminal or wait-budget expiry (call again to keep waiting). Workflow runs commonly take minutes to hours — repeated running responses are normal. Follow any llmContext guidance included in results.
list_workflow_runsList recent workflow runs, newest first (workflows group). Filter rather than paginate: status, workflowId, batchId, fileNameContains. Workflow batches have no batch-get endpoint — track them here via batchId. NEEDS_REVIEW runs are paused for human review. Follow any llmContext guidance included in results.
cancel_workflow_runCancel a queued or in-flight workflow run (workflows group). Best-effort: a run already finishing may still complete. Follow any llmContext guidance included in results.
delete_workflow_runPermanently delete a workflow run and its stored outputs (workflows group). Cannot be undone. Follow any llmContext guidance included in results.
run_workflow_batchSubmit up to 1,000 documents as one batch of workflow runs (workflows group). Returns a batchId immediately; workflow batches have NO batch-get endpoint — track progress with list_workflow_runs filtered by batchId. Follow any llmContext guidance included in results.
edit_pdfFill form fields in a PDF and return the edited file (edit group). Values come from instructions (free-form prose, e.g. "name is Acme Corp; date is 2026-04-15") and/or schema (an edit schema from detect_form_fields with extend_edit:value set per field; extend_edit:image with an image_url for signature images). The document passed here must be the TARGET form, not the source you read values from — parse or extract the source first, then fill. Before authoring a schema fill by hand, call get_documentation with https://docs.extend.ai/editing/configuration.md and follow it. Output is a pointer { id, presignedUrl } to the filled PDF; the URL expires in ~15 minutes (re-fetch with get_file). Inspect runs with get_edit_run. Follow any llmContext guidance included in results.
detect_form_fieldsDetect the fillable fields in a PDF form and return an edit schema (edit group): each property is a detected field with its type (text/checkbox/radio/dropdown/signature/table), page index, and bounding box. Use it to see what a form asks for, or as the scaffold for a structured fill — set extend_edit:value on each field and pass the populated schema to edit_pdf. Pass inputSchema to re-run detection against an existing schema (mapping mode) — for the edit-schema rules, call get_documentation with https://docs.extend.ai/editing/configuration.md first. Inspect runs with get_form_detection_run. Follow any llmContext guidance included in results.
get_edit_runGet the state and output of an edit run (edit group) — resume a status: "running" run or inspect a failed one. wait: true blocks until terminal or wait-budget expiry (call again to keep waiting). Edit runs have no list endpoint — keep the run ID. Follow any llmContext guidance included in results.