Developers
The Meme API
JSON under /api/v1, with application/problem+json errors. A person is the meme_at session cookie or a Network user token as a Bearer.
Read
GET /api/v1/entries?limit=&cursor=&kind=&status=- Public entries, newest first, cursor-paged (at most 50).
GET /api/v1/memes?scope=internet&q=&sort=top&window=week- Meme-library alias for public entries with collection, search, and usage filters.
GET /api/v1/entries/:slug- One entry with every citation and the use timeline. A hidden one is 404 unless you are staff.
GET /api/v1/memes/:slug- Meme-library alias for an entry, including its citations and timeline.
GET /api/v1/entries/:slug/series?days=30- Uses per UTC day, zero-filled (1–365 days).
GET /api/v1/trending- Public entries, rising first.
GET /api/v1/week- This ISO week’s candidates and their vote counts.
GET /api/v1/templates- Caption templates: image, box count, source and license.
POST /api/v1/caption-ideas- Signed-out safe caption suggestions using the cheapest OpenVibe.AI route by default; at most 8 requests per minute per address.
POST /api/v1/render- Render a caption as PNG, GIF or MP4 from a licensed template, 1–4 lines and optional editor geometry.
GET /api/v1/captions/:id/render?format=png|gif|mp4- Download the rendered public caption; private captions require their owner or staff.
GET /api/v1/captions/:id- One saved caption (a hidden one is 404 unless it is yours or you are staff).
Write (signed in)
POST /api/v1/week/vote{ entry_id }. One vote a week per person; a second call changes the choice. Same-origin.POST /api/v1/captions{ template_id, lines, visibility? }: 1–4 lines, each at most 120 characters, text only, blocked words refused.POST /api/v1/templates/uploads{ name, image }(PNG/JPEG/WebP data URL, at most 6 MB), stored in Media and held for staff review.POST /api/v1/entries/:slug/report{ kind: "takedown"|"correction", reason, note? }for staff review.
Staff (Network role global_mod or above)
GET /api/v1/staff/templates/uploads- List member-uploaded templates waiting for review.
POST /api/v1/staff/templates/:id/review{ decision: "approved"|"rejected" }.POST /api/v1/entries/:slug/publish- Make a hidden candidate public. Refused when its origin citation is gone (409).
POST /api/v1/entries/:slug/hide- Remove it from public lists and tombstone its Search document.
PATCH /api/v1/entries/:slug{ title, kind, status }: change an entry; status history is kept.GET /api/v1/reports- The open takedown/correction reports.
Search
Each public entry is one search.index-document@1 (owner meme, type entry, canonical page /m/<slug>) queued in meme_outbox and delivered to OpenVibe.Search within a minute; hiding or deleting an entry queues a tombstone. The importer reads only public APIs and never publishes: a candidate stays hidden until a staff person publishes it.