Skip to main content

Content moderation

Sellable product

This capability is granted by an API key scoped to the `` product (product face). See the product reference below.

Content-report-queue capability — a durable, org-scoped report-lifecycle FSM: a user reports content (dup-suppressed: one open PENDING report per (org, article, user)) → it enters an admin review queue → an admin transitions it dismissed | reviewed | actioned. Plus GDPR endpoints: Art. 20 export (a user's reports) and Art. 17(3)(e) anonymize-retain (rebind the reporter user_id in place + stamp anonymized_at, retaining the record — content-moderation evidence is regulatory-retained). Per-vertical thresholds / category rules / the news ForumCategoryManager + DMCA takedown FSM stay product-local (I5). I4: own Postgres store, never a product Mongo.

  • Group: Content & media
  • Contract: contracts/content-moderation/v1/openapi.yaml
  • Public base: https://api.vagarylabs.com (the consolidated API gateway — one host, per-brand sibling api.<zone>)
  • Auth: a product API key (vgk_…) issued from the console — Authorization: Bearer vgk_…
  • Product face (customer-keyed):
    • https://api.vagarylabs.com/product/v1/moderation/reports

Endpoints

MethodPathSummary
POST/v1/reportsFile a report (dup-suppressed) for the caller's org
GET/v1/reportsList reports (filter by status / article_id / site_id), newest-first
GET/v1/reports/pendingThe review queue (status='pending')
GET/v1/reports/countQueue depth (optionally by status)
GET/v1/reports/exportGDPR Art. 20 — every report a user filed (org-scoped)
POST/v1/reports/anonymizeGDPR Art. 17(3)(e) — anonymize (rebind user_id + stamp anonymized_at) and RETAIN a user's reports
POST/v1/reports/&#123;report_id&#125;/reviewFSM transition — dismiss
GET/healthliveness
GET/metricsPrometheus

Schemas

SubmitRequest

FieldTypeDescription
organization_idstringproduct-tier tenant (I6)
article_idstringthe reported content id
user_idstringthe reporter
reasonstring
detailsstringfree text, truncated to the details cap
site_idstringmulti-brand sub-site (within the org); omit for a global report

ReviewRequest

FieldTypeDescription
organization_idstring
actionstringthe FSM verb
reviewer_idstring
notesstring

AnonymizeRequest

FieldTypeDescription
organization_idstring
user_idstringthe reporter user_id to anonymize
anon_user_idstringthe anonymized rebind value, e.g. [deleted_<prefix>]

Report

FieldTypeDescription
idstring
article_idstring
user_idstring
reasonstring
detailsstring
statusstring
created_atnumberepoch seconds
reviewed_at['number', 'null']
reviewer_id['string', 'null']
notesstring
site_idsarraypresent only when the report was site-scoped
duplicatebooleantrue when an open PENDING report already existed (dup-suppressed)

ReportList

FieldTypeDescription
reportsarray
countinteger

CountResult

FieldTypeDescription
countinteger

ExportResult

FieldTypeDescription
reportsarray
user_idstring

AnonymizeResult

FieldTypeDescription
anonymizedintegernumber of reports rebound + retained
user_idstring
anon_user_idstring

Generated by scripts/gen-capability-docs.py from contracts/content-moderation/v1/openapi.yaml — the contract IS the source of truth; edit the contract, not this page.