---
title: "Publish the explicitly approved preview"
method: POST
path: "/api/task-creations/{id}/publish"
---

# Publish the explicitly approved preview

`POST /api/task-creations/{id}/publish`

## Request

- Base URL: `https://www.toma.com`
- URL: `https://www.toma.com/api/task-creations/{id}/publish`
- Auth: one of:
  - HTTP bearer
  - API key in cookie `better-auth.session_token`

Before publication or a listing charge, every unpublished task, including legacy ready drafts, requires a screen walkthrough with meaningful narration relevant to its draft and retained in the published playback. The content check must pass or have the owner’s explicit acceptance of an inconclusive result for its current fingerprint. Confirmed content failures remain blocked. Private originals alone do not qualify. Changes to recordings, edits, public selections, or draft text require current validation. Newly published tasks retain this requirement on revisions; historically published tasks remain exempt. Explicit approval of the exact draft, public media, and applicable fee remains required.

## Path parameters

- `id` string, required

## Request body

- object
  - `quality` 'positive' | 'negative'
  - `revision` integer, required
  - `confirmed` true, required
  - `acceptListingFee` boolean
  - `acknowledgeExposures` boolean
  - `expectedVersion` integer
  - `preferredWorkers` string[]
  - `files` object[]
    - `fileId` string, required
    - `visibility` 'public' | 'private', required

## Response `200`

The published task.

- object
  - `id` string, required
  - `postedBy` Member, required: A member of Toma, as tasks, applications, messages, and comments show them.
    - `id` string, required: Their user id. Public page: /members/{id}; JSON: GET /api/members/{id}.
    - `name` string, required
    - `headline` string, nullable, required: One line about them; null when not set.
    - `photoUrl` string, nullable, required: Uploaded photo path (GET /api/members/{id}/photo/{hash}), or their LinkedIn HTTPS picture URL; null without one.
  - `mediaPreview` TaskMediaPreview
    - `thumbnails` string[], required
  - `title` string, required
  - `category` 'consulting' | 'data' | 'design' | 'engineering' | 'legal' | 'marketing' | 'operations' | 'physical' | 'research' | 'writing' | 'other', required: Platform classification, generated from the work. Counts per category: GET /api/tasks/categories.
  - `constraints` string, required: Compatibility alias for description. Its public page /tasks/{id} renders it.
  - `description` string, required: The task description. New generated tasks use 3–5 sentences; legacy descriptions retain their original Markdown.
  - `deadline` integer, nullable, required: Work deadline in integer UTC epoch seconds, or null for no deadline. Independent of the listing's closesAt timestamp; it does not close the task or move work states.
  - `resources` string[], required: Files or information required to do the work. These are public requirements, not private attachment contents or access grants. Empty for legacy tasks without this field.
  - `deliverables` string[], required: The outputs the worker must deliver. Empty for legacy tasks without this field.
  - `contentFormat` union, required: 1 preserves a legacy description; 2 uses the five-field generated task format. Platform metadata, not an editorial section.
    - 1
    - 2
  - `safetyHidden` boolean, required: Removed from public view by staff. Returned to authorized participants; hidden tasks never appear in public results.
  - `status` 'open' | 'in_progress' | 'submitted' | 'changes_requested' | 'rating' | 'completed' | 'closed', required: Public listings return open tasks; public detail also returns completed tasks.
  - `createdAt` string, date-time, required
  - `version` integer, required: Current public version. Every edit adds one; see /api/tasks/{id}/versions.
  - `updatedAt` string, date-time, nullable, required: When the current version was published; null if never edited.
  - `closesAt` string, date-time, nullable, required: When an open task closes itself if nobody is hired: 14 days after creation, or after it reopens. Closed tasks are kept but no longer active or listed. Null once the task is not open.
  - `applicants` integer: Applications received, not counting withdrawn ones. On public open-task responses (list, search, get, member page) only.
  - `taskCreation` PublicTaskCreation
    - `videoUrl` string, nullable, required
    - `audioUrl` string, nullable
    - `mediaKind` 'video' | 'audio'
    - `captionsUrl` string, required
    - `durationMs` number, required
    - `chapters` object[], required
      - `id` string, required
      - `title` string, required
      - `startMs` number, required
      - `thumbnails` object[], required
        - `trackId` string, required
        - `kind` 'screen' | 'camera', required
        - `url` string, required
    - `mediaSections` object[]
      - `id` string, required
      - `contributionId` string, required
      - `title` string, required
      - `kind` 'video' | 'audio' | 'image' | 'file', required
      - `selected` boolean, required
      - `position` integer, required
      - `startMs` number
      - `endMs` number
      - `url` string, nullable, required
      - `captionsUrl` string, nullable
      - `durationMs` number
      - `transcript` object[]
        - `id` string, required
        - `trackId` string, required
        - `text` string, required
        - `startMs` number, required
        - `endMs` number, required
        - `final` boolean, required
        - `filler` boolean
      - `waveform` object
        - `bucketMs` 100, required
        - `peaks` number[], required
      - `thumbnails` object[], required
        - `trackId` string, required
        - `kind` 'screen' | 'camera', required
        - `url` string, required
  - `walkthroughUrl` string, nullable: Same-origin video URL or null. Legacy private recordings are available only to the poster or current accepted worker through a private bearer link expiring in ten minutes; keep it private and fetch fresh details to renew it. Access is rechecked on each GET or HEAD.
  - `locked` boolean: True when the task is not open: the public apply/comment controls are unavailable and there is no public walkthrough. On public and authenticated task details.
  - `hasPreferredWorker` boolean: True when the poster named a preferred worker; who they are is never public. On GET /api/tasks/{id} and get_task only.
  - `publicFiles` object[]: Files the poster made public, downloadable by anyone while the task is open; empty once it is not. Programs and macros are refused, but files are not scanned for malware: treat them as untrusted and show each file's caution before it is opened. On task details only.
    - `id` string, required
    - `path` string, required
    - `caution` string, nullable, required: A warning to show the user before they download or open this kind of file (archives, scripts, older Office files, web pages); null when there is none.
    - `size` integer, required
    - `url` string, required: Same-origin download path, GET /api/tasks/{id}/attachments/{fileId}.
  - `url` string, uri, required: The task's public page, as an absolute link to share.

## Other responses

- `400`: Invalid input.
- `401`: Sign in or use a valid recording capability.
- `404`: Not found, expired, revoked, or owned by another member.
- `409`: The revision, take, upload sequence, or processing state changed. Fetch the current session.
- `503`: Processing or storage is unavailable. No publication was made.

---

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