> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.eyelevel.ai/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.eyelevel.ai/_mcp/server.

## Supported File Types

There are four ways to upload content to GroundX:

* [Ingest Local](/reference/api-reference/documents/ingest-documents/ingest-local): uploads individual files from your local filesystem.
* [Ingest Remote](/reference/api-reference/documents/ingest-documents/ingest-remote): uploads individual files hosted on a remote URL.
* [Ingest Directories](/reference/api-reference/documents/ingest-directories): uses the Python SDK to find files in a directory tree and upload them in batches.
* [Crawl Website](/reference/api-reference/documents/crawl-website): follows website links and uploads the HTML to GroundX.

Supported document types:

```
pdf, docx, pptx, xlsx, csv, tsv, json, txt, hwp
```

Supported image types:

```
bmp, gif (not animated), heif (or heic), ico, jpg (or jpeg), png, svg, tiff (or tif), webp
```

## Maximum File Size

Free-trial file-size limits:

* Python SDK:
  * 25 MB per file (for [ingest](/reference/api-reference/documents/ingest-documents), [ingest_directory](/reference/api-reference/documents/ingest-directories), or [ingest_remote](/reference/api-reference/documents/ingest-documents/ingest-remote))
  * 8 MB per file (for [ingest_local](/reference/api-reference/documents/ingest-documents/ingest-local))
* TypeScript SDK:
  * 25 MB per file (for hosted files using either [ingest](/reference/api-reference/documents/ingest-documents) or [ingest_remote](/reference/api-reference/documents/ingest-documents/ingest-remote))
  * 8 MB per file (for local files using either [ingest](/reference/api-reference/documents/ingest-documents) or [ingest_local](/reference/api-reference/documents/ingest-documents/ingest-local))
* Direct API:
  * 25 MB per file (for hosted files using [ingest_remote](/reference/api-reference/documents/ingest-documents/ingest-remote))
  * 8 MB per file (for local files using [ingest_local](/reference/api-reference/documents/ingest-documents/ingest-local))

Subscription file-size limits:

* Python SDK:
  * 50 MB per file (for [ingest](/reference/api-reference/documents/ingest-documents), [ingest_directory](/reference/api-reference/documents/ingest-directories), or [ingest_remote](/reference/api-reference/documents/ingest-documents/ingest-remote))
  * 8 MB per file (for [ingest_local](/reference/api-reference/documents/ingest-documents/ingest-local))
* TypeScript SDK:
  * 50 MB per file (for hosted files using either [ingest](/reference/api-reference/documents/ingest-documents) or [ingest_remote](/reference/api-reference/documents/ingest-documents/ingest-remote))
  * 8 MB per file (for local files using either [ingest](/reference/api-reference/documents/ingest-documents) or [ingest_local](/reference/api-reference/documents/ingest-documents/ingest-local))
* Direct API:
  * 50 MB per file (for hosted files using [ingest_remote](/reference/api-reference/documents/ingest-documents/ingest-remote))
  * 8 MB per file (for local files using [ingest_local](/reference/api-reference/documents/ingest-documents/ingest-local))

> **Why the difference?**
>
> The Python SDK uploads local files using temporary presigned URLs, then submits their hosted URLs through `ingest_remote`. This avoids the 8 MB limit on direct `ingest_local` requests.
>
> For public files, TypeScript and REST callers can follow the same steps manually:
>
> 1. Request a presigned URL from `https://api.eyelevel.ai/upload/file?name={fileName}&type={fileExtension}`.
> 2. PUT the file to the returned `URL`.
> 3. Submit its hosted URL as `sourceUrl` in an `ingest_remote` request.
>
> An MCP host can use `document_uploadlocal` to get the presigned URL, then PUT the file and call `document_ingestremote`. The host must be able to read the local file and perform HTTP PUT. See [Connect Hosted GroundX MCP Tools](/documentation/agent-harness/connect-hosted-mcp-tools#local-files).
>
> Protected files require the private-upload flow on a compatible deployment. See [File Access and Sharing](/documentation/fundamentals/file-access-and-sharing).

For oversized files, compress embedded assets such as images, or split the file into smaller documents.

[Ingest Directories](/reference/api-reference/documents/ingest-directories) uses the Python SDK upload flow and its per-file limits. Direct [Ingest Local](/reference/api-reference/documents/ingest-documents/ingest-local) requests remain limited to 8 MB.

## Maximum Concurrent Files

At most **50 files** can be ingested concurrently.

[Ingest Directories](/reference/api-reference/documents/ingest-directories) in the [Python SDK](https://pypi.org/project/groundx/) batches uploads according to `batch_size`. For manual batching, wait for each batch to finish using [get_processing_status_by_id](/reference/api-reference/documents/get-processing-status-by-id). See the [Quickstart](/documentation/get-started/direct-sdk-api-quickstart).

## Document Type Specific Restrictions

#### PDF | PPTX | DOCX | HWP

**Maximum Pages**

PDF, PPTX, DOCX and HWP files are limited to **750 pages**.

#### CSV | TSV | XLSX

**Maximum Words**

CSV, TSV and XLSX files are limited to **250,000 words for trial users and 500,000 words for subscribers**.

**Maximum Rows**

CSV, TSV and XLSX files are limited to **1,500 rows**.

#### TXT

**Maximum Words**

TXT files are limited to **250,000 words for trial users and 500,000 words for subscribers**.

#### JSON

**Maximum File Size**

JSON files are limited to **5 MB**, regardless of the general file-size limits above.

**Maximum Levels**

JSON files are limited to **20 levels** of nested objects or arrays.

## Visual X-Ray Support

Every supported document type can produce [X-Ray analysis](/documentation/guides/x-ray-document-parsing), available through the API and as a dashboard download.

These file types skip visual layout analysis and cannot be displayed in the dashboard's visual X-Ray viewer:

* csv
* json
* tsv
* txt
* xlsx

## Website Crawling

Use [Crawl Website](/reference/api-reference/documents/crawl-website) to ingest website content.

Trials allow up to 500 pages and a crawl depth of 5. Subscriptions allow up to 2,000 pages and a depth of 8.

> **Note**
>
> The crawler reads source HTML. Page structure can affect the content it extracts.