Skip to Content

Webhook Ingestion

Webhooks allow external systems to push data into Inspire’s DataPool in real time via HTTP POST requests. This is the fastest way to get data into Inspire — updates arrive the instant they are sent.

Webhook Endpoint

Each webhook connector provides a unique endpoint URL:

POST https://inspire.yourcompany.com/api/webhook/{stream-name}

Authentication

All webhook requests must include the connector’s ingest key:

curl -X POST https://inspire.yourcompany.com/api/webhook/sales \ -H "Authorization: Bearer ik_live_abc123..." \ -H "Content-Type: application/json" \ -d '{ "region": "North", "sales": 142000, "target": 130000 }'

Request Format

Single item

Send a JSON object to create or update a single item:

{ "region": "North", "sales": 142000, "target": 130000, "updated": "2026-04-06T10:30:00Z" }

Multiple items

Send a JSON array to upsert multiple items in one request:

[ { "region": "North", "sales": 142000, "target": 130000 }, { "region": "South", "sales": 98000, "target": 110000 }, { "region": "East", "sales": 156000, "target": 140000 } ]

Nested JSON flattening

Nested JSON objects are automatically flattened using dot notation:

{ "location": { "city": "London", "country": "UK" }, "metrics": { "footfall": 1250, "dwell_time": 3.5 } }

Results in DataPool fields: location.city, location.country, metrics.footfall, metrics.dwell_time.

Response

StatusMeaning
202 AcceptedData received and queued for processing
400 Bad RequestInvalid JSON payload
401 UnauthorizedMissing or invalid ingest key
413 Payload Too LargeRequest body exceeds 1 MB limit
429 Too Many RequestsRate limit exceeded

Webhook ingestion returns 202 Accepted immediately. Data processing happens asynchronously. The data typically appears in the DataPool within 100ms.

Custom ID Fields

By default, items are identified by their position in the payload. To specify a custom ID field, set the X-Item-Key header:

curl -X POST https://inspire.yourcompany.com/api/webhook/sales \ -H "Authorization: Bearer ik_live_abc123..." \ -H "Content-Type: application/json" \ -H "X-Item-Key: region" \ -d '{ "region": "North", "sales": 142000 }'

This ensures that subsequent updates with the same region value update the existing item rather than creating a new one.

Idempotency

Include an Idempotency-Key header to prevent duplicate processing:

curl -X POST https://inspire.yourcompany.com/api/webhook/sales \ -H "Authorization: Bearer ik_live_abc123..." \ -H "Content-Type: application/json" \ -H "Idempotency-Key: sale-north-20260406-1030" \ -d '{ "region": "North", "sales": 142000 }'

Requests with the same idempotency key within 24 hours are accepted but not reprocessed.

Integration Examples

From a CI/CD pipeline

# Post build metrics after deployment curl -X POST $INSPIRE_WEBHOOK_URL \ -H "Authorization: Bearer $INSPIRE_INGEST_KEY" \ -H "Content-Type: application/json" \ -d "{ \"build\": \"$BUILD_NUMBER\", \"status\": \"deployed\", \"duration_seconds\": $BUILD_DURATION, \"timestamp\": \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\" }"

From a Node.js application

const response = await fetch('https://inspire.yourcompany.com/api/webhook/app-metrics', { method: 'POST', headers: { 'Authorization': 'Bearer ik_live_abc123...', 'Content-Type': 'application/json', }, body: JSON.stringify({ active_users: 1250, requests_per_minute: 340, error_rate: 0.02, }), })
Last updated on