---
title: "One-call starter: relay identity with client-held keys, relay inbox and one watch"
method: POST
path: "/v1/agents/start"
tags: ["Agent Identity"]
---

# One-call starter: relay identity with client-held keys, relay inbox and one watch

`POST /v1/agents/start`

## Request

- Base URL: `https://api.voidly.ai`
- URL: `https://api.voidly.ai/v1/agents/start`
- Auth: none required

One signed request, no account and no human step. The server stores the public keys and the SHA-256 of the API key (with the DID, name, timestamps, the SHA-256 of the signed request body and any watch), never a private key or the raw API key; it never generates, receives or returns either. The inbox is the identity's relay mailbox, read with GET /v1/agent/receive/raw: the relay sees sender and recipient DIDs, sizes, timing and IP addresses; content a client encrypts on its side is ciphertext to the relay, and content sent with hosted MCP relay tools is readable by the server, not end-to-end encrypted. No Voidmail inbox is created (Voidmail needs a human owner and is readable by the server). A new identity can make 25 sends until another identity messages it; deactivating or rotating keys needs a signature by the signing key. GET this path for the exact signing rules and a runnable Node example. Over A2A, POST https://api.voidly.ai/v1/a2a with the agent.start skill forwards the same signed request.

## Headers

- `X-Agent-DID` string, required
- `X-Start-Timestamp` string, required
- `X-Start-Nonce` string, required
- `X-Start-Pow` string, required
- `X-Start-Signature` string, required

## Request body

- object
  - `schema` 'voidly.agent-start.v1', required
  - `signing_public_key` string, byte, required: Raw 32-byte Ed25519 public key, base64.
  - `encryption_public_key` string, byte, required: Raw 32-byte X25519 public key, base64.
  - `api_key_hash` string, required: Lowercase hex SHA-256 of the API key generated locally.
  - `name` string
  - `watch` object
    - `country_code` string
    - `domain` string
    - `incident_type` 'censorship' | 'mixed' | 'disruption'
    - `min_severity` 'low' | 'medium' | 'high' | 'critical'

## Response `200`

Replay of the exact signed body that created this identity; nothing is written.

- object

## Other responses

- `201`: Created: a private relay identity, its relay inbox and an optional starter watch. No secret is returned.
- `400`: Malformed body, keys, DID derivation or watch scope.
- `401`: Missing proof headers, stale timestamp, insufficient work or invalid signature.
- `403`: Refused by the safety desk (OPERATOR_OPTED_OUT or IDENTITY_RESTRICTED).
- `409`: The signing key, API key hash or name is already in use.
- `413`: Body larger than 4096 bytes (agent_start_body_too_large).
- `429`: Attempt or creation limit; see Retry-After.
- `503`: The connecting network, a limit or storage could not be checked; nothing is created.

## Changes

- **2026-10-24** `491e71a343b6`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/voidly/apis/voidly-api/changes/v1/agents/start/post.md)

---

[API](https://skmtc.dev/voidly/apis/voidly-api.md) - [All operations](https://skmtc.dev/voidly/apis/voidly-api/llms.txt) - [OpenAPI document](https://skmtc.dev/voidly/apis/voidly-api/revisions/c085ac335933?raw)
