WePeopleDocs
IntegrationsPricingDocsSign inGet started
Get started
Docs home

Getting Started

  • What is WePeople
  • First week checklist
  • Core concepts

Product

  • Monitoring
  • Reports
  • People & profiles
  • SPACE scoring
  • Organization settings
  • Statistics
  • Billing & retention
  • Privacy model

Integrations

  • Overview
  • Slack
  • GitHub
  • Jira
  • Trust model

Developers

  • Platform overview
  • Quick start
  • Ingest guide
  • Custom statistics
  • Hosted MCP
  • TypeScript SDK

API Reference

  • Overview
  • Auth & headers
  • GET ping
  • POST events
  • POST snapshots
  • Apps statistics
  • Error codes
  • OpenAPI & SDK

Browse docs

API Reference

POST events

Ingest one or more events into the monitoring timeline. Events land as custom:<app-slug> rows grouped per worker. Batch limit: 100 events, body ≤ 1 MB.

Endpoint

POST/api/v1/ingest/events

Headers

FieldTypeNotes
AuthorizationBearerRequired.
Content-Typeapplication/jsonRequired.
Idempotency-Keystring ≤ 200Recommended. Replay-safe for 10 min.

Request body

FieldTypeNotes
eventsIngestEvent[]Required. 1 ≤ len ≤ 100.
events[].eventTypestringRequired. Must be whitelisted for this app.
events[].categoryEventCategoryRequired. One of: PRESENCE, COMMUNICATION, CODE_CHANGE, CODE_REVIEW, TASK_UPDATE, MEETING, DOCUMENT, AI_TASK.
events[].actorActorRequired. workerId, externalId, or email.
events[].timestampISO 8601Optional. Defaults to now.
events[].durationinteger secondsOptional. 0 ≤ d ≤ 86400.
events[].pillarStatisticPillarOptional override for rollup pillar.
events[].statisticIdstringOptional. Must exist in app manifest.
events[].metadataobjectOptional. ≤ 16 KB JSON.

Actor

FieldTypeNotes
workerIdstringExisting WePeople Worker.id.
externalIdstringYour stable id (preferred). Max 200 chars.
emailstringOrg directory match (last resort).
displayNamestringUsed when auto-provisioning a worker.

Example

curlbash
curl -X POST "https://wepeople.app/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": "TASK_UPDATE",
        "actor": { "externalId": "crm-user-42" },
        "duration": 240,
        "metadata": { "ticket_id": "SUP-431" }
      }
    ]
  }'

Response 202 / 207

Full success: 202 Accepted. Partial success: 207 Multi-Status — inspect results.rejected[].index to retry only failed rows.

application/jsonjson
{
  "requestId": "req_01HP3K5V4J3M9NVT8XZKQ9YQ2E",
  "accepted": 2,
  "rejected": 1,
  "batchLimit": 100,
  "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."
      }
    ]
  }
}

Errors

  • forbidden_event_type (403) — type not in app whitelist
  • batch_too_large(413) — > 100 events or body > 1 MB
  • missing_actor / worker_not_found — actor resolution failed
  • invalid_body (400) — schema validation
  • rate_limited (429) / quota_exceeded (402)

Full table: Error codes. Guide: Ingest guide.

On this page

  • Endpoint
  • Headers
  • Request body
  • Example
  • Response
  • Errors
WePeople

Team insight, not surveillance. A lead's-eye view built on metadata from the tools your team already uses — never source code, never messages, never DMs.

Product

  • Monitoring & Reports
  • SPACE scoring
  • Pricing

Docs

  • Docs home
  • Getting started
  • Developer platform
  • API reference
  • MCP

Integrations

  • Browse integrations

Company

  • Support
  • Status

Legal

  • Brand
  • Privacy
  • Terms

© 2026 WePeople. Built with care.

Metadata only. No source code, no message bodies, no DMs — read the policy.