File Upload
Upload CSV, JSON, NDJSON, and PDF files to QANATIX.
File Upload
Upload files directly to QANATIX. Supported formats: CSV, JSON, NDJSON, PDF.
CSV
curl -X POST https://api.qanatix.com/api/v1/ingest/manufacturing/supplier/upload \
-H "Authorization: Bearer sk_live_abc123..." \
-F "file=@suppliers.csv"The entity_type is part of the URL path (supplier in this case). CSV columns are mapped to vertical_data fields automatically. The name column (if present) becomes the entity name. All other columns go into vertical_data.
You can specify which column to use as the name:
-F "name_column=company_name"JSON
Upload a JSON file containing an array of records:
curl -X POST https://api.qanatix.com/api/v1/ingest/manufacturing/product/upload \
-H "Authorization: Bearer sk_live_abc123..." \
-F "file=@products.json"Expected format:
[
{"name": "Product A", "sku": "SKU-001", "price": 12.50},
{"name": "Product B", "sku": "SKU-002", "price": 8.75}
]NDJSON
Newline-delimited JSON — one record per line:
curl -X POST https://api.qanatix.com/api/v1/ingest/manufacturing/event/upload \
-H "Authorization: Bearer sk_live_abc123..." \
-F "file=@events.ndjson"QANATIX extracts text from PDFs using pymupdf4llm, producing clean markdown optimized for LLM consumption.
curl -X POST https://api.qanatix.com/api/v1/ingest/manufacturing/document/pdf \
-H "Authorization: Bearer sk_live_abc123..." \
-F "file=@datasheet.pdf"Chunking strategy:
- PDFs with 1-3 pages: combined into one entity
- PDFs with 4+ pages: one entity per page
Each entity includes page numbers and document metadata in vertical_data.
Batch JSON API
For programmatic ingestion, use the batch endpoint:
curl -X POST https://api.qanatix.com/api/v1/ingest/manufacturing/fastener/batch \
-H "Authorization: Bearer sk_live_abc123..." \
-H "Content-Type: application/json" \
-d '{
"records": [
{
"name": "Steel Bolt M12x80",
"source_id": "ERP-001",
"vertical_data": {
"material": "Carbon Steel",
"price_eur": 0.15
}
}
]
}'Use source_id for upsert behavior — if an entity with the same source_id exists, it's updated instead of duplicated. The entity_type is specified in the URL path, not in each record.
Response
{
"ingestion_id": "...",
"status": "processing",
"record_count": 150,
"duplicate_count": 3,
"entity_ids": ["...", "..."]
}Check status:
curl https://api.qanatix.com/api/v1/ingestions/\{ingestion_id\} \
-H "Authorization: Bearer sk_live_abc123..."