/api/v1/ingest/pingValidate a key and echo the app it belongs to.
Request
No body, no query parameters. Send your bearer token and the server responds immediately.
curl "$WEPEOPLE_BASE_URL/api/v1/ingest/ping" \
-H "Authorization: Bearer $WEPEOPLE_API_KEY"Response 200
{
"ok": true,
"organizationId": "org_2Mf1…",
"app": {
"id": "app_2Nh8…",
"slug": "crm-hub",
"name": "CRM Hub"
}
}/api/v1/ingest/eventsIngest one or more events into the monitoring timeline.
Request body
| Field | Type | Notes |
|---|---|---|
| events | IngestEvent[] | Required. 1 ≤ len ≤ 500. |
| events[].eventType | string | Required. Must be whitelisted for this app. |
| events[].category | EventCategory | Required. One of the seven categories. |
| events[].actor | Actor | Required. One of workerId / externalId / email. |
| events[].timestamp | ISO 8601 | Optional. Defaults to now. |
| events[].duration | integer seconds | Optional. 0 ≤ d ≤ 86400. |
| events[].metadata | object | Optional. ≤ 16 KB JSON. |
Headers
| Field | Type | Notes |
|---|---|---|
| Authorization | Bearer | Required. |
| Idempotency-Key | string ≤ 200 | Recommended. Replay-safe for 10 min. |
| Content-Type | application/json | Required. |
Example
curl -X POST "$WEPEOPLE_BASE_URL/api/v1/ingest/events" \
-H "Authorization: Bearer $WEPEOPLE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: crm-batch-8412" \
-d '{
"events": [
{
"eventType": "ticket.resolved",
"category": "project_management",
"actor": { "externalId": "crm-user-42" },
"duration": 240,
"metadata": { "ticket_id": "SUP-431" }
}
]
}'Response 202 / 207
Full success returns 202 Accepted. Partial success returns 207 Multi-Status; results.rejected[].index points at the original request indices so retries stay targeted.
{
"requestId": "req_01HP3K5V4J3M9NVT8XZKQ9YQ2E",
"accepted": 2,
"rejected": 1,
"batchLimit": 500,
"results": {
"accepted": [
{ "eventType": "ticket.resolved", "timestamp": "2026-04-19T12:05:00Z" },
{ "eventType": "ticket.resolved", "timestamp": "2026-04-19T12:06:10Z" }
],
"rejected": [
{
"index": 2,
"code": "forbidden_event_type",
"message": "eventType 'deploy.shipped' is not whitelisted."
}
]
}
}/api/v1/ingest/snapshotsReplace the current snapshot card for a worker.
Request body
| Field | Type | Notes |
|---|---|---|
| snapshotType | string | Required. Stable id for this kind of snapshot. |
| actor | Actor | Required. |
| timestamp | ISO 8601 | Optional. |
| metrics | Record<string, Metric> | Required. Number, string label, or {value, unit, label}. |
| metadata | object | Optional. ≤ 16 KB JSON. |
Response 202
{
"requestId": "req_01HP3K5V4J3M9NVT8XZKQ9YQ2E",
"ok": true,
"snapshotType": "tickets_open",
"worker": { "id": "wrk_2Mf…", "displayName": "Alex Chen" }
}Error codes
Every error uses the shape { error: { code, message, requestId, docsUrl } }. Check code first — message is human-friendly and subject to copy edits.
| Code | HTTP | When |
|---|---|---|
| missing_authorization | 401 | No Authorization header present. |
| invalid_key | 401 | Key does not exist or is malformed. |
| key_revoked | 401 | Key was revoked in the Developer tab. |
| key_expired | 401 | Key is past its expiresAt. |
| plan_disabled | 402 | Your plan does not include the developer API. |
| quota_exceeded | 402 | Monthly event quota exhausted for the org. |
| rate_limited | 429 | Per-key or per-org burst exceeded. |
| forbidden_event_type | 403 | eventType is not in the app's whitelist. |
| invalid_body | 400 | Zod validation failed; error.message lists issues. |
| batch_too_large | 413 | Body > 1 MB or batch > 500 events. |
| missing_actor | 400 | actor lacks workerId, externalId, and email. |
| worker_not_found | 404 | workerId did not resolve for this org. |
| internal_error | 500 | Unexpected failure; retry with backoff. |
Machine-readable
Drop /openapi/v1.yaml into Stoplight, Scalar, Redocly, or openapi-typescript to generate typed clients in your own stack.