Skip to main content
NDI (Nace Document Intelligence) is a document-intelligence API. You send it a document — a PDF, a scanned image, a spreadsheet, an email, a Word file — and it gives you back structured, machine-usable output:

Parse

Convert any document into high-fidelity markdown. Spreadsheets become per-sheet markdown tables.

Ground

Locate values inside a source document and get back precise coordinates — bounding boxes on pages, cell ranges in spreadsheets, character ranges in text.

Categorize

Classify document segments and spreadsheet sheets against a taxonomy — yours or NDI’s default.
NDI is deliberately not a chat service, a search engine, or a QA system. It hands you markdown, categories, and grounding coordinates; you own embedding, retrieval, and orchestration on top of them.

How the API works

Every capability follows the same lifecycle:
  1. Give NDI a document — upload it with POST /upload, or point at an https:// or s3:// URL. See Files & sources.
  2. Start a job — call a method endpoint. Each method has a sync variant (POST /parse) that blocks until the result is ready, and an async variant (POST /parse_async) that returns a job_id immediately. See Jobs.
  3. Read the result — inline from the sync response, or by polling GET /jobs/{job_id}. Result artifacts (markdown files, cropped images) are returned as time-limited download URLs.

Base URL

https://ndi-api.nace.ai/api/v1
All endpoints in this documentation are relative to this base URL. Authentication is a single header — see Authentication. NDI also provides a hosted MCP integration at https://ndi-api.nace.ai/mcp for using the same document capabilities from Cursor and other compatible AI clients.

A 30-second taste

curl -s https://ndi-api.nace.ai/api/v1/parse \
  -H "X-API-Key: $NDI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "file": {
      "source_url": "https://example.com/annual-report.pdf",
      "file_name": "annual-report.pdf"
    }
  }'
{
  "job_id": "0c9b2c1e-8f4a-4a91-b7a5-3f2d1e0a9c8b",
  "action": "parse",
  "status": "succeeded",
  "result": {
    "result_type": "parse",
    "status": "success",
    "item": {
      "item_type": "file",
      "markdown_url": "https://…(time-limited download URL)…",
      "page_count": 96,
      "char_count": 184223,
      "extraction_duration_ms": 41250
    }
  },
  "created_at": "2026-07-12T21:04:11Z",
  "started_at": "2026-07-12T21:04:12Z",
  "completed_at": "2026-07-12T21:04:53Z"
}
Ready to make your first call? Head to the Quickstart.