Contract
- shape
- entity
- authority
- act
- evidence
- none
- subscription
- false
- permission
- any one of: org.admin (carried by the caller's role template in the org `org_id`); a deactivated caller is refused first
- idempotency
- natural
- emits
- notification_policy.changed
- MCP tool
- set_notification_policy
- decision_set
- approve, reject, edit, request_info
- REST
- POST https://api.containertradehq.com/v1/cap/set_notification_policy
Through MCP this call returns an approval request first; see Approvals.
Idempotency: keyed by the contract's own inputs: the same inputs replay the first call's result
Inputs
| name | type | required | validation |
|---|---|---|---|
| org_id | org_id | required | tradehq-org-id; 1 to 20 characters The org whose notification settings are set. |
| kind | one_of | required | one of audit_digest, admin_alerts, access_request, break_glass, deletion, announcement The notice kind: audit_digest, admin_alerts, access_request, break_glass, deletion or announcement. |
| recipients | notice_recipients | required | 0 to 50 items The whole set the org requires, each {type: member, user_id}, {type: outside, email}, {type: slack, id} (a channel the org already holds) or {type: slack, channel_name, webhook_url} (a new one). An empty list requires nobody beyond the fixed recipients. |
| cadence | one_of | optional | one of hourly, daily The audit log digest only: hourly or daily (kept as it is when absent). |
Response
kind· string · The notice kind.title· string · Its name, as the page shows it.sent· string · When it is sent.fixed· string[] · The recipients fixed in code, which nothing removes: org_admins (every admin of the org) and, for a deletion, deleted_user (the user a user deletion is about).recipients· value · Who the org also requires: {members: [{user_id, name}], outside: [email], slack: [{id, channel_name}]}. A Slack channel is its name and id, never its webhook URL.cadence· stringnull · The audit digest's cadence, hourly or daily; null for every other kind.
Full JSON Schema
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"audit_digest",
"admin_alerts",
"access_request",
"break_glass",
"deletion",
"announcement"
],
"description": "The notice kind.",
"x-data-class": "operational"
},
"title": {
"type": "string",
"description": "Its name, as the page shows it.",
"x-data-class": "operational"
},
"sent": {
"type": "string",
"description": "When it is sent.",
"x-data-class": "operational"
},
"fixed": {
"type": "array",
"items": {
"type": "string"
},
"description": "The recipients fixed in code, which nothing removes: org_admins (every admin of the org) and, for a deletion, deleted_user (the user a user deletion is about).",
"x-data-class": "operational"
},
"recipients": {
"anyOf": [
{
"type": "object"
},
{
"const": "•••",
"description": "Masked by the caller's data policy."
},
{
"type": "null",
"description": "Denied by the caller's data policy."
}
],
"description": "Who the org also requires: {members: [{user_id, name}], outside: [email], slack: [{id, channel_name}]}. A Slack channel is its name and id, never its webhook URL.",
"x-data-class": "personal"
},
"cadence": {
"type": [
"string",
"null"
],
"enum": [
"hourly",
"daily",
null
],
"description": "The audit digest's cadence, hourly or daily; null for every other kind.",
"x-data-class": "operational"
}
},
"required": [
"kind",
"title",
"sent",
"fixed",
"recipients",
"cadence"
],
"additionalProperties": false
} Refusals
cadence_is_digest_only· 422 · a cadence was sent for a notice kind other than the audit log digestinvalid_email· 422 · an outside recipient is not an email addressinvalid_slack_webhook· 422 · a Slack channel's URL is not an incoming webhook, or its id is not one the org already holdsunknown_member· 422 · a member recipient is not a current member of the org
The platform refusals apply to every call: version, authentication, authority, validation and rate limits, each in the same envelope.
Surfaces
- Mobile: degraded: composition
- MCP: approval required
- Voice: degraded: composition
- OneBox: no document originates a notification settings
- Outbound: crosses to no counterparty
Events
notification_policy.changedaudit_only