Every API here is available over the APIs.io API and to AI agents over MCP.
openapi: 3.2.0
info:
title: 'LandingAI Agentic Document Extraction (ADE) API v1: , Extract, Classify, Split, Section Classes Parse API'
version: 0.1.0
description: 'Convert documents such as PDFs, images, and Office files into structured data with LandingAI''s Agentic Document Extraction (ADE) v1 endpoints. Includes Parse (documents to Markdown and structured chunks with grounding), Extract (schema-based field extraction), Classify (page-level classification), Split (separate multi-document files), and Section (hierarchical table of contents), plus asynchronous jobs for parsing and extraction. Documentation: https://docs.landing.ai'
servers:
- url: https://api.va.landing.ai
description: Production vision tools API
tags:
- name: Parse
paths:
/v2/parse:
post:
tags:
- Parse
summary: ADE Parse
description: Parse a document and return the parse response inline.
operationId: parse_run_sync
responses:
'200':
description: The parse response
content:
application/json:
schema:
$ref: '#/components/schemas/ParseResponse'
'206':
description: Partial success (some pages failed to parse)
content:
application/json:
schema:
$ref: '#/components/schemas/ParseResponse'
'422':
description: Request validation failed.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
requestBody:
required: true
content:
multipart/form-data:
schema:
type: object
properties:
document:
type: string
format: binary
description: The file to parse. The file must be a PDF or image; see the list of [supported file types](https://docs.landing.ai/dpt3/file-types). Provide either `document` or `document_url`, not both.
document_url:
type: string
description: A publicly accessible URL to the file to parse. The file must be a PDF or image; see the list of [supported file types](https://docs.landing.ai/dpt3/file-types). Provide either `document` or `document_url`, not both.
model:
type: string
description: The DPT-3 model snapshot to use for this request. Accepts a dated snapshot (for example, `dpt-3-pro-20260710`), the `dpt-3-pro-latest` alias, or the bare `dpt-3-pro` family name (equivalent to `dpt-3-pro-latest`). Defaults to the latest DPT-3 Pro snapshot.
options:
additionalProperties: false
properties:
pages:
anyOf:
- items:
type: integer
type: array
- type: 'null'
default: null
title: Pages
blocks:
$ref: '#/components/schemas/BlocksOptions'
atomic_grounding:
default: true
description: Include the fine-grained `atomic_grounding` array on leaf elements. Set `false` to omit the field entirely from every node.
title: Atomic Grounding
type: boolean
inline_markdown:
default: false
description: 'Include each node''s slice of the document `markdown` inline as a `markdown` field on every structure node: the document root, each page, and each element (including table cells). `atomic_grounding` entries do not carry it.'
title: Inline Markdown
type: boolean
password:
anyOf:
- type: string
- type: 'null'
default: null
description: Password for encrypted PDFs. Not currently supported — providing a value returns a 422 error; decrypt the file before uploading.
title: Password
title: ParseOptions
type: object
description: Optional object that customizes the parse. Use it to select which pages to process, adjust how content appears in the Markdown, or control how much detail the response includes. Sent as a JSON-serialized string in form data.
x-codeSamples:
- lang: cURL
label: cURL
source: "curl -X POST 'https://api.ade.landing.ai/v2/parse' \\\n -H 'Authorization: Bearer YOUR_API_KEY' \\\n -F 'document=@document.pdf' \\\n -F 'model=dpt-3-pro-latest'"
- lang: Python
label: Python
source: 'import requests
url = ''https://api.ade.landing.ai/v2/parse''
headers = {''Authorization'': ''Bearer YOUR_API_KEY''}
files = {''document'': open(''document.pdf'', ''rb'')}
data = {''model'': ''dpt-3-pro-latest''}
response = requests.post(url, headers=headers, files=files, data=data)
print(response.json())'
- lang: JavaScript
label: Node.js
source: "const axios = require('axios');\nconst FormData = require('form-data');\nconst fs = require('fs');\n\nconst form = new FormData();\nform.append('document', fs.createReadStream('document.pdf'));\nform.append('model', 'dpt-3-pro-latest');\n\naxios.post('https://api.ade.landing.ai/v2/parse', form, {\n headers: { 'Authorization': 'Bearer YOUR_API_KEY', ...form.getHeaders() }\n})\n .then(response => console.log(response.data))\n .catch(error => console.error(error));"
/v2/parse/jobs:
post:
tags:
- Parse
summary: ADE Parse Jobs
operationId: parse_create_job
responses:
'202':
description: Job created
content:
application/json:
schema:
type: object
required:
- job_id
- status
- created_at
properties:
job_id:
type: string
description: 'The unique identifier for the created parse job. Poll ``GET /v2/parse/jobs/{job_id}`` for its status and result. Format: ``<service>-<26-character Crockford base32 ULID>`` matching ``^(parse|extract)-[0-9a-hjkmnp-tv-z]{26}$``. Opaque, server-minted, and stable for the life of the job — the same id is returned on the sync response, the async 202, and every poll. Treat it as opaque; older id formats remain accepted indefinitely and are never re-issued.'
status:
type: string
enum:
- pending
- processing
- completed
- failed
description: The job's status at creation — normally ``pending`` (a just-created job that is still running is reported as ``pending``), but may already be a terminal ``completed`` / ``failed`` if the job finished before the create response was rendered.
created_at:
type:
- string
- 'null'
description: ISO-8601 timestamp for when the job was created.
'422':
description: Request validation failed.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
description: Parse a document asynchronously. Returns a job ID; use it to poll for the job's status and retrieve the parse result once processing completes.
requestBody:
required: true
content:
multipart/form-data:
schema:
type: object
properties:
document:
type: string
format: binary
description: The file to parse. The file must be a PDF or image; see the list of [supported file types](https://docs.landing.ai/dpt3/file-types). Provide either `document` or `document_url`, not both.
document_url:
type: string
description: A publicly accessible URL to the file to parse. The file must be a PDF or image; see the list of [supported file types](https://docs.landing.ai/dpt3/file-types). Provide either `document` or `document_url`, not both.
model:
type: string
description: The DPT-3 model snapshot to use for this request. Accepts a dated snapshot (for example, `dpt-3-pro-20260710`), the `dpt-3-pro-latest` alias, or the bare `dpt-3-pro` family name (equivalent to `dpt-3-pro-latest`). Defaults to the latest DPT-3 Pro snapshot.
options:
additionalProperties: false
properties:
pages:
anyOf:
- items:
type: integer
type: array
- type: 'null'
default: null
title: Pages
blocks:
$ref: '#/components/schemas/BlocksOptions'
atomic_grounding:
default: true
description: Include the fine-grained `atomic_grounding` array on leaf elements. Set `false` to omit the field entirely from every node.
title: Atomic Grounding
type: boolean
inline_markdown:
default: false
description: 'Include each node''s slice of the document `markdown` inline as a `markdown` field on every structure node: the document root, each page, and each element (including table cells). `atomic_grounding` entries do not carry it.'
title: Inline Markdown
type: boolean
password:
anyOf:
- type: string
- type: 'null'
default: null
description: Password for encrypted PDFs. Not currently supported — providing a value returns a 422 error; decrypt the file before uploading.
title: Password
title: ParseOptions
type: object
description: Optional object that customizes the parse. Use it to select which pages to process, adjust how content appears in the Markdown, or control how much detail the response includes. Sent as a JSON-serialized string in form data.
output_save_url:
type: string
description: Public URL the full response is delivered to; the API response then carries ``output_url`` instead of inline data.
service_tier:
type: string
enum:
- standard
- priority
description: Async service tier (``POST /jobs`` only). ``priority`` runs in the fast lane at the sync billing rate; absent → ``standard``.
x-codeSamples:
- lang: cURL
label: cURL
source: "curl -X POST 'https://api.ade.landing.ai/v2/parse/jobs' \\\n -H 'Authorization: Bearer YOUR_API_KEY' \\\n -F 'document=@document.pdf' \\\n -F 'model=dpt-3-pro-latest'"
- lang: Python
label: Python
source: 'import requests
url = ''https://api.ade.landing.ai/v2/parse/jobs''
headers = {''Authorization'': ''Bearer YOUR_API_KEY''}
files = {''document'': open(''document.pdf'', ''rb'')}
data = {''model'': ''dpt-3-pro-latest''}
response = requests.post(url, headers=headers, files=files, data=data)
print(response.json())'
- lang: JavaScript
label: Node.js
source: "const axios = require('axios');\nconst FormData = require('form-data');\nconst fs = require('fs');\n\nconst form = new FormData();\nform.append('document', fs.createReadStream('document.pdf'));\nform.append('model', 'dpt-3-pro-latest');\n\naxios.post('https://api.ade.landing.ai/v2/parse/jobs', form, {\n headers: { 'Authorization': 'Bearer YOUR_API_KEY', ...form.getHeaders() }\n})\n .then(response => console.log(response.data))\n .catch(error => console.error(error));"
get:
tags:
- Parse
summary: ADE List Parse Jobs
operationId: parse_list_jobs
parameters:
- name: page
in: query
required: false
schema:
type: integer
minimum: 0
description: Page number (0-indexed).
default: 0
title: Page
description: Page number (0-indexed).
- name: page_size
in: query
required: false
schema:
type: integer
maximum: 100
minimum: 1
description: Number of items per page.
default: 10
title: Page Size
description: Number of items per page.
- name: status
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: Filter by job status.
title: Status
description: Filter by job status.
responses:
'200':
description: The caller's jobs, newest first
content:
application/json:
schema:
type: object
properties:
jobs:
type: array
description: The caller's parse jobs for this page, newest first.
items:
type: object
properties:
job_id:
type: string
description: 'The unique identifier for the parse job. Format: ``<service>-<26-character Crockford base32 ULID>`` matching ``^(parse|extract)-[0-9a-hjkmnp-tv-z]{26}$``. Opaque, server-minted, and stable for the life of the job — the same id is returned on the sync response, the async 202, and every poll. Treat it as opaque; older id formats remain accepted indefinitely and are never re-issued.'
status:
type: string
enum:
- pending
- processing
- completed
- failed
description: 'The job''s current status: ``pending``, ``processing``, ``completed``, or ``failed``.'
created_at:
type:
- string
- 'null'
description: ISO-8601 timestamp for when the job was created.
completed_at:
type:
- string
- 'null'
description: ISO-8601 timestamp for when the job finished, if terminal.
model_version:
type:
- string
- 'null'
description: The model snapshot used to parse the document.
failure_reason:
type:
- string
- 'null'
description: The reason the job failed. Present only when ``status`` is ``failed``.
page:
type: integer
description: The 0-indexed page number.
page_size:
type: integer
description: Items per page.
has_more:
type: boolean
description: Whether more jobs exist beyond this page; request the next ``page`` to fetch them.
'422':
description: Request validation failed.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
x-codeSamples:
- lang: cURL
label: cURL
source: "curl 'https://api.ade.landing.ai/v2/parse/jobs' \\\n -H 'Authorization: Bearer YOUR_API_KEY'"
- lang: Python
label: Python
source: 'import requests
url = ''https://api.ade.landing.ai/v2/parse/jobs''
headers = {''Authorization'': ''Bearer YOUR_API_KEY''}
response = requests.get(url, headers=headers)
print(response.json())'
- lang: JavaScript
label: Node.js
source: "const axios = require('axios');\n\naxios.get('https://api.ade.landing.ai/v2/parse/jobs', {\n headers: { 'Authorization': 'Bearer YOUR_API_KEY' }\n})\n .then(response => console.log(response.data))\n .catch(error => console.error(error));"
/v2/parse/jobs/{job_id}:
get:
tags:
- Parse
summary: ADE Get Parse Jobs
description: Get the status of an async parse job. Once the job has ``completed``, ``result`` carries the parse response (or ``output_url`` when ``output_save_url`` was set). Partial success (some pages failed) is reported in ``result.metadata.failed_pages``.
operationId: parse_get_job
parameters:
- name: job_id
in: path
required: true
schema:
type: string
description: The identifier of the job to retrieve, as returned by the create-job request.
title: Job Id
description: The identifier of the job to retrieve, as returned by the create-job request.
responses:
'200':
description: Job status / result
content:
application/json:
schema:
type: object
properties:
job_id:
type: string
description: 'The unique identifier for this parse job. Format: ``<service>-<26-character Crockford base32 ULID>`` matching ``^(parse|extract)-[0-9a-hjkmnp-tv-z]{26}$``. Opaque, server-minted, and stable for the life of the job — the same id is returned on the sync response, the async 202, and every poll. Treat it as opaque; older id formats remain accepted indefinitely and are never re-issued.'
status:
type: string
enum:
- pending
- processing
- completed
- failed
description: 'The job''s current status: ``pending``, ``processing``, ``completed``, or ``failed``.'
created_at:
type:
- string
- 'null'
description: ISO-8601 timestamp for when the job was created.
completed_at:
type: string
description: ISO-8601 timestamp; present once the job is terminal.
progress:
type: number
description: Job completion as a decimal from 0 (not started) to 1 (complete). Present while ``processing``.
result:
anyOf:
- $ref: '#/components/schemas/ParseResponse'
- type: 'null'
description: The parse response, present once the job has ``completed`` and ``output_save_url`` was not set. When ``output_save_url`` was set, the result is delivered there and ``output_url`` is returned instead.
output_url:
type:
- string
- 'null'
description: The URL the result was delivered to. Present once the job has ``completed`` and ``output_save_url`` was set, instead of inline ``result``.
error:
type: object
description: Present once the job has ``failed`` — the failure code + message.
properties:
code:
type: string
description: Stable error code.
message:
type: string
'404':
description: Job not found
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'422':
description: Request validation failed.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
x-codeSamples:
- lang: cURL
label: cURL
source: "curl 'https://api.ade.landing.ai/v2/parse/jobs/JOB_ID' \\\n -H 'Authorization: Bearer YOUR_API_KEY'"
- lang: Python
label: Python
source: 'import requests
url = ''https://api.ade.landing.ai/v2/parse/jobs/JOB_ID''
headers = {''Authorization'': ''Bearer YOUR_API_KEY''}
response = requests.get(url, headers=headers)
print(response.json())'
- lang: JavaScript
label: Node.js
source: "const axios = require('axios');\n\naxios.get('https://api.ade.landing.ai/v2/parse/jobs/JOB_ID', {\n headers: { 'Authorization': 'Bearer YOUR_API_KEY' }\n})\n .then(response => console.log(response.data))\n .catch(error => console.error(error));"
components:
schemas:
ErrorResponse:
type: object
title: ErrorResponse
required:
- code
- message
properties:
code:
type: string
description: Stable snake_case error code (e.g. ``validation_error``, ``unknown_model_version``, ``invalid_url``, ``invalid_api_key``, ``rate_limit_exceeded``).
message:
type: string
description: Human-readable detail.
ParseMetadata:
description: 'Information about a parse request. This is the customer-facing shape —
the internal billing-canonical metadata (``aide_common.parse_schema.ParseMetadata``)
is projected into it at the render boundary (``project_customer_metadata``).'
properties:
job_id:
anyOf:
- type: string
- type: 'null'
description: 'The parse job identifier — always server-minted and unique per submit. On the async `/jobs` route this is the id the caller polls. Correlates with the job''s entry in your billing dashboard. Format: ``<service>-<26-character Crockford base32 ULID>`` matching ``^(parse|extract)-[0-9a-hjkmnp-tv-z]{26}$``. Opaque, server-minted, and stable for the life of the job — the same id is returned on the sync response, the async 202, and every poll. Treat it as opaque; older id formats remain accepted indefinitely and are never re-issued.'
title: Job Id
model_version:
anyOf:
- type: string
- type: 'null'
description: The exact model snapshot that parsed the document, e.g. `dpt-3-pro-20260710`.
title: Model Version
page_count:
anyOf:
- type: integer
- type: 'null'
description: Total number of pages in the source document. Includes pages filtered out by `options.pages`; the actual returned pages are in `structure.children`.
title: Page Count
output_markdown_chars:
anyOf:
- type: integer
- type: 'null'
description: Number of Unicode code points in the returned `markdown` string.
title: Output Markdown Chars
range_units:
const: unicode_codepoints
description: Units of every `range` offset in the response. Always `"unicode_codepoints"` (Unicode code points into `markdown`). Declared explicitly so consumers know how to slice the string — e.g. JavaScript strings are UTF-16, so a naive `.slice()` drifts when the markdown contains astral characters; such consumers must convert code-point offsets to UTF-16 indices first.
title: Range Units
type: string
openapi_spec:
description: URL of the OpenAPI spec covering this API, for inspection and client generation.
title: Openapi Spec
type: string
failed_pages:
description: '1-indexed page numbers that failed to parse. Empty when all pages succeed; failed pages also appear in `structure.children` with `status: failed`.'
items:
type: integer
title: Failed Pages
type: array
duration_ms:
anyOf:
- type: integer
- type: 'null'
description: Total processing time in milliseconds.
title: Duration Ms
billing:
$ref: '#/components/schemas/ParseBilling'
description: 'Billing summary: the service tier and the credits charged.'
required:
- job_id
- model_version
- page_count
- output_markdown_chars
- range_units
- openapi_spec
- failed_pages
- duration_ms
- billing
title: ParseMetadata
type: object
TableOptions:
additionalProperties: false
properties:
markdown:
default: true
title: Markdown
type: boolean
format:
default: html
enum:
- markdown
- html
title: Format
type: string
title: TableOptions
type: object
ParseResponse:
description: 'The parse result: the full document as `markdown`, its hierarchical
`structure` (with per-node spatial `grounding` inline), and request
`metadata`.'
properties:
markdown:
description: The full document as a single Markdown string, in reading order.
title: Markdown
type: string
metadata:
$ref: '#/components/schemas/ParseMetadata'
description: 'Information about the request: model version, page count, duration, billing, and more.'
structure:
$ref: '#/components/schemas/Document'
description: 'The document''s hierarchical structure: pages and the elements detected on each page. Every node below the root carries its spatial data inline in a `grounding` object (`{page, range, box}`, normalized page coordinates); leaf elements additionally carry `atomic_grounding`.'
required:
- markdown
- metadata
- structure
title: ParseResponse
type: object
Document:
properties:
type:
const: document
default: document
description: The node type. Identifies this node as the root of the structure tree.
title: Type
type: string
children:
description: The pages of the document, in source order.
items:
$ref: '#/components/schemas/Page'
title: Children
type: array
markdown:
anyOf:
- type: string
- type: 'null'
default: null
description: The full document markdown — identical to the top-level `markdown` field, included so the structure tree is self-contained. Present only when `options.inline_markdown` is `true`.
title: Markdown
title: Document
type: object
Grounding:
description: 'Where a node lives: its page, its slice of `markdown`, and its box.
The same shape is used for page nodes, element nodes, and each
`atomic_grounding` entry, so any grounding object is self-contained — it
can be lifted out of the tree and still locates its content.'
properties:
page:
description: 1-indexed page number this grounding is on. On a page node, the page's own number.
title: Page
type: integer
range:
$ref: '#/components/schemas/Range'
description: '`[start, end)` offsets into the top-level `markdown` string covered by this node or segment.'
box:
$ref: '#/components/schemas/Box'
description: Bounding box in normalized page coordinates (`0`–`1` fractions of page width/height, at most 8 decimal places). A page node's box is always the full page `{0, 0, 1, 1}`.
required:
- page
- range
- box
title: Grounding
type: object
BaseElementOptions:
additionalProperties: false
properties:
markdown:
default: true
title: Markdown
type: boolean
title: BaseElementOptions
type: object
Page:
properties:
type:
const: page
default: page
description: The node type. Identifies this node as a page in the structure tree.
title: Type
type: string
grounding:
$ref: '#/components/schemas/Grounding'
description: 'The page''s spatial data: `page` is the 1-indexed page number in the source document (not contiguous when `options.pages` filters out some pages); `range` covers this page''s content in the top-level `markdown` string (zero-length `start == end` for failed pages); `box` is always the full page `{0, 0, 1, 1}`.'
status:
default: ok
description: Whether this page was parsed successfully (`ok`) or failed (`failed`).
enum:
- ok
- failed
title: Status
type: string
reason:
anyOf:
- type: string
- type: 'null'
default: null
description: Failure reason. Present only when `status` is `failed`.
title: Reason
children:
description: The elements detected on this page, in reading order. Empty for failed pages.
items:
$ref: '#/components/schemas/Element'
title: Children
type: array
markdown:
anyOf:
- type: string
- type: 'null'
default: null
description: This page's slice of the top-level `markdown` string (`markdown[grounding.range.start:grounding.range.end]`). `""` for failed pages. Present only when `options.inline_markdown` is `true`.
title: Markdown
required:
- grounding
title: Page
type: object
Box:
description: 'Axis-aligned bounding box in normalized page coordinates.
Every value is a fraction of the page''s width (`xmin`/`xmax`) or height
(`ymin`/`ymax`) in `[0, 1]`, with at most 8 decimal places. To convert to
pixels, multiply by the dimensions of whatever raster of the page you are
drawing on. Coordinates are clamped and rounded at construction so the
in-process value always equals the serialized one.'
properties:
xmin:
description: Left edge as a fraction of the page width, in `[0, 1]`.
title: Xmin
type: number
ymin:
description: Top edge as a fraction of the page height, in `[0, 1]`.
title: Ymin
type: number
xmax:
description: Right edge as a fraction of the page width, in `[0, 1]`.
title: Xmax
type: number
ymax:
description: Bottom edge as a fraction of the page height, in `[0, 1]`.
title: Ymax
type: number
required:
- xmin
- ymin
- xmax
- ymax
title: Box
type: object
ParseBilling:
description: Billing summary for one parse request.
properties:
service_tier:
anyOf:
- enum:
- standard
- priority
type: string
- type: 'null'
description: 'The service tier the request ran in: `standard` or `priority`. A sync request reports `priority` (same lane, same price).'
title: Service Tier
total_credits:
anyOf:
- type: number
- type: 'null'
description: Credits charged for this request.
title: Total Credits
required:
- service_tier
- total_credits
title: ParseBilling
type: object
Element:
description: 'Hierarchical document element. All non-page elements share this shape.
Keys off `type`; optional fields are excluded from the serialized JSON
via ``exclude_none=True`` when not set.'
properties:
type:
description: The element type. Determines which optional fields appear on this elemen
# --- truncated at 32 KB (37 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/landingai/refs/heads/main/openapi/landingai-parse-api-openapi.yml