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
| Limit | Value |
|---|---|
| Max records per batch | 10,000 |
| Max request body | 50 MB |
| Rate limit | Per API key tier |