---
title: "Park the finished head and write the member's profile"
method: POST
path: "/api/funko/publish"
tags: ["funko", "browser-session"]
---

# Park the finished head and write the member's profile

`POST /api/funko/publish`

## Request

- Base URL: `https://www.immersivecommons.com`
- URL: `https://www.immersivecommons.com/api/funko/publish`
- Auth: API key in cookie `__session`

Clerk-session only and runId-gated - the last step of a paid run. The four steps BEFORE the head is parked (resolve, download, size-check, upload) are hard failures because there is nothing to salvage; everything after is best-effort and still returns 200, because a missing thumbnail is cosmetic where a failed publish throws away the whole run. `publicShare` is FALSE on create: nothing about the member is reachable without their session until they flip it at POST /api/funko/share. The agent-token path is the MCP tool `ic_funko_generate_publish` (scope funko:write), which calls the same publish core.

## Request body

- FunkoPublishRequest
  - `runId` string, required
  - `taskId` string, required: The completed sculpt task.
  - `traits` object
  - `thumbUrl` string

## Response `200`

The written profile.

- FunkoPublishResponse
  - `ok` boolean, required
  - `profile` object, required: The written profile. `publicShare` is FALSE on create — nothing is reachable without the member's session until they flip it.

## Other responses

- `400`: Missing runId/taskId, or the task has no usable model.
- `401`: Not signed in.
- `403`: runId not live or not the caller's.
- `502`: Download or blob upload failed before the head was parked.

---

[API](https://skmtc.dev/immersivecommons/apis/immersive-commons-agent-rest-api.md) · [All operations](https://skmtc.dev/immersivecommons/apis/immersive-commons-agent-rest-api/llms.txt) · [OpenAPI document](https://skmtc.dev/immersivecommons/apis/immersive-commons-agent-rest-api/revisions/be67c1f67c27?raw)
