QANATIX
Data Ingestion

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"

PDF

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..."

On this page