---
title: "Create Bounty"
method: POST
path: "/bounties"
tags: ["Bounties"]
---

# Create Bounty

`POST /bounties`

Creates a bounty and escrows its reward pool. Publishes immediately, or as a scheduled draft when you set `publish_at`.

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `accepted_submissions_limit` integer, nullable — Number of submissions that can be accepted (winner slots). Defaults to 1. The escrowed total is `gross_reward_amount` times this limit and must be at least $5.
  - `account_id` string, nullable — Account whose balance funds the bounty pool (`biz_` tag). Defaults to the caller's personal balance. Requires permission to move the account's funds.
  - `allowed_country_codes` string[], nullable — Countries whose residents can work the bounty, as ISO 3166 alpha-2 codes. Empty means worldwide.
  - `business_goal_type` 'clipping' | 'post_engagement' | 'owned_account_growth' | 'ugc_content' | 'local_activation' | 'data_capture' | 'other' — What the poster wants the work to achieve, declared once here.
  - `capture_spec` object — Per-bounty overrides of the served capture contract. Only accepted when `business_goal_type` is `data_capture`; omitted fields keep the platform defaults, and the resulting contract is echoed back as `capture_spec` on the bounty.
    - `bitrate_target_mbps` integer — Average bitrate the recorder encodes at, in megabits per second. Must sit within the served floor and ceiling.
    - `embed_camera_metadata` boolean — Whether the recorder also writes camera make and model into the video container's metadata.
    - `frame_gap_tolerance_ms` integer — Longest stall between consecutive frames a clip may contain before the client rejects it, in milliseconds. Unlike the recording fields this one can also be tuned after the bounty is created, since it bounds what is accepted rather than how footage is captured.
    - `min_clip_duration_seconds` integer — Minimum length of a single clip, in seconds.
    - `min_total_verified_duration_seconds` integer — Total verified footage a submission must accumulate across all its clips before it can be submitted, in seconds. Must be a whole number of hours between 1 and 12. Editable after create, until someone starts an attempt.
    - `stabilization_mode` 'off' | 'on' | 'any' — How the recorder configures video stabilization. `off` preserves raw motion for pose extraction.
  - `description` string, required — Full task instructions shown to workers.
  - `experience_id` string, nullable — Experience to host the bounty in (`exp_` tag). Any visibility — public for an open bounty, private for an invited one. Required unless account_id is set, in which case the bounty anchors in that account's public forum.
  - `frequency` 'once' | 'hourly' | 'daily' | 'weekly' | 'monthly' — How often the schedule creates a new bounty. Each occurrence is a separate bounty. Defaults to `once`; only applies with `publish_at`.
  - `gross_reward_amount` number, required — Gross bounty-pool amount (USD) escrowed per accepted submission, in whole dollars. Platform fees and affiliate shares are paid from this amount.
  - `publish_at` string, nullable — ISO 8601 time to publish the bounty. When set, the bounty is created as a hidden draft and funded + published at this time instead of immediately.
  - `publish_at_timezone` string, nullable — IANA timezone for recurring occurrences. Required when publish_at is set.
  - `title` string, required — Short name of the task shown to workers.

## Response `201`

bounty created

- Bounty
  - `accepted_deliverable_types` string[], required
  - `accepted_submissions_count` integer, required — Submissions accepted so far.
  - `accepted_submissions_limit` integer, required — Number of submissions that can be accepted (winner slots).
  - `affiliate_share_amount` number, required — What a referrer earns per accepted submission when the worker arrived through their affiliate link, in whole currency units, at the standard platform fee rate. Taken out of the worker's post-fee reward rather than added on top. `0` when the bounty pays no affiliate share, including bounties tied to no account, which cannot record a referral.
  - `allowed_country_codes` string[], required
  - `budget_amount` number, required — Total gross budget committed to the bounty: `gross_reward_amount` times `accepted_submissions_limit`.
  - `business_goal_type` 'clipping' | 'post_engagement' | 'owned_account_growth' | 'ugc_content' | 'local_activation' | 'data_capture' | 'other' | 'null', nullable, required — What the poster wants the work to achieve, declared once at create. `null` for bounties created before the taxonomy rolled out.
  - `cancel_requested_at` string, nullable, required — When cancellation was requested, as an ISO 8601 timestamp. On a `closed` bounty this means the cancel is pending: submissions are stopped and the bounty cancels once in-flight submissions resolve. On a `canceled` bounty it records when the cancellation was requested. `null` when no cancellation was ever requested.
  - `capture_spec` CaptureSpec, required
    - `filename_pattern` string, required — The naming convention for uploaded files, built from the required metadata fields.
    - `imu` CaptureSpecImu, required
      - `device_motion_units` string, required — Units for the device-motion channels, as a compact key=unit string.
      - `magnetometer_units` string, required — Units for the magnetometer channel.
      - `min_rate_hz` number, required — Minimum sustained IMU sample rate in hertz for a clip to pass validation.
      - `target_rate_hz` integer, required — Target IMU sample rate in hertz.
      - `warmup_min_rate_hz` number, required — Minimum IMU sample rate in hertz tolerated during the warmup window.
      - `warmup_ns` integer, required — Startup window, in nanoseconds, during which the relaxed warmup rate applies.
    - `manifest_schema_version` integer, required — Schema version the client must stamp on the capture manifest it uploads.
    - `min_clip_duration_seconds` integer, required — Minimum length of a single clip, in seconds.
    - `min_total_verified_duration_seconds` integer, required — Total verified footage a submission must accumulate across all its clips before it can be submitted, in seconds. Always a whole number of hours.
    - `required_metadata_fields` string[], required
    - `single_continuous_take` boolean, required — Whether each clip must be one uninterrupted recording rather than stitched segments.
    - `video` CaptureSpecVideo, required
      - `bitrate_ceiling_mbps` integer, required — Maximum acceptable average bitrate, in megabits per second.
      - `bitrate_floor_mbps` integer, required — Minimum acceptable average bitrate, in megabits per second.
      - `bitrate_target_mbps` integer, required — Recommended average bitrate to encode at, in megabits per second.
      - `camera_lens` string, required — Which physical lens to record with.
      - `codecs` string[], required
      - `embed_camera_metadata` boolean, required — Whether the client must also write the camera make and model into the video container's metadata. When `false`, the capture manifest and export CSV are the metadata carrier.
      - `fps` integer, required — Target capture frame rate.
      - `frame_gap_tolerance_ms` integer, required — Longest stall between consecutive frames a clip may contain before the client rejects it, in milliseconds. Every frame is timestamped in the frame log, so a stall stays alignable downstream — this bounds how broken a capture may be, not how evenly it must be paced.
      - `height` integer, required — Required frame height in pixels — recorded footage must match exactly.
      - `min_fov_degrees` integer, required — Minimum acceptable horizontal field of view, in degrees.
      - `orientation` string, required — Device orientation to record in.
      - `preferred_fov_degrees` integer, required — Preferred horizontal field of view, in degrees.
      - `stabilization_mode` 'off' | 'on' | 'any', required — How the client must configure video stabilization: `off` disables EIS so raw motion is preserved for pose extraction, `on` requires it, `any` leaves the device default.
      - `stabilization_required` boolean, required — Whether hardware/software stabilization must be enabled. True exactly when stabilization_mode is `on`.
      - `width` integer, required — Required frame width in pixels — recorded footage must match exactly.
  - `created_at` string, required — When the bounty was created, as an ISO 8601 timestamp.
  - `currency` 'usd' | 'sgd' | 'inr' | 'aud' | 'brl' | 'cad' | 'dkk' | 'eur' | 'nok' | 'gbp' | 'sek' | 'chf' | 'hkd' | 'huf' | 'jpy' | 'mxn' | 'myr' | 'pln' | 'czk' | 'nzd' | 'aed' | 'cop' | 'ron' | 'thb' | 'bgn' | 'idr' | 'dop' | 'php' | 'try' | 'krw' | 'twd' | 'vnd' | 'pkr' | 'clp' | 'uyu' | 'ars' | 'zar' | 'dzd' | 'tnd' | 'mad' | 'kes' | 'kwd' | 'jod' | 'all' | 'xcd' | 'amd' | 'bsd' | 'bhd' | 'bob' | 'bam' | 'khr' | 'crc' | 'xof' | 'egp' | 'etb' | 'gmd' | 'ghs' | 'gtq' | 'gyd' | 'ils' | 'jmd' | 'mop' | 'mga' | 'mur' | 'mdl' | 'mnt' | 'nad' | 'ngn' | 'mkd' | 'omr' | 'pyg' | 'pen' | 'qar' | 'rwf' | 'sar' | 'rsd' | 'lkr' | 'tzs' | 'ttd' | 'uzs' | 'rub' | 'cny' | 'kzt' | 'awg', required — Currency for all amounts on the bounty, as a lowercase ISO 4217 code.
  - `description` string, required — Full task instructions shown to workers.
  - `experience_id` string, nullable, required — Experience the bounty is hosted in, prefixed `exp_`. `null` for platform-wide bounties; may belong to a different account than the funder.
  - `funding_account` AccountSummary, required
    - `id` string, required — Account ID, prefixed `biz_`.
    - `title` string, required — Account display name.
  - `gross_paid_out_amount` number, required — Gross amount paid out from the bounty pool across accepted submissions — worker payouts, platform fees, and affiliate shares together. Tips and reviewer rewards are excluded.
  - `gross_reward_amount` number, required — Gross bounty-pool amount allocated per accepted submission, in whole currency units.
  - `id` string, required — Bounty ID, prefixed `bnty_`.
  - `net_reward_amount` number, required — What a worker is quoted per accepted submission after the platform fee, in whole currency units. The exact post-fee figure, at the standard platform fee rate — a worker who locked a different rate, or who arrived through an affiliate link, is paid a different amount.
  - `poster` UserSummary, required
    - `id` string, required — User ID, prefixed `user_`.
    - `name` string, nullable, required — Display name.
    - `profile_picture` UserProfilePicture, required
      - `url` string, required — Avatar image URL. Always present — a generated placeholder when the user set no picture.
    - `username` string, required — Public username.
  - `scheduled_frequency` 'once' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'null', nullable, required — How often the schedule creates a new bounty. Each occurrence is a separate bounty; the original is not republished.
  - `scheduled_publish_at` string, nullable, required — When a scheduled bounty will publish, as an ISO 8601 timestamp. `null` once published, for bounties that were never scheduled, and for terminally failed drafts parked for manual rescheduling.
  - `spots_remaining` integer, required — Unfilled winner capacity: `accepted_submissions_limit` minus `accepted_submissions_count`, clamped to zero. Not a signal that the bounty currently accepts new claims.
  - `status` 'scheduled' | 'open' | 'closed' | 'completed' | 'canceled', required — Lifecycle state. `scheduled` bounties are unpublished drafts, visible to their poster and the account's authorized managers; `open` bounties accept new submissions; `closed` bounties are live but no longer accept new submissions; `completed` bounties paid out every winner slot; `canceled` bounties ended before filling their slots.
  - `submissions_closed_at` string, nullable, required — When new submissions stopped being accepted, as an ISO 8601 timestamp. Set when a cancellation is requested on a bounty with work in flight, so in-flight submissions can resolve before the bounty cancels. `null` when submissions were never stopped — including completed bounties that simply filled every winner slot.
  - `title` string, required — Short name of the task shown to workers.
  - `unresolved_submissions_count` integer, required — Submissions still awaiting an outcome: in progress or pending review.
  - `updated_at` string, required — When the bounty was last updated, as an ISO 8601 timestamp.

## Other responses

- `400` — Invalid Parameters
- `403` — Forbidden

---

[API](https://skmtc.net/whop/apis/whop-api.md) · [All operations](https://skmtc.net/whop/apis/whop-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/whop/whop-api/versions/866821546d67/schema)
