---
title: "Accept a legacy relay check-in"
method: POST
path: "/relays/events"
---

# Accept a legacy relay check-in

`POST /relays/events`

## Request

- Base URL: `https://api.endclose.com/v1`
- URL: `https://api.endclose.com/v1/relays/events`
- Auth: API key in header `X-API-KEY`

Accepted for legacy relay clients (v0.11.0–v0.12.4) that still call home with `{ "name", "properties" }` (`relay_boot`, `relay_heartbeat`, `relay_error`, `relay_shutdown`, `relay_killswitch`, `relay_config_applied`, `relay_batch_parked`, or whatever an older build sends). The body is logged and discarded: nothing is stored, and this is not a configuration channel. It does not return `{ config: { managed, fingerprint } }`. Current relays report themselves with PUT /relays/instances/{instance_id} and read configuration from GET /relays/config. A 204 with an empty body means the event was accepted. Same API-key auth as the other /relays endpoints.

## Request body

- object: Whatever the legacy client sends. `name` and `properties` are logged; other keys are logged too. Names are not validated.
  - `name` string
  - `properties` object: Event fields the client allowlists (version, config YAML, queue, routes, stack, …). Logged in full. `config` may be the relay's YAML; `stack` is treated as sensitive.

## Response `204`

Accepted and logged. Empty body. Not a configuration response.

## Other responses

- `400`: Body is not JSON, or exceeds 64 KB
- `401`: Unauthorized — missing, invalid, or revoked API key
- `403`: Forbidden — the key is a run-scoped agent session key, not a relay key

## Changes

- **2026-09-25** `96573b55a495`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/endclose/apis/end-close-api/changes/relays/events/post.md)

---

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