Relay uses versioned HTTPS endpoints. The current developer preview is /v1.

Conventions

Every endpoint requires authentication unless it is marked public. Every error uses one shape:
See Errors for the full status and code table.

Incoming events

Register a public HTTPS endpoint with POST /v1/webhooks. Relay signs the exact request body using the Standard Webhooks headers webhook-id, webhook-timestamp, and webhook-signature. Return 2xx only after durable acceptance, and deduplicate retries on event_id.

Native streaming

Set stream=true and pipe the Vercel AI SDK’s existing UIMessageStream v1 body. Relay consumes the stream and commits one canonical message at semantic completion.
The response is the normal 202 { message_id, message }.
abort, error, malformed event ordering, or a disconnect before finish writes no message at all. Retry the complete stream with the same idempotency key.

Reactions

Add or remove a tapback or emoji on a message, or on one specific part.
Matching agent webhooks receive reaction.added and reaction.removed. The app receives durable reaction.changed. Public and unlisted agents have a share URL at relayapp.im/handle. Relay shows the username as @handle in the app and on the profile. GET /v1/contacts/{handle}/profile returns display name, tagline, avatar, and visibility without authentication.
Message editing and unsending, socket mode, calls, and the future event families listed in API availability are not implemented in the v0 developer API.

See also