Start inputs
Upload moderation
Passed by the calling system
Media & Evidence package
Uploads arrive by API: AI safety analysis of images and videos, threshold rules that auto-approve or reject clear cases, a moderator queue for the rest, and the uploader is told.
Connects to Google Gemini
About this package
User-generated media moderation starts when your site or app posts an upload to the workflow: its id, a download URL, whether it is an image or a video, the uploader and the caption.
Analyze Image (or Analyze Video for clips) describes the upload and answers a structured moderation question: a risk score from 0 to 1, the top category (nudity, violence, hate, harassment, self-harm, drugs, weapons, spam), a possible child safety concern, whether people are visible and a one-sentence reason. The Moderation thresholds decision table auto-approves low risk, auto-rejects high risk and sends borderline items, self-harm and any child safety concern to a person.
Moderators get a task with the AI reason clearly marked as a triage aid and approve or reject with the guideline that applies. Your platform is called to publish or hide the upload (placeholder REST API), the uploader is emailed with how to appeal, and every decision is logged with a one-year retention policy.
Headless: your platform calls the start API (or an inbound webhook) for each new upload.
Another system starts it over REST or an inbound webhook. No UI is needed; people only appear where a decision needs a human.
The flow
Upload received
Your platform posts the upload id, media URL and type, uploader and caption.
AI safety analysis
Analyze Image or Analyze Video returns a description and a structured verdict: risk score, category, child safety concern, people visible, reason.
Thresholds
The Moderation thresholds decision table approves low risk, rejects high risk and queues the rest for a person.
Moderator queue
Borderline uploads become tasks: the moderator approves, or rejects with the guideline.
Publish or hide
The platform API publishes or hides the upload and the uploader is emailed (with how to appeal).
Log
Every check and decision is logged with who decided and why, under a one-year retention policy.
Forms
The inputs a caller passes when it starts a run, and the forms people complete when the process needs a decision.
Start inputs
Passed by the calling system
User Task
{{priority}}: {{upload_id}} ({{verdict.category}}, risk {{verdict.risk_score}}) · 2-column grid · own header and theme
Headless
Every workflow can be started over REST, MCP or the CLI, whatever its trigger, with the sample input below. Runs start straight away on the published version; replace <workflow id> with the id the install created.
REST
curl -X POST "$USERTASKS_URL/api/v1/workflows/start" \
-H "Authorization: Bearer $USERTASKS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"workflow_id":"<workflow id>","variables":{"upload_id":"UP-20261030-0042","media_type":"image","uploader_email":"river.example@example.com","uploader_name":"River","caption":"My weekend poster design","channel":"community"}}'CLI
usertasks workflows inputs <workflow id> # the start form: keys, types, required
usertasks workflows run <workflow id> --input upload_id=UP-20261030-0042 --input media_type=image --input uploader_email=river.example@example.com --input uploader_name=River … --waitInbound webhook
usertasks webhooks create <workflow id> # prints the hook slug and secret once
curl -X POST "$USERTASKS_URL/api/webhooks/inbound?hook=<slug>" \
-H "Authorization: Bearer <webhook secret>" -H "Content-Type: application/json" \
-d '{"upload_id":"UP-20261030-0042","media_type":"image","uploader_email":"river.example@example.com","uploader_name":"River","caption":"My weekend poster design","channel":"community"}'What's included
| Type | Name | Details |
|---|---|---|
| Email template | Upload not published | Tells the uploader why their upload was not published and how to appeal. |
| Email template | Upload published | Tells the uploader their upload is live. |
| Data table | Moderation log | Every upload checked: AI risk, categories, the decision, who made it and why. |
| Integration | Content platform | Your site or app that holds the uploads: approved items are published, rejected ones hidden. Replace with your CMS, community platform or storage API. |
| Integration | Google Gemini (media AI) | Media AI provider for transcription, image and video analysis and finding what to redact. Paste your Gemini API key on install (aistudio.google.com). To use OpenAI, Azure AI or AWS instead, point the media steps at that integration. |
| API reference | Publish upload | POST /uploads/{{upload_id}}/publish — Publishes an approved upload. |
| API reference | Reject upload | POST /uploads/{{upload_id}}/reject — Hides a rejected upload and records the reason. |
| Decision table | Moderation thresholds | 5 rules — Automatic approve and reject bands for the AI risk score, and categories that always go to a person. Tune them to your community guidelines. |
| Retention policy | Moderation log: 1 year | Moderation decisions are kept one year for appeals and transparency reports, then purged. |
| Workflow | Upload moderation | 22 steps — An image or video upload from your platform is checked by AI for safety, the moderation thresholds approve or reject the clear cases, borderline ones go to a moderator, the uploader is told and the platform publishes or hides it. |
Moderation log · 1 sample rows
UploadUploaderTypeChannelRiskTop categoryAI reasonDecisionDecided byReasonDecided
Requirements
Credentials never travel in a package. The install wizard asks for what your environment must provide, or installs it incomplete until you finish setup.
Integration “Content platform”Required
Integration “Google Gemini (media AI)”Required
Workflow “Upload moderation” assigneesRequired
Install
Works on UserTasks cloud and on any self-hosted instance. Installing creates the assets above; nothing runs until you complete setup and start it.
curl -fLO https://usertasks.com/gallery/ugc-media-moderation-1.0.0.utpkg
usertasks packages inspect ugc-media-moderation-1.0.0.utpkg # offline: checksum, hashes, signature
usertasks packages install ugc-media-moderation-1.0.0.utpkg --dry-run
usertasks packages install ugc-media-moderation-1.0.0.utpkg # prompts for each requirement
usertasks packages install ugc-media-moderation-1.0.0.utpkg --keep-incomplete --yes # in CI; finish with:
usertasks packages complete ugc-media-moderation -f values.yamlVerify the download
shasum -a 256 ugc-media-moderation-1.0.0.utpkg should print the file SHA-256. How gallery packages are signed.
Versions
Installing a newer version upgrades in place: local credentials and requirement values are kept, and changes you made are flagged first. How packages work
More packages
Media & Evidence Official
Each finished call is transcribed, card numbers and IDs are bleeped and masked, an AI agent scores it on your QA rubric, and low scores go to a supervisor.
Needs:Media AI providerAI modelAssignees
Media & Evidence Official
Public records requests from a form to release: statutory SLA, evidence gathering, AI-assisted redaction of video, photos, audio and documents, legal approval and an exemptions log.
Needs:Media AI providerREST APIAssigneesEmail
Media & Evidence Official
Customers upload an ID photo and a selfie: the document is read, checked by rules, the number blacked out for storage, and a person compares the photos and decides.
Needs:Media AI providerAssigneesEmail