- Webhook push — Open Notes calls your registered endpoint. Recommended for production.
- Poll — Your integration calls
GET /api/public/v1/moderation-actionson a schedule. Used by the Discourse plugin today.
Option A — Webhook delivery
If you have registered a webhook endpoint (see Webhooks), Open Notes will POST a payload to your URL when a consensus decision is reached. The payload looks like this:Option B — Polling
PollGET /api/public/v1/moderation-actions for actions with action_state=proposed scoped to your community:
Query parameters
| Parameter | Required | Description |
|---|---|---|
community_server_id | yes | Your community-server UUID from Step 2. |
action_state | recommended | Filter to proposed to find unprocessed actions. |
action_tier | optional | tier_1_immediate or tier_2_consensus. |
limit | optional | Page size (default 20, max 100). |
offset | optional | Pagination offset. |
Action types and what they mean
action_type | What your integration should do |
|---|---|
hide | Hide the post from public view. |
unhide | Restore a previously hidden post. |
warn | Issue a warning to the author; do not hide. |
silence | Silence the author on your platform. |
delete | Permanently delete the post. |
Applying the action
Once you have determined which action to apply, execute it on your platform, then acknowledge by updating the action state viaPATCH /api/public/v1/moderation-actions/{action_id}:
action_state to applied after you execute the action on your platform. This signals to Open Notes that delivery was successful and closes the loop.
Reference implementation
The Discourse plugin applies consensus actions inOpenNotes::ActionExecutor.execute_action:
hide_post checks post.hidden? before calling post.hide!, and unhide_post checks post.hidden? before calling post.unhide!. Apply the same guard in your integration.
API reference
GET /api/public/v1/moderation-actions— list actionsPATCH /api/public/v1/moderation-actions/{action_id}— acknowledge
Next: Step 5 — Webhooks and retries