---
title: "Submit an image to the moderation review queue (paid, agent rail)"
method: POST
path: "/v1/agent/submit"
tags: ["Agent payments"]
---

# Submit an image to the moderation review queue (paid, agent rail)

`POST /v1/agent/submit`

## Request

- Base URL: `https://api.memestack.ai`
- URL: `https://api.memestack.ai/v1/agent/submit`
- Auth: none declared

Submit an image by URL into the standard moderation pipeline (forceReview: true) — the payment IS the sybil-resistance mechanism, no account needed. Attach proof via PAYMENT-SIGNATURE or X-PAYMENT header (base64 JSON x402 payload, USDC on Base) or Authorization: L402 <macaroon>:<preimage> (Lightning sats). Without proof the response is 402 with a dual-rail offer, unless the 50/day/IP submission-offer cap is reached first (429). Rate limited 30/min/IP. Returns 404 while payments or agent submissions are disabled. Price: $0.10 per submission (paid in sats over Lightning at the current BTC/USD rate, or in USDC on Base). NO REFUND if moderation rejects the submission (duplicate/nsfw/gore/spam/low_quality/invalid image) — the fee is retained as the anti-spam mechanism; only a failure before any submission row exists (bad URL, fetch error, oversize, non-image bytes) keeps the claim open for a corrected retry. Accepted images land in needs_review pending human approval, and join the public gallery under the MCP Agents account if approved. Long-polls up to ~90s; on 202, retry with the SAME payment proof to resume — up to 10 delivery attempts per payment, never charged twice.

## Request body

- object
  - `image_url` string, required: HTTPS URL or data:image/(jpeg|png|webp);base64,... URL. Max 8MB.
  - `caption` string: Optional caption hint for the AI tagger. Admin-visible only, never published verbatim.
  - `tags` string[]: Optional tag hints. Admin-visible only, never published verbatim.
  - `attribution` string: Optional credit line for the original creator/source. Shown to moderators only, never published.

## Response `200`

Submission accepted — pending human review.

- object
  - `image_id` string, uuid
  - `status` 'pending_review'
  - `message` string
  - `page_url` string

## Other responses

- `202`: Still processing at the poll budget — claim stays open; retry with the SAME payment proof to resume.
- `400`: Invalid body (INVALID_ARGS), malformed payment header (INVALID_PAYMENT_HEADER), or an image fetch/validation failure (FETCH_FAILED / NOT_AN_IMAGE / ANIMATED_IMAGE / SSRF_BLOCKED) — all keep the claim open, retry with a corrected image_url and the SAME payment proof.
- `402`: Payment required. Body is the x402 v2 PaymentRequired envelope; the same envelope is base64-encoded in the PAYMENT-REQUIRED header, and WWW-Authenticate carries the L402 challenge (macaroon + bolt11 invoice). Pay on either rail and retry with proof. Also returned when the 10-attempt delivery budget is exhausted (ATTEMPTS_EXHAUSTED) — a new payment is then required.
- `410`: The submitted image was removed; payment recorded for reconciliation (terminal).
- `413`: Fetched image exceeds the 8MB cap (TOO_LARGE) — claim stays open, retry with a smaller image.
- `422`: Rejected by moderation (SUBMISSION_REJECTED: duplicate/nsfw/gore/spam/low_quality/invalid_image) — payment retained per policy. duplicate_of (image_id + page_url) is included when the match is an approved, publicly viewable image.
- `429`: Daily submission-offer cap reached (SUBMIT_CAP_REACHED, 50/day/IP) or rate limit exceeded (30/min/IP).
- `502`: Could not enqueue the submission job (ENQUEUE_FAILED) — claim stays open, retry with the same proof.
- `503`: Payment rails temporarily unavailable (PAYMENT_UNAVAILABLE).

---

[API](https://skmtc.dev/memestack/apis/memestack-api.md) · [All operations](https://skmtc.dev/memestack/apis/memestack-api/llms.txt) · [OpenAPI document](https://skmtc.dev/memestack/apis/memestack-api/revisions/9d3a19565f75?raw)
