Skip to content

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

AccountWhat happens when a generation succeeds
Free (no plan)Published automatically. Asking for visibility: "private" is ignored.
Paid planPrivate by default. Send visibility: "public" on the request, or publish later.

The rule is applied once, when the job succeeds. GET /v1/me 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

json
{ "model": "nano-banana", "prompt": "…", "visibility": "public" }

visibility is accepted by POST /v1/generations (and by workflow runs). It is stored in params.visibility so you can see what was requested.

Publish / unpublish

text
POST   /v1/generations/{id}/publish     → GenerationDto (isPublic: true)
DELETE /v1/generations/{id}/publish     → GenerationDto (isPublic: false)
  • Only SUCCEEDED generations with at least one output can be published (409 CONFLICT otherwise).
  • Unpublishing requires a paid plan. Free accounts receive 403 FORBIDDEN with details.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

text
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}
QueryValues
sortnew (default, newest first) · top (most liked, then newest)
modalityimage · video
modela model id
limit1–60, default 30
cursornextCursor from the previous page (opaque)
nsfw1 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.

json
{
  "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 /v1/explore/{id} behaves the same way (404).

Likes

text
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.