Developer docs
Explore (community feed)
The public feed of generations — who publishes, how to publish or hide your work, and likes.
Explore is the public gallery at poremu.ai/explore. Every item is a finished generation with its prompt, parameters and outputs, so the feed doubles as a prompt library for your own work.
Who gets published
| Account | What happens when a generation succeeds |
|---|---|
| Free (no plan) | Published automatically. Asking for visibility: "private" is ignored. |
| Paid plan | Private by default. Send visibility: "public" on the request, or publish later. |
The rule is applied once, when the job succeeds. GET / tells you which side you are on via canPublishPrivately, and every GenerationDto carries isPublic and likeCount.
Publishing never exposes your e-mail: authors appear with their display name, or a masked local part such as tae*** when no name is set.
Choosing visibility on a request
{ "model": "nano-banana", "prompt": "…", "visibility": "public" }visibility is accepted by POST / (and by workflow runs). It is stored in params.visibility so you can see what was requested.
Publish / unpublish
POST /v1/generations/{id}/publish → GenerationDto (isPublic: true)
DELETE /v1/generations/{id}/publish → GenerationDto (isPublic: false)- Only
SUCCEEDEDgenerations with at least one output can be published (409 CONFLICTotherwise). - Unpublishing requires a paid plan. Free accounts receive
403 FORBIDDENwithdetails.reason = "PLAN_REQUIRED"— deleting the generation removes it from the feed instead. - Both calls are idempotent.
Poremu staff can remove items that violate the content policy from the feed at any time.
Reading the feed
GET /v1/explore?limit=30&sort=new
GET /v1/explore?modality=video&sort=top
GET /v1/explore?model=gpt-image&cursor=…
GET /v1/explore/{id}| Query | Values |
|---|---|
sort | new (default, newest first) · top (most liked, then newest) |
modality | image · video |
model | a model id |
limit | 1–60, default 30 |
cursor | nextCursor from the previous page (opaque) |
nsfw | 1 to include unfiltered items — only honoured for adult-verified accounts with the content toggle on |
The feed is public: no key needed. When you do authenticate, likedByMe is filled in and nsfw=1 works.
{
"items": [
{
"id": "6a3c…",
"model": "gpt-image",
"modality": "image",
"prompt": "flat vector icon of a paper plane, blue on white",
"params": { "aspectRatio": "1:1", "quality": "low", "count": 1 },
"outputs": [{ "id": "4a83…", "kind": "IMAGE", "url": "https://cdn.poremu.ai/u/…/0.png", "thumbnailUrl": "…/0.thumb.webp", "width": 1024, "height": 1024, "mimeType": "image/png", "isNsfw": false, "createdAt": "…" }],
"author": { "id": "8a4e…", "name": "tae***", "avatarUrl": null },
"likeCount": 12,
"likedByMe": false,
"isNsfw": false,
"workflow": null,
"publishedAt": "2026-11-03T23:26:06.080Z"
}
],
"nextCursor": "eyJrIjoi…"
}workflow is set ({ id, name }) when the item was produced by an app / workflow, so you can open the same recipe.
Unfiltered (isNsfw) items are never returned to anonymous callers or to accounts that have not opted in, and GET / behaves the same way (404).
Likes
POST /v1/generations/{id}/like → { "likeCount": 13, "liked": true }
DELETE /v1/generations/{id}/like → { "likeCount": 12, "liked": false }One like per account per generation; repeated calls are no-ops. Works on any public item and on your own generations.
MCP
Connected assistants can use explore_feed, publish_generation and unpublish_generation — see MCP.