Keys and email subscriptions
Create verified-email keys, choose alert filters and stop delivery when you need to.
Get a key
- Send a JSON email field to
POST /api/v1/keys. It answers202withstatus: acceptedand a detail message, without revealing whether the address already has a key. Delivery is not guaranteed by that response; a deployment without its mailer configured sends nothing. - Open the single-use link in the email within 30 minutes. GET shows a confirmation form; scanners cannot spend the token by fetching it.
- Submit the form to
POST /keys/verifywith itstokenfield. The HTML response shows the newcm_live_key once. Store it securely; it cannot be retrieved later. Invalid, expired and used tokens answer 400. - Send the key as
Authorization: Bearer cm_live_.... Invalid or revoked keys answer 401. DELETE the calling key at/api/v1/keys/meto revoke it immediately; it cannot authenticate again.
Key pages and key/subscription responses are private and no-store. Key and subscription writes use JSON; verification uses a regular form. All API requests follow the rate limits.
curl -X POST 'https://claudemon.com/api/v1/keys' -H 'Content-Type: application/json' -d '{"email":"you@example.com"}'
Endpoint reference
| Method and path | Authorization | Response |
|---|---|---|
POST /api/v1/keys | No key | 202 accepted; 400 invalid email; 429 limited |
GET /keys/verify?token={token} | Email link | 200 confirmation page; 400 malformed link |
POST /keys/verify | Form token | 200 key shown once; 400 spent or expired link |
GET /api/v1/keys/me | Bearer key | 200 key metadata |
DELETE /api/v1/keys/me | Bearer key | 200 revoked key ID and revoked_at |
POST /api/v1/subscriptions | Bearer key | 201 created; 200 identical active subscription; 409 cap |
GET /api/v1/subscriptions | Bearer key | 200 all this key's subscriptions, including disabled |
DELETE /api/v1/subscriptions/{id} | Owning key | 200 disabled subscription; 404 missing or another key's ID |
GET /alerts/unsubscribe?token={token} | Signed email link | 200 confirmation page |
POST /alerts/unsubscribe?token={token} | Signed email link | 200 unsubscribed; 400 invalid signature |
The API responses below are JSON. Verification and unsubscribe pages return HTML. API errors use problem+json; missing or invalid bearer keys return 401. Repeated scalar presentation parameters can return 400 before the route.
Create an email subscription
POST a JSON object to /api/v1/subscriptions. channel is optional and accepts only email. filters is optional and defaults to the values below. Unknown body/filter fields return 400. Write bodies are limited to 8192 bytes, including streamed requests; larger bodies return 413. The destination is always the key's verified email address; a client cannot supply another recipient.
labs: an array ofanthropic,openai,google,xaiormeta. Empty means every lab. Duplicates are removed and the array is sorted.kinds: a nonempty array ofdeprecationorincident; defaults to both.min_impact:critical,major,minorormaintenance, defaultminor. It applies only to incidents; unknown upstream impact is treated as minor. Resolution matching uses the occurrence’s peak observed impact, so a downgrade does not suppress its closing notice. A reopened occurrence starts a new peak.
A key may have 10 active subscriptions. An identical active normalized filter set returns the existing subscription with 200, including on retries; a new subscription returns 201 with a Location header. At the cap, a different filter set returns 409. Each key retains at most 100 subscription records including disabled history; creating more returns 409 when that history is full. Disabled subscription records are retained; another key has its own allowance.
{
"channel": "email",
"filters": {
"labs": [],
"kinds": [
"deprecation",
"incident"
],
"min_impact": "minor"
}
}
curl -X POST 'https://claudemon.com/api/v1/subscriptions' -H 'Authorization: Bearer YOUR_KEY' -H 'Content-Type: application/json' -d '{"filters":{"labs":["openai"],"kinds":["incident"],"min_impact":"major"}}'
Response shapes
GET /api/v1/keys/me returns { data: key }. Key fields are id, prefix, email, created_at, last_used_at or request_count; the secret is never returned. DELETE returns { data: { id, revoked_at } }.
Create and delete subscription calls return { data: subscription }. GET /api/v1/subscriptions returns { data: [subscription] }, without pagination (at most 100 records). Each subscription has id, channel, destination, filters, verified_at, created_at or disabled_at. A null disabled_at means active; deletion disables rather than removes the record. Timestamps are ISO 8601 UTC.
Stop alerts
DELETE /api/v1/subscriptions/{id} with the owning bearer key to disable one subscription. Revoking a key also stops its subscriptions from sending. Token confirmation and unsubscribe routes apply IP limits before token processing and return 429 with Retry-After when exceeded.
Every alert includes a signed unsubscribe URL. GET asks for confirmation; POST disables that subscription. The same POST endpoint accepts the mail client's List-Unsubscribe=One-Click form body with its signed token in the query, without an API key. A changed signature answers 400.
Alerts cover newly observed deprecations and incident openings, escalations and resolutions. Imports, corrections, events older than the subscription and events outside the one-hour delivery window do not send. Delivery retries keep the same request and stop after the retry/age limit.