Moderation & statuses
Concepts

Moderation & statuses

Nothing posted through the API skips review — every status enum and lifecycle in one place.

View as MarkdownUpdated Aug 19, 2026

Everything created through the API runs the same review pipeline as the dashboard: captions and names go through the prohibited-word filter, media rides the NSFW pipeline. The API cannot bypass review — by design.

The enum#

moderationStatus on vault items, posts and drops is one of:

ValueMeaning
PENDINGIn review. Normal, not an error — it clears by itself.
APPROVEDCleared. Usable and visible.
FLAGGEDHeld for human review. May still become APPROVED.
REJECTEDRefused. Will not go live.

Vault item lifecycle#

Upload → PENDINGAPPROVED, FLAGGED or REJECTED. Two things to know:

  • GET /vault returns only approved items by default. Pass includePending=true to see items still in review — those come back with their moderationStatus and an empty filePath until approved.
  • Review takes real minutes. Upload, then poll the list rather than assuming instant availability.

Video processing is separate from moderation#

A video must first finish processing on the CDN (encode, thumbnails), then it enters moderation. POST /vault/video-status reports processing only: { isReady, isProcessing, isFailed }. isReady: true does not mean approved — check the vault list for moderationStatus after processing completes.

Drop status — derived from its items#

A drop’s status is computed from its vault items: any REJECTED or FLAGGED item wins, else any PENDING item makes the drop PENDING, else it is APPROVED. As of this release the status is computed correctly at creation — a drop built from approved items is born APPROVED and can be attached to a post immediately. Read it back with GET /drops/{id}.

Post status and live#

Posts carry the same enum plus live — true only when the post is APPROVED and its publish time has passed. A scheduled, approved post is not live yet. Text posts with clean captions usually approve instantly; media posts stay PENDING until every image clears.

The word filter#

  • POST /posts: a caught caption returns 422 { "error": …, "matchedWord": "…" } — rewrite and retry once.
  • POST /drops: a caught name or description returns 400 { "error": …, "field": "…", "matchedWord": "…" }.

Polling guidance#

Poll GET /posts/{id} or the vault list every 30–60 seconds while something is PENDING, and stop on any terminal state. Budget it against your rate tier.

Next: Money & units or Pagination & batch limits.

Questions? [email protected]