---
title: "Send an operator notice to every account owner"
method: POST
path: "/v1/admin/notices"
tags: ["meta"]
---

# Send an operator notice to every account owner

`POST /v1/admin/notices`

## Request

- Base URL: `https://api.hyperresearch.ai`
- URL: `https://api.hyperresearch.ai/v1/admin/notices`
- Auth: API key in cookie `hr_session`

The mechanism behind the notice promises in the published copy: 14 days for a material change (Terms §16), 30 days for discontinuation (Terms §13), breach notification without undue delay (Privacy §8). Until this existed none of that was sendable. Dry run unless `apply` is true, and the response carries the exact rendered subject and body either way. A legal notice ignores the per-person email switches — the email itself says so.

## Request body

- AdminNoticeBody
  - `template` 'terms_changed' | 'service_notice', required: `terms_changed` for a material change to the Terms (§16 — 14 days’ notice). `service_notice` for anything else everybody must be told: the service being discontinued (§13 — 30 days) or a security incident (Privacy §8 — without undue delay).
  - `notice_id` string, required: A stable id you choose: `terms-v1_1`, `incident-2026-09-18`. It IS the idempotency key — running the same notice twice writes no second row and mails nobody twice, so the recovery from "did that actually go out?" is to run it again rather than to guess.
  - `title` string, required: The subject line, and the opening line of the body.
  - `body` string, required: What you are telling people, in your own sentences. Plain text: it is escaped into the HTML part and never interpreted as markup.
  - `effective_date` string: When it takes effect, written as you want it read: `1 October 2026`.
  - `notice_days` integer: Days of notice being given. Defaults to 14 for a terms change.
  - `link` string, uri: Where the reader is sent. Defaults to the console’s legal page.
  - `apply` boolean: Absent or false is a DRY RUN: the exact rendered subject and body come back with the recipient count, and nothing is written or sent. `true` performs the send.
  - `limit` integer: Cap the fan-out. Bounded to 500 either way.

## Response `200`

The rendered notice, and what was done with it

- AdminNoticePreview
  - `template` string, required
  - `notice_id` string, required
  - `apply` boolean, required
  - `provider` string, required: What this deployment would use: `resend`, or `noop` while email is off.
  - `suppressed_because` string, nullable, required: The exact var that is missing, or null when the deployment can send. `EMAIL_ENABLED is not "true"` is the answer on a dark deployment.
  - `recipients` integer, required
  - `subject` string, required
  - `text` string, required: The plain-text body, byte for byte what would be sent.
  - `queued` integer, required
  - `duplicates` integer, required
  - `skipped` integer, required

## Other responses

- `400`: Invalid request
- `401`: Authentication failed
- `403`: Insufficient scope or plan
- `404`: Not found
- `429`: Rate limited or over quota
- `500`: Internal error

---

[API](https://skmtc.dev/hyperresearch/apis/hyperresearch-cloud-api.md) · [All operations](https://skmtc.dev/hyperresearch/apis/hyperresearch-cloud-api/llms.txt) · [OpenAPI document](https://skmtc.dev/hyperresearch/apis/hyperresearch-cloud-api/revisions/726ef831ebf4?raw)
