QANATIX
Data Ingestion

API & Webhooks

Push data to QANATIX via REST API or webhooks.

API & Webhook Ingestion

Push data to QANATIX programmatically from your systems.

REST API push

Send a batch of records:

curl -X POST https://api.qanatix.com/api/v1/ingest/manufacturing/supplier/batch \
  -H "Authorization: Bearer sk_live_abc123..." \
  -H "Content-Type: application/json" \
  -d '{
    "records": [
      {
        "name": "New Supplier Entry",
        "source_id": "CRM-12345",
        "vertical_data": {
          "company": "Acme GmbH",
          "country": "DE",
          "certified": true
        }
      }
    ]
  }'

Upsert with source_id

Use source_id to make ingestion idempotent. If an entity with the same source_id already exists for this tenant, it's updated instead of duplicated.

This is essential for recurring data syncs:

# Daily sync from CRM — same source_id = update, new source_id = create
for customer in crm.get_updated_customers():
    records.append({
        "name": customer.name,
        "entity_type": "customer",
        "source_id": f"crm-{customer.id}",
        "vertical_data": customer.to_dict(),
    })

httpx.post(f"{QANATIX}/ingest/sales/customer/batch", json={"records": records})

Webhooks

Configure your system to POST to QANATIX when data changes:

# Your system sends this on every product update
curl -X POST https://api.qanatix.com/api/v1/webhooks/ingest/manufacturing/product \
  -H "Authorization: Bearer sk_live_abc123..." \
  -H "X-Webhook-Signature: sha256=..." \
  -H "Content-Type: application/json" \
  -d '{
    "records": [{
      "name": "Updated Product",
      "source_id": "PROD-789",
      "vertical_data": {"price": 12.50, "stock": 450}
    }]
  }'

Webhook signature verification

Set WEBHOOK_SECRET in your QANATIX config. Incoming webhooks are verified against the X-Webhook-Signature header using HMAC-SHA256.

Limits

LimitValue
Max records per batch10,000
Max request body50 MB
Rate limitPer API key tier

On this page