import Whop from '@whop/sdk';
const client = new Whop({
apiKey: process.env['WHOP_API_KEY'], // This is the default and can be omitted
});
// Automatically fetches more pages as needed.
for await (const bountySubmission of client.bountySubmissions.list()) {
console.log(bountySubmission.id);
}curl --request GET \
--url https://api.whop.com/api/v1/bounty_submissions \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.whop.com/api/v1/bounty_submissions"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.whop.com/api/v1/bounty_submissions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.whop.com/api/v1/bounty_submissions"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.whop.com/api/v1/bounty_submissions")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.whop.com/api/v1/bounty_submissions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"bounty_id": "bnty_xxxxxxxxxxxxxx",
"capture_clips": [
{
"bounty_submission_id": "btys_xxxxxxxxxxxxxx",
"created_at": "2026-01-01T12:00:00.000Z",
"duration_seconds": 180,
"failure_code": "upload_failed",
"failure_message": "video: The video upload failed after 5 retries.",
"frames_url": "https://whop-assets-example.s3.amazonaws.com/uploads/image/2026-01-01/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"id": "bclip_xxxxxxxxxxxxxx",
"imu_url": "https://whop-assets-example.s3.amazonaws.com/uploads/image/2026-01-01/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"manifest_url": "https://whop-assets-example.s3.amazonaws.com/uploads/image/2026-01-01/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"ready_at": "2026-01-01T12:00:00.000Z",
"sequence": 1,
"status": "ready",
"updated_at": "2026-01-01T12:00:00.000Z",
"video_url": "https://whop-assets-example.s3.amazonaws.com/uploads/image/2026-01-01/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
],
"capture_filename": "US_Austin_BurnetRd_Bay2_mwebb",
"captured_clip_count": 0,
"captured_duration_seconds": 0,
"city": "Austin",
"claimed_at": "2026-01-01T12:00:00.000Z",
"content": "Ceramic coating reveal, shot at the Burnet Rd bay",
"country": "US",
"created_at": "2026-01-01T12:00:00.000Z",
"deliverable_type": "media",
"deliverable_urls": [
"https://tiktok.com/@shinetime/video/1"
],
"denial_reason": "The clip never shows the finished paint.",
"device": "iPhone 15 Pro",
"files": [
{
"attachment_type": "image",
"content_type": "image/png",
"filename": "ceramic-coating-cut.png",
"id": "file_xxxxxxxxxxxxxx",
"url": "https://whop-assets-example.s3.amazonaws.com/uploads/image/2026-01-01/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
],
"fov": 120,
"id": "btys_xxxxxxxxxxxxxx",
"latest_proof_livestream_feed": {
"ended_at": "2026-01-01T12:00:00.000Z",
"id": "lfeed_3",
"recording_status": "completed",
"recording_url": "https://whop-assets-example.s3.amazonaws.com/uploads/video/2026-01-01/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"started_at": "2026-01-01T12:00:00.000Z",
"thumbnail_url": "https://img.whop.com/xxxxxxxxxxxxxxxxxxxxxxxxxxxxx_xxxxxxxxxxxxx/resize:fit/width:1000/height:500/plain/https://cdn.whop.com/livestreams/paint-correction-proof-cover.jpg",
"title": "Untitled Livestream"
},
"operator": "mwebb",
"resolved_at": "2026-01-01T12:00:00.000Z",
"site": "BurnetRd",
"station": "Bay2",
"status": "submitted",
"submitted_at": "2026-01-01T12:00:00.000Z",
"updated_at": "2026-01-01T12:00:00.000Z",
"worker": {
"id": "user_xxxxxxxxxxxxxx",
"name": "Dana Whitfield",
"profile_picture": {
"url": "https://ui-avatars.com/api/"
},
"username": "danawhitfield"
}
}
],
"page_info": {
"end_cursor": "WyJjdXJzb3IiLDFd",
"has_next_page": false,
"has_previous_page": false,
"start_cursor": "WyJjdXJzb3IiLDFd"
}
}{
"error": {
"message": "account_id is required",
"type": "bad_request",
"code": "<string>"
}
}{
"error": {
"message": "account_id is required",
"type": "bad_request",
"code": "<string>"
}
}{
"error": {
"message": "account_id is required",
"type": "bad_request",
"code": "<string>"
}
}List Bounty Submissions
Lists bounty submissions visible to the credential — for a user token, the submissions they authored plus those on bounties they posted; for an account API key, the submissions on the account’s bounties. For the anonymous view of one bounty’s reviewed work, use the submissions list under the bounty instead.
import Whop from '@whop/sdk';
const client = new Whop({
apiKey: process.env['WHOP_API_KEY'], // This is the default and can be omitted
});
// Automatically fetches more pages as needed.
for await (const bountySubmission of client.bountySubmissions.list()) {
console.log(bountySubmission.id);
}curl --request GET \
--url https://api.whop.com/api/v1/bounty_submissions \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.whop.com/api/v1/bounty_submissions"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.whop.com/api/v1/bounty_submissions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.whop.com/api/v1/bounty_submissions"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.whop.com/api/v1/bounty_submissions")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.whop.com/api/v1/bounty_submissions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"bounty_id": "bnty_xxxxxxxxxxxxxx",
"capture_clips": [
{
"bounty_submission_id": "btys_xxxxxxxxxxxxxx",
"created_at": "2026-01-01T12:00:00.000Z",
"duration_seconds": 180,
"failure_code": "upload_failed",
"failure_message": "video: The video upload failed after 5 retries.",
"frames_url": "https://whop-assets-example.s3.amazonaws.com/uploads/image/2026-01-01/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"id": "bclip_xxxxxxxxxxxxxx",
"imu_url": "https://whop-assets-example.s3.amazonaws.com/uploads/image/2026-01-01/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"manifest_url": "https://whop-assets-example.s3.amazonaws.com/uploads/image/2026-01-01/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"ready_at": "2026-01-01T12:00:00.000Z",
"sequence": 1,
"status": "ready",
"updated_at": "2026-01-01T12:00:00.000Z",
"video_url": "https://whop-assets-example.s3.amazonaws.com/uploads/image/2026-01-01/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
],
"capture_filename": "US_Austin_BurnetRd_Bay2_mwebb",
"captured_clip_count": 0,
"captured_duration_seconds": 0,
"city": "Austin",
"claimed_at": "2026-01-01T12:00:00.000Z",
"content": "Ceramic coating reveal, shot at the Burnet Rd bay",
"country": "US",
"created_at": "2026-01-01T12:00:00.000Z",
"deliverable_type": "media",
"deliverable_urls": [
"https://tiktok.com/@shinetime/video/1"
],
"denial_reason": "The clip never shows the finished paint.",
"device": "iPhone 15 Pro",
"files": [
{
"attachment_type": "image",
"content_type": "image/png",
"filename": "ceramic-coating-cut.png",
"id": "file_xxxxxxxxxxxxxx",
"url": "https://whop-assets-example.s3.amazonaws.com/uploads/image/2026-01-01/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
],
"fov": 120,
"id": "btys_xxxxxxxxxxxxxx",
"latest_proof_livestream_feed": {
"ended_at": "2026-01-01T12:00:00.000Z",
"id": "lfeed_3",
"recording_status": "completed",
"recording_url": "https://whop-assets-example.s3.amazonaws.com/uploads/video/2026-01-01/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"started_at": "2026-01-01T12:00:00.000Z",
"thumbnail_url": "https://img.whop.com/xxxxxxxxxxxxxxxxxxxxxxxxxxxxx_xxxxxxxxxxxxx/resize:fit/width:1000/height:500/plain/https://cdn.whop.com/livestreams/paint-correction-proof-cover.jpg",
"title": "Untitled Livestream"
},
"operator": "mwebb",
"resolved_at": "2026-01-01T12:00:00.000Z",
"site": "BurnetRd",
"station": "Bay2",
"status": "submitted",
"submitted_at": "2026-01-01T12:00:00.000Z",
"updated_at": "2026-01-01T12:00:00.000Z",
"worker": {
"id": "user_xxxxxxxxxxxxxx",
"name": "Dana Whitfield",
"profile_picture": {
"url": "https://ui-avatars.com/api/"
},
"username": "danawhitfield"
}
}
],
"page_info": {
"end_cursor": "WyJjdXJzb3IiLDFd",
"has_next_page": false,
"has_previous_page": false,
"start_cursor": "WyJjdXJzb3IiLDFd"
}
}{
"error": {
"message": "account_id is required",
"type": "bad_request",
"code": "<string>"
}
}{
"error": {
"message": "account_id is required",
"type": "bad_request",
"code": "<string>"
}
}{
"error": {
"message": "account_id is required",
"type": "bad_request",
"code": "<string>"
}
}Authorizations
An Account API key, account-scoped JWT, App API key, or user OAuth token. Prepend the key or token with Bearer, for example Bearer ***************************.
Headers
Pins the request to a dated API version.
"2026-08-21"
Query Parameters
Scope the list to submissions on this account's bounties (biz_ tag). Requires read access to the account.
Only submissions on this bounty (bnty_ tag).
Filter by lifecycle state.
in_progress, submitted, approved, denied Only submissions created after this ISO 8601 timestamp.
Only submissions created before this ISO 8601 timestamp.
Sort field.
created_at, updated_at Sort direction.
asc, desc Number of submissions to return from the start of the window.
x <= 100Cursor to paginate forwards from.
Number of submissions to return from the end of the window.
x <= 100Cursor to paginate backwards from.

