---
title: "ViewPayout REST API Reference: Every Route"
url: "https://viewpayout.com/docs/api.md"
canonical_url: "https://viewpayout.com/docs/api"
last_updated: "2026-10-22"
type: "reference"
summary: "Every route of the ViewPayout REST API with its auth and request fields."
related: ["https://viewpayout.com/docs/authentication.md", "https://viewpayout.com/docs/errors.md"]
---

# ViewPayout REST API Reference: Every Route

Every route of the ViewPayout REST API with its auth and request fields.

The API is a JSON REST API. Its routes are listed below, grouped by what they do.  Money is whole US cents everywhere.

> A route that needs X or Stripe answers `503 provider_unavailable` while that service cannot be reached. Nothing is charged when it does.

## Public

| Method | Path | Auth | What it does |
| --- | --- | --- | --- |
| GET | `/v1/plans` | None | Plans, fees, brand top-up sizes and bounty defaults. |
| GET | `/v1/board` | None | Public board of open bounties, newest first, 20 a page. Send limit (1 to 100) and next_cursor as cursor for more. No key needed. |
| GET | `/v1/stats` | None | Whole-market counters from our own database: open bounties and slots, verified posts and views, paid-out and payable cents, and the week's paid-out figure (null when a paid transfer has no date). |
| GET | `/v1/activity` | None | Newest-first feed of what happened: bounty_live, slot_taken, post_confirmed. Filter by brand (workspace slug) and kind, page with next_cursor. Creators are not named. |
| GET | `/v1/feed` | None | Alias of /v1/activity. |
| GET | `/v1/bounties` | None | Open bounties, filtered, sorted and paged. Filters: brand, search, min_rate_cents, max_floor_views, link_placement, rewarded_only, follower_fit, slots_left, claimable_now. Sorts: newest, oldest, rate_desc, rate_asc, floor_asc, slots_left_desc, ending_soonest. Page with next_cursor. |
| GET | `/v1/workspaces/{slug}` | None | One brand's public page: its counts and its open bounties, newest first. |

### GET /v1/activity query parameters

| Parameter | Type | Notes |
| --- | --- | --- |
| `brand` | string | A brand's workspace slug. |
| `kind` | "bounty_live", "slot_taken" or "post_confirmed" | Only this kind of event. |
| `limit` | integer, 1 to 100 | Page size. Default 20. |
| `cursor` | string | The next_cursor of the previous page, sent back unchanged with the same filters and sort. null on the last page. |

### GET /v1/feed query parameters

| Parameter | Type | Notes |
| --- | --- | --- |
| `brand` | string | A brand's workspace slug. |
| `kind` | "bounty_live", "slot_taken" or "post_confirmed" | Only this kind of event. |
| `limit` | integer, 1 to 100 | Page size. Default 20. |
| `cursor` | string | The next_cursor of the previous page, sent back unchanged with the same filters and sort. null on the last page. |

### GET /v1/bounties query parameters

| Parameter | Type | Notes |
| --- | --- | --- |
| `brand` | string | A brand's workspace slug. |
| `search` | string, 1 to 100 | Matches the title, the brief or the brand name, ignoring case. |
| `min_rate_cents` | integer | Lowest rate per 1,000 views, in cents. |
| `max_floor_views` | integer | Highest view floor. |
| `link_placement` | "none", "body" or "reply" | Where the tracked link goes: no link, in the post or in the first reply. |
| `rewarded_only` | true or false | Only bounties with at least one settled post that credited its creator. |
| `follower_fit` | integer | The viewer's follower count; keeps bounties whose follower minimum it meets. |
| `slots_left` | integer | Only bounties with at least this many slots left. |
| `claimable_now` | true or false | Only bounties whose claim window is still running. |
| `sort` | "newest", "oldest", "rate_desc", "rate_asc", "floor_asc", "slots_left_desc" or "ending_soonest" | Default "newest". Ties are newest first. |
| `limit` | integer, 1 to 100 | Page size. Default 20. |
| `cursor` | string | The next_cursor of the previous page, sent back unchanged with the same filters and sort. null on the last page. |

## Account and workspaces

| Method | Path | Auth | What it does |
| --- | --- | --- | --- |
| GET | `/v1/account` | API key | Your balance in cents, your workspaces and your connected X accounts. |
| GET | `/v1/account/export` | API key | Every row the account has as one JSON document: keys (by prefix), balance ledger, invoices, workspaces, bounties, claims, submissions, X accounts and payouts. Secrets are left out. Three requests per account every ten minutes. |
| POST | `/v1/workspaces` | API key | Create a brand workspace. |
| GET | `/v1/workspaces` | None, or an API key | With no key: the public brand directory (name, slug, X handle, website and counts, newest first; filters q and has_open_bounties; paged with next_cursor). With a valid key: your own brand workspaces, oldest first, paged the same way. A key that is wrong answers 401. |

### POST /v1/workspaces

| Field | Type | Notes |
| --- | --- | --- |
| `name` | string, 1 to 80 | Display name. |
| `slug` | string | Lowercase letters, digits and hyphens, 1 to 40 characters. |
| `x_handle` | string | The brand's X handle, with or without the @. |
| `website` | URL | The brand's website. |
| `disclosure_required` | boolean | Default true. |

### GET /v1/workspaces query parameters

| Parameter | Type | Notes |
| --- | --- | --- |
| `q` | string, 1 to 100 | Matches the brand name, slug or X handle, ignoring case. No-key directory only. |
| `has_open_bounties` | true or false | Only brands with an open bounty. No-key directory only. |
| `limit` | integer, 1 to 100 | Page size. Default 20. |
| `cursor` | string | The next_cursor of the previous page, sent back unchanged with the same filters and sort. null on the last page. |

## Bounties

| Method | Path | Auth | What it does |
| --- | --- | --- | --- |
| POST | `/v1/workspaces/{id}/bounties` | API key | Open a bounty. Returns the maximum exposure: slots times cap, plus the fee. |
| PATCH | `/v1/bounties/{id}` | API key | Edit a bounty. Rate, cap, view floor and hold lock after the first submission. |
| GET | `/v1/bounties/{id}` | None, or an API key | Read one bounty with its terms and live slot use, open or closed. With no key: the public view. With a valid key: the keyed view, where owners also see slot use and maximum exposure. A key that is wrong answers 401. |
| GET | `/v1/bounties/{id}/submissions` | API key | The brand queue: the submissions on your bounty, oldest first, 20 a page. Send limit (1 to 100) and next_cursor as cursor for more. |
| POST | `/v1/submissions/{id}/reject` | API key | Brand rejects a post. Releases the held money and returns the slot. |

### POST /v1/workspaces/{id}/bounties

| Field | Type | Notes |
| --- | --- | --- |
| `title` | string, 1 to 120 | Required. |
| `brief` | string, 1 to 4000 | Required. |
| `rules` | string | Up to 4000 characters. |
| `rate_per_1k_cents` | integer, 1 to 100000 | Cents per 1,000 views. Default 100. |
| `cap_cents` | integer, 1000 to 10000000 | Most one post can earn before the fee. Default 5000. |
| `view_floor` | integer, 0 to 10000000 | Views a post needs before it earns. Default 1000. |
| `hold_days` | integer, 1 to 60 | Default 14. |
| `max_slots` | integer, 1 to 10000 | Required. |
| `posts_per_creator` | integer, 1 to 20 | Default 1. |
| `claim_window_hours` | integer, 1 to 2160 | How long the bounty can be claimed. Default 336. |
| `min_followers` | integer, 0 or more | Default 500. |
| `min_account_age_months` | integer, 0 or more | Default 6. |
| `verified_only` | boolean | Default false. |
| `link_mode` | "none", "in_post" or "in_first_reply" | Default "none". Anything else needs destination_url. |
| `destination_url` | URL or null | Where the tracked link goes. |
| `disclosure_required` | boolean | Default true. |
| `submit_window_minutes` | integer, 5 to 1440 | Default 60. |
| `approved_claims` | string[] | Up to 50 claims creators may make. |
| `hard_rules` | string[] | Up to 50 rules creators must not break. |

### PATCH /v1/bounties/{id}

| Field | Type | Notes |
| --- | --- | --- |
| `title, brief, rules` | string | Optional. |
| `rate_per_1k_cents, cap_cents, view_floor, hold_days` | integer | Optional. Locked after the first submission. |
| `status` | "open" or "closed" | Optional. |

### POST /v1/submissions/{id}/reject

| Field | Type | Notes |
| --- | --- | --- |
| `reason` | string, 1 to 500 | Required. |

## Creators

| Method | Path | Auth | What it does |
| --- | --- | --- | --- |
| POST | `/v1/creators` | API key | Connect an X account through OAuth. Answers 503 provider_unavailable until X credentials are configured. |
| POST | `/v1/creators/{id}/payout-onboarding` | API key | Start payout onboarding (identity, bank, tax forms) for a connected X account. |
| GET | `/v1/creators/{id}/balance` | API key | Available, pending (in hold), requested and paid cents for a connected X account. |
| POST | `/v1/creators/{id}/cashout` | API key | Request a cashout of the full available balance. The minimum applies and an operator approves it. |

### POST /v1/creators

| Field | Type | Notes |
| --- | --- | --- |
| `code` | string | The OAuth authorization code. |
| `code_verifier` | string | The PKCE verifier. |
| `redirect_uri` | URL | The redirect URI used for the code. |
| `confirmed_adult` | boolean | The person confirmed they are 18 or older. |

### POST /v1/creators/{id}/payout-onboarding

| Field | Type | Notes |
| --- | --- | --- |
| `country` | two-letter code | Uppercase, such as US. |
| `return_url` | URL | Where the person returns after onboarding. |
| `refresh_url` | URL | Where the person returns if the link expires. |

## Claims and posts

| Method | Path | Auth | What it does |
| --- | --- | --- | --- |
| POST | `/v1/bounties/{id}/claims` | API key | Claim a bounty. Free, non-exclusive, freezes the terms and returns your tracked link. |
| POST | `/v1/claims/{id}/draft-check` | API key | Check a draft before posting. Advice only, limited per bounty per day. |
| POST | `/v1/claims/{id}/submissions` | API key | Submit the published post. It must be fresh, unedited, yours and inside the window. |
| GET | `/v1/submissions/{id}` | API key | Read a submission you own or that is on your bounty. |

### POST /v1/bounties/{id}/claims

| Field | Type | Notes |
| --- | --- | --- |
| `x_account_id` | string | The connected X account that claims. |

### POST /v1/claims/{id}/draft-check

| Field | Type | Notes |
| --- | --- | --- |
| `text` | string, 1 to 2000 | The draft text. |

### POST /v1/claims/{id}/submissions

| Field | Type | Notes |
| --- | --- | --- |
| `post_id` | digits | The X post id. Send this or post_url. |
| `post_url` | URL | https://x.com/<handle>/status/<id>. Send this or post_id. |

## Billing

| Method | Path | Auth | What it does |
| --- | --- | --- | --- |
| POST | `/v1/me/billing/checkout` | Signed-in session | Start a Stripe Checkout for a brand balance top-up. Signed in. |
| POST | `/v1/me/billing/portal` | Signed-in session | Open the Stripe billing portal. Signed in. |
| GET | `/v1/me/billing` | Signed-in session | Top-up packs and invoices. Signed in. |
| POST | `/v1/billing/webhook` | Stripe signature | Stripe only. A verified paid top-up adds its pack to the brand balance. Nothing else grants money. |

### POST /v1/me/billing/checkout

| Field | Type | Notes |
| --- | --- | --- |
| `offer` | string | A funding pack id from /v1/plans. |
| `success_url, cancel_url` | URL | Optional return addresses. |

## Related

- [ViewPayout API Authentication and Keys](https://viewpayout.com/docs/authentication.md)
- [ViewPayout API Error Codes and Fixes](https://viewpayout.com/docs/errors.md)
