> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ndi.nace.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Format support

> Which file formats each operation accepts, and what limits apply

Format support varies per operation. Three layers narrow what each call will accept:

1. **Upload inspection** — NDI inspects a bounded prefix of the bytes on upload. A
   conclusive signature must agree with the filename extension. If the extension is
   missing or unknown, a recognized signature supplies the effective format. Formats
   without a reliable prefix signature continue to use the extension.
2. **Operation-level gates** — each workflow declares the file types it handles.
   `audio`, `video`, and `jsonl` are not accepted by `split`, `classify`, or `extract`,
   for example.
3. **Extension exceptions within a type** — a few types have sub-extension restrictions.
   `parse` accepts most image formats but not `.bmp`; `split` and `extract` accept
   spreadsheets but not `.parquet`.

Checking any one layer alone gives an incomplete picture: `EXTENSION_MAP` alone overstates
support, and a workflow's file-type gate alone misses the extension exceptions.

The multipart `Content-Type` is advisory and does not decide admission. NDI does not read
the full file to identify its format; it uses a bounded prefix, then streams the upload.
The original filename is preserved for display and downloads, while the effective format
controls routing, stored object metadata, and the media type used for previews and downloads.

***

## Per-operation matrix

`yes` — the file type is accepted and processed.
`no` — the operation rejects this type (returns `unsupported_file_type`).
`note` — accepted with a qualification described below the table.

| File type             | Extensions                                         | parse | split | classify | extract | ground |
| --------------------- | -------------------------------------------------- | ----- | ----- | -------- | ------- | ------ |
| `pdf`                 | `.pdf`                                             | yes   | yes   | yes      | yes     | yes    |
| `spreadsheet`         | `.xlsx` `.xlsm` `.xls` `.csv`                      | yes   | yes   | yes      | yes     | yes    |
| `spreadsheet_parquet` | `.parquet`                                         | yes   | no    | yes      | no      | yes    |
| `document`            | `.docx` `.doc` `.docm`                             | yes   | yes   | yes      | yes     | yes    |
| `image`               | `.png` `.jpg` `.jpeg` `.tiff` `.tif` `.webp`       | yes   | yes   | yes      | yes     | yes    |
| `image_bmp`           | `.bmp`                                             | no    | yes   | yes      | yes     | yes    |
| `presentation`        | `.pptx` `.ppt`                                     | yes   | yes   | yes      | yes     | yes    |
| `html`                | `.html` `.htm`                                     | yes   | yes   | yes      | yes     | yes    |
| `plaintext`           | `.txt` `.log` `.xml`                               | yes   | yes   | yes      | yes     | yes    |
| `diagram`             | `.vsdx` `.vsd`                                     | yes   | yes   | yes      | yes     | yes    |
| `markdown`            | `.md` `.mdx`                                       | yes   | yes   | yes      | yes     | yes    |
| `json`                | `.json`                                            | yes   | yes   | yes      | yes     | yes    |
| `jsonl`               | `.jsonl`                                           | no    | no    | no       | no      | yes    |
| `email`               | `.eml` `.msg` `.oft`                               | yes   | yes   | yes      | yes     | yes    |
| `video`               | `.mp4` `.mov` `.avi` `.mkv`                        | yes   | no    | no       | no      | yes    |
| `audio`               | `.mp3` `.wav` `.m4a` `.flac` `.mpga` `.oga` `.ogg` | yes   | no    | no       | no      | yes    |

### Notes

**`spreadsheet_parquet`** — `.parquet` maps to the spreadsheet file type but is handled
by a separate columnar path. `split` and `extract` reject it explicitly; `parse`,
`classify`, and `ground` process it via their parquet paths.

**`image_bmp`** — `.bmp` maps to the image file type. `parse` validates the extension
against its supported image set (`.png`, `.jpg`, `.jpeg`, `.tiff`, `.tif`, `.webp`) and
rejects `.bmp`. All other operations accept image files by type only and do not check the
extension further.

**`markdown`** — `parse` UTF-8-decodes `.md`/`.mdx` and uploads the source as the
markdown artifact (identity pass-through). The other operations resolve the
source URL directly as markdown without reparsing.

**Large plaintext** — workspace `.txt` upload, ingestion, search/read, and
Parse support sources up to 1 GiB. Large Parse results expose complete text at
`document.content_url` and keep only a representative preview inline. Split,
Extract, and Ground still require `.txt` sources to be at most 256 MiB. `.log`,
`.xml`, `.md`, and `.mdx` keep their existing source limits.

**`video` and `audio`** — `parse` transcribes audio and video. It validates the
extension: accepted video extensions are `.mp4`, `.mov`, `.avi`, `.mkv`; accepted audio
extensions are `.mp3`, `.wav`, `.m4a`, `.flac`, `.mpga`, `.oga`, `.ogg`. An extension
that maps to `video` or `audio` but is not on the respective list is rejected by `parse`.

**Ground semantics** — `ground` accepts every file type in the table above and returns a
structured response for each target. A type it cannot search returns `found=false` for
every target rather than an error; today no type falls into that case.

***

## Ingest size caps

These ceilings apply to workspace ingestion, not to granular uploads. Granular uploads
have a separate per-key limit; see [Errors and limits](/concepts/errors).

| Format group                                                                | Ingest ceiling |
| --------------------------------------------------------------------------- | -------------- |
| `plaintext_txt` (`.txt`)                                                    | `1024 MiB`     |
| `spreadsheet_xlsx` (`.xlsx` `.xlsm` `.xls`)                                 | `512 MiB`      |
| `spreadsheet_parquet` (`.parquet` and `.csv` / `.jsonl` via parquet ingest) | `5120 MiB`     |
