Skip to main content
The single entry point for agent telemetry. Authenticated via API key.

Endpoint

Headers

Request body

Validation

The payload is validated with Zod on the server. Failed validation returns 400 Bad Request with details. Unknown top-level keys are rejected; unknown keys inside metadata are accepted.

Identity resolution

The server resolves agentId to an internal cuid in this order:
  1. CUID match — if agentId matches /^c[a-z0-9]{24}$/, look up by primary key directly. Fastest path. Used by SDK 0.3.4+ after the first event populates .voight-agent-id.
  2. snsName match — for SNS domains like trading-bot.sol.
  3. displayName match — for renamed agents.
  4. Create new — if nothing matched, create a new Agent row.
The response always includes the resolved cuid as agentId, regardless of what you sent. Persist it locally to skip resolution on subsequent calls.

Response

202 Accepted

agentId in the response is the resolved cuid. eventId is the new event’s id.

400 Bad Request

401 Unauthorized

410 Gone

The agent has been soft-deleted from the dashboard. Ingestion is blocked. Subsequent requests for the same agentId will also return 410. The SDK can react by surfacing a warning to the user.

429 Too Many Requests

Headers include Retry-After. The SDK respects this automatically with exponential backoff.

500 / 502 / 503

Backend error. Retry with backoff. The SDK does this automatically; for direct HTTP callers, implement reasonable retries.

Side effects

When an event is accepted, the server also:
  • Updates agent.lastSeenAt to now (fire-and-forget)
  • Lazy-backfills agent.framework if the event has metadata.tool and the field was null
  • May trigger anomaly evaluation if this event crosses an alert threshold (next scheduler tick at most 5 minutes later)
  • Stores a contentHash (SHA-256 of the normalised payload) for future on-chain anchoring (mint flow ships in v1.0)

Pre-bound vs free API keys

When you create an API key in the dashboard:
  • Default: not bound to an agent. Caller specifies agentId per event.
  • Bound to an agent: caller can omit agentId; the server uses the bound one. Useful for autonomous bots where the key is dedicated.
Bound keys can’t be used to ingest events for other agents — Voight rejects mismatched agentId values.

Idempotency

Ingestion is not idempotent by default. Each call creates a new row. If you need dedup (e.g. retrying after timeout), generate a stable metadata.dedupKey on your side and reconcile downstream.

Rate limits

Burst limits are enforced today; monthly quotas ship server-side in v1.0 alongside Stripe billing.

Next