Generated from the CreatorAPI capability catalog, including native routes and CreatorAPI services. Historical catalog flags are not current end-to-end test results; check each operation's notes. Full OnlyFansAPI parity is not established. 312 capabilities · 200 GET routes · 112 write routes · 44 groups.
Instructify ad tracking
OnlyFans click-level attribution is available through CreatorAPI's own /go/{id} redirects. This is not the old aggregate-only native campaign view. Use the returned traffic_redirect_url in the ad, not the native campaign URL or the unrelated general-purpose /l/ short-link endpoint.
Full integration guide covers creation, exact fields, polling, billing and cleanup. The following three GET endpoints implement the Instructify report shapes; a readonly key with access to the active creator suffices.
| Report | Path | Response |
|---|
| Links | /api/smart-links?account_ids={account}&limit=100&offset=0 | data: array of links |
| Clicks | /api/smart-links/{id}/clicks | data: {summary, rows, filters} |
| Conversions | /api/smart-links/{id}/conversions | data: {summary, rows, filters} |
For a client that appends /smart-links, configure https://api.creator-api.com/api as its reporting base URL. Creation still uses POST /v1/{account}/smart-links with a full key. Replace placeholders with IDs returned by CreatorAPI. Never put an API key in an ad URL.
Reports accept limit 1–100 and offset >= 0. Click/conversion time filters are date_start and date_end, timezone-qualified ISO 8601 timestamps with inclusive boundaries. Rows are newest first, then by stable ID. Conversions additionally accept conversion_type=new_subscriber or new_transaction. Invalid filters return 422; rate limits return 429 with Retry-After.
Clicks include stable ID, UTC time, all five utm fields, external_click_id (ecid), fbclid, gclid, ttclid, referrer, country_code, browser_device_type and bot/duplicate flags. An acquisition can claim one eligible unused click from the same offer in the preceding seven days. Bots and duplicates cannot be assigned. This is last-eligible-click attribution, not proof of a visitor's identity. Unmatched published conversions have click: null.
Later confirmed payments retain the acquisition click without a lifetime cutoff. Published amounts are numeric gross/net USD from native evidence, including signed reversals; known free subscriptions are 0/0. Subscriptions with missing or ambiguous financial evidence remain pending, exposed by pending_subscribers_total / pending_subscribers_count, rather than being falsely reported as free. Upsert stable conversion IDs and poll overlapping dates (at least seven days); the normal ingestion interval is five minutes and source delays can extend it.
Existing native campaign purchases
For legacy campaigns, use GET /v1/{account}/tracking-links/{campaign_id}/transactions or /spenders, with date_start/date_end, limit/offset and optional fan_id. These read actual campaign membership and gross/net financial records. A cold scan returns HTTP 202 and Retry-After: 2; repeat the same GET until 200. Pending status polls are free. Each completed report costs one native-read credit. Both reports share a five-minute key-scoped snapshot. Large histories may require a narrower time window. Native memberships can overlap between campaigns.
Legacy links never captured CreatorAPI click IDs or UTMs: their purchase rows have click: null. Do not mix these reports with first-party ad-attribution reports or add overlapping campaign totals as unique acquisition revenue.
Verification and integration handoff
Existing real campaign purchases and their per-fan sums were checked through the production API. Isolated tests also cover the first-party click/subscription/payment pipeline, but do not prove a real phone/desktop click-to-purchase chain. Instructify integration acceptance and the subsequent week-long comparison remain with the integrating team. Polling is supported; the optional Instructify-specific webhook event dialect is not implemented.
Revenue and subscription metrics
All endpoints below use GET and existing account/workspace/read permissions.
- /v1/{account}/analytics/earnings: total_gross, total_net, total_fees, count, by_type and by_type_details.
- /v1/{account}/analytics/transactions/summary: totals and counts grouped by native payment status.
- /v1/{account}/analytics/transactions/by-type: counts and gross/net/fees per native revenue type.
- /v1/{account}/analytics/transactions/count: period transaction count; not an existence flag.
- /v1/{account}/analytics/historical: monetary series; interval=day or month (default). Defaults to the preceding 365 days.
- /v1/{account}/analytics/comparison: period_a_start, period_a_end, period_b_start, period_b_end; gross revenue comparison.
- /v1/{account}/analytics/fans: period revenue per stable fan_id, including deleted fans; optional fan_id, limit (1–1000, default 100), offset. Descending gross revenue. Missing identities stay in a separate unattributed bucket. fan_count is not the number of subscribers.
- /v1/{account}/analytics/subscribers: historical total/new/renewed subscription-event counts, including daily count, new_count and renewed_count. Requires inclusive YYYY-MM-DD UTC dates, at most 366 days. Total must equal new plus renewed on every day, otherwise the request fails with 502.
Revenue routes accept start_date/end_date. Date-only ends include the entire UTC day; timestamp ends are exclusive. Other revenue routes default to the preceding 30 days. Invalid dates return 422. Gross excludes buyer taxes; net is the native ledger amount, not agency profit. Decimal sums return rounded USD JSON numbers. Native revenue types are preserved. Reversals use signed amounts; ambiguous positive reversals fail rather than guessing the sign. Unknown statuses remain grouped and are not counted as successful payments.
Pagination validates identities, duplicate changes, descending dates, cursor progress and completion. Incomplete data returns 502. History uses transactions, not post counts; zero days are filled only after a complete scan. Forecasts include completed zero-revenue days and start today. Forecasts are estimates.
With detailed=true (the default), detailed.paid_subscriptions and detailed.free_subscriptions count events with an observed historical subscription price; detailed.unknown_subscriptions is the remaining chart count. Unknown is not a deleted-fan count: it also includes missing history and unsupported event shapes. detailed.complete is false whenever unknown is nonzero. Current profile prices and renewedAt are not used to reconstruct historical payments. These are subscription-event counts, not revenue totals or unique fans.
Use detailed=false for chart totals without scanning fan histories. Charts are read in batches of at most 31 days. Detailed reads are limited to 50 pages and checked against a 60-second budget between calls; incomplete, repeated or invalid pages fail with 502. Shorten the period if a detailed request exceeds those bounds. Known paid and free counts may understate the true categories when unknown is nonzero.
Subscription verification: fresh January native charts reconcile to 518 total, 518 new and 0 renewed events, day by day. A seven-event day contains six dated free subscription records and one missing history, returned as unknown. Positive paid and renewal cases, partial history, pagination and failures were tested with synthetic fixtures; no paid subscription or renewal was created for testing.
Historical subscription events must not be replaced by current active fans. The two native subscriber-count endpoints returned different current values in the audit; no equivalence is claimed. New/renewed event counts use the historical chart filters. Paid/free classification uses dated subscription history; missing historical prices remain unknown. The attempted native earnings-chart query returned empty; revenue verification therefore used complete payout-transaction pages.
Example: GET /v1/{account}/analytics/fans?start_date=2026-01-01&end_date=2026-01-31
Verification: 37 January transactions from two freshly captured native pages and 18 fan IDs reconcile through isolated candidate HTTP for gross/net/fees, types, fans, daily/monthly history and comparisons. The 31-day subscription chart reconciles to 518 events. Correctness was checked with captured live data through isolated HTTP before deployment.
data-exports
Cancel export · catalog flag: verified
[data-exports] POST /v1/exports/{job_id}/cancel. Shared job API for OnlyFans, Fansly and 4based; dataset availability varies by platform. Fanvue exports are not enabled in this production release. Stops a queued or running export job.
POST /v1/exports/{job_id}/cancel · free
Path params: job_id
curl -X POST \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/exports/{job_id}/cancel" -d '{}'
import requests
r = requests.post(
"https://api.creator-api.com/v1/exports/{job_id}/cancel",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/exports/{job_id}/cancel", {
method: "POST",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Create export · catalog flag: verified
[data-exports] POST /v1/{account}/exports. Shared job API for OnlyFans, Fansly and 4based; dataset availability varies by platform. Fanvue exports are not enabled in this production release. Body: {dataset, fmt ("csv" default; also "jsonl", "xlsx", "zip"), max_rows, params}. XLSX preserves large IDs as text and does not execute formula-like text. ZIP contains data.csv and manifest.json for data datasets. Original-media ZIP export (media_vault) is not enabled or listed in this release. Live account checks returned CDN 403 with IP-bound signed URLs; the bounded archive implementation remains behind a closed release gate. Data ZIP contains records, not original media. Fansly media archives are also unavailable. CSV/ZIP formula-like strings, including column headers, are escaped with an apostrophe; JSONL preserves raw values. CSV/XLSX/ZIP use a private 512 MiB row spool; Excel cell/row limits fail the job without a partial download. OnlyFans/Fansly malformed pages, repeated pages, cursor cycles and exhausted safety budgets fail/refund rather than pretending to be complete. Explicit max_rows intentionally limits the output. Native snapshots, retention and provider data ceilings can still limit completeness. Date-only transaction and new dataset end dates include the full UTC day; timestamp ends are exclusive. chat_messages requires params.chat_id (numeric fan ID on OF or Fansly), one conversation per export with native cursor pagination; it sends no explicit read-receipt request, but provider-side unread state is not guaranteed unchanged. public_profiles requires 1-100 comma-separated params.usernames and returns only public fields from the connected OF account, not a broad profile database. trial_links, tracking_links, payouts, chargebacks and smart_links accept optional start_date/end_date. Native payout invoiceId, amounts and units are preserved; chargebacks retain their native payment object, not a synthesized signed transaction. smart_links exports only exactly owned workspace links and excludes delivery secrets/ownerless legacy links. New scans fail at 10000 pages/30 minutes checked around native requests, with a 16 MiB page limit; Fansly fan-to-group lookup uses at most 20 pages. Limits are not hard transport deadlines. Dataset params: subscribers takes {"type": "active" | "expired" | "all"}; mass_messages and direct_messages take {"startDate", "endDate"} as "YYYY-MM-DD HH:MM:SS" UTC and default to the last 365 days. transactions returns the full payout history newest first and also takes {"startDate", "endDate"} (ISO or "YYYY-MM-DD HH:MM:SS", UTC) to bound the window. mass_messages and direct_messages rows carry price, purchasedCount, viewedCount and the media ids per message (direct rows also messageId and toUserId), which is how purchases are attributed to content. One flat charge per job, whatever the size. Paginates the whole dataset in the background and returns a job id to poll. Live verified 2026-08-14 (created, completed, downloaded, 5-row CSV).
POST /v1/{account}/exports · 10 credit(s)
Path params: account
curl -X POST \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/exports" -d '{}'
import requests
r = requests.post(
"https://api.creator-api.com/v1/{account}/exports",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/exports", {
method: "POST",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Delete export
[data-exports] DELETE /v1/exports/{job_id}. Permanently removes an exactly owned, terminal export job and its output. Requires a full-scope key and export-manage permission for staff. Foreign or ownerless jobs return 404; queued, running or locked jobs return 409. Cancel and await a terminal state first. Storage removal failures return 503 and retain the job. Success returns {id, deleted: true}, invalidates download tokens, and preserves any required refund recovery intent. This deletes only the export copy, never source platform data. Tested through isolated HTTP; provider writes are not used.
DELETE /v1/exports/{job_id} · free
Path params: job_id
curl -X DELETE \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/exports/{job_id}" -d '{}'
import requests
r = requests.delete(
"https://api.creator-api.com/v1/exports/{job_id}",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/exports/{job_id}", {
method: "DELETE",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Download export · catalog flag: verified
[data-exports] GET /v1/exports/{job_id}/download?token=. Shared job API for OnlyFans, Fansly and 4based; dataset availability varies by platform. Fanvue exports are not enabled in this production release. Streams the completed export file; token comes from the download_url on a completed job's status. Live verified 2026-08-14.
GET /v1/exports/{job_id}/download · free
Path params: job_id
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/exports/{job_id}/download?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/exports/{job_id}/download?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/exports/{job_id}/download?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Get export status · catalog flag: verified
[data-exports] GET /v1/exports/{job_id}. Shared job API for OnlyFans, Fansly and 4based; dataset availability varies by platform. Fanvue exports are not enabled in this production release. Job status (queued/running/completed/failed/cancelled) + row_count; a completed job includes a signed download_url. Live verified 2026-08-14.
GET /v1/exports/{job_id} · free
Path params: job_id
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/exports/{job_id}"
import requests
r = requests.get(
"https://api.creator-api.com/v1/exports/{job_id}",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/exports/{job_id}", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
List export datasets · catalog flag: verified
[data-exports] GET /v1/exports/datasets?platform=onlyfans|fansly|4based (platform optional). Shared job API for OnlyFans, Fansly and 4based; dataset availability varies by platform. Fanvue exports are not enabled in this production release. Lists the dataset names available for bulk export. OnlyFans: subscribers, expired_fans, following, transactions, posts, chats, mass_messages, direct_messages, profile_visitors, trial_links, tracking_links, chat_messages, payouts, chargebacks, public_profiles and smart_links. Fansly additionally supports chat_messages alongside subscribers, subscriptions, transactions, chats and following. profile_visitors requires params={start_date,end_date}, inclusive YYYY-MM-DD UTC dates for 1–366 non-future days. It returns daily total visit counts, not visitor identities, with date, visitors, visitor_type=total and period_complete. Today is marked incomplete. Reads use at most 31 days per request; missing, duplicate or non-daily dates fail the job rather than inventing zeros. All four formats work. It is OnlyFans-only. chats returns conversation metadata, not a full message transcript. subscribers and following walk OnlyFans own fan lists and are complete at any size (verified against an account with 41648 fans). expired_fans stops at 5000 rows because OnlyFans serves no more than that for expired subscriptions. A running job reports its progress in row_count, so a large export can be followed while it writes. Live verified 2026-09-23.
GET /v1/exports/datasets · free
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/exports/datasets"
import requests
r = requests.get(
"https://api.creator-api.com/v1/exports/datasets",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/exports/datasets", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
List exports · catalog flag: verified
[data-exports] GET /v1/{account}/exports. Shared job API for OnlyFans, Fansly and 4based; dataset availability varies by platform. Fanvue exports are not enabled in this production release. Lists export jobs for the account, scoped to the calling key. Live verified 2026-08-14.
GET /v1/{account}/exports · free
Path params: account
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/exports"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/exports",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/exports", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Retry export · catalog flag: verified
[data-exports] POST /v1/exports/{job_id}/retry. Shared job API for OnlyFans, Fansly and 4based; dataset availability varies by platform. Fanvue exports are not enabled in this production release. Re-runs a failed export job.
POST /v1/exports/{job_id}/retry · free
Path params: job_id
curl -X POST \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/exports/{job_id}/retry" -d '{}'
import requests
r = requests.post(
"https://api.creator-api.com/v1/exports/{job_id}/retry",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/exports/{job_id}/retry", {
method: "POST",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
misc
Add media to list · catalog flag: verified
[media-vault-lists] POST /vault/lists/{id}/media.
POST /v1/{account}/native/vault/lists/{list_id}/media · 2 credit(s)
Path params: list_id
curl -X POST \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/vault/lists/{list_id}/media" -d '{}'
import requests
r = requests.post(
"https://api.creator-api.com/v1/{account}/native/vault/lists/{list_id}/media",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/vault/lists/{list_id}/media", {
method: "POST",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Add story to highlight
[story-highlights] PUT /stories/highlights/{id}.
PUT /v1/{account}/native/stories/highlights/{highlight_id} · 2 credit(s)
Path params: highlight_id
curl -X PUT \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/stories/highlights/{highlight_id}" -d '{}'
import requests
r = requests.put(
"https://api.creator-api.com/v1/{account}/native/stories/highlights/{highlight_id}",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/stories/highlights/{highlight_id}", {
method: "PUT",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Add users to user list · catalog flag: verified
[user-list-collections] POST /lists/{id}/users/{id}. FIXED 2026-08-14: the bulk POST /lists/users {id,users:[...]} shape is unreliable (400 List id not found, matches app/services/of_api.py's own comment). Real working call is per-user, no body -- confirmed live end-to-end 2026-08-14 (create list, add, verify, pin, remove, delete list, all 200).
POST /v1/{account}/native/lists/{list_id}/users/{user_id} · 2 credit(s) · FIXED 2026-08-14 -- the mapped bulk path POST /lists/users {id, users:[...]} was genuinely broken (confirmed "List id not found" against a real, freshly created, verified-existing list -- not a guessing/timing issue). Root cause found in existing code, not guessed: app/services/of_api.py already documents this exact same finding and already uses a working per-user path instead (of_native.add_to_list, live in hold_list.py). Re-mapped add_users_to_user_list to the real working shape: POST /lists/{list_id}/users/{user_id}, no body, one call per user. Full roundtrip live-proven on gammaboy1 2026-08-14: create_user_list -> add (this fix) -> GET verify user present -> pin_unpin_user_in_user_list -> GET verify pinned -> remove_user_from_a_user_list -> GET verify empty -> delete_user_list. All 8 calls 200, list fully cleaned up after. Function signature changed from (creator_id, body) to (creator_id, list_id, user_id, body) in both of_native_parity.py copies.
Path params: list_id, user_id
curl -X POST \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/lists/{list_id}/users/{user_id}" -d '{}'
import requests
r = requests.post(
"https://api.creator-api.com/v1/{account}/native/lists/{list_id}/users/{user_id}",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/lists/{list_id}/users/{user_id}", {
method: "POST",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Archive post · catalog flag: verified
[posts] POST /posts/{id}/archive. native path /posts/{id}/{state}archive
POST /v1/{account}/native/posts/{post_id}/archive · 2 credit(s)
Path params: post_id
curl -X POST \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/posts/{post_id}/archive" -d '{}'
import requests
r = requests.post(
"https://api.creator-api.com/v1/{account}/native/posts/{post_id}/archive",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/posts/{post_id}/archive", {
method: "POST",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Block user · catalog flag: verified
[users] POST /users/{id}/block.
POST /v1/{account}/native/users/{user_id}/block · 2 credit(s) · Route confirmed via fake-id probe (specific 'User not found' response); real block effect intentionally never fired against a real fan.
Path params: user_id
curl -X POST \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/users/{user_id}/block" -d '{}'
import requests
r = requests.post(
"https://api.creator-api.com/v1/{account}/native/users/{user_id}/block",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/users/{user_id}/block", {
method: "POST",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Clear user list · catalog flag: verified
[user-list-collections] DELETE /lists/{id}/users.
DELETE /v1/{account}/native/lists/{list_id}/users · 2 credit(s)
Path params: list_id
curl -X DELETE \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/lists/{list_id}/users" -d '{}'
import requests
r = requests.delete(
"https://api.creator-api.com/v1/{account}/native/lists/{list_id}/users",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/lists/{list_id}/users", {
method: "DELETE",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Delete bundle
[subscription-bundles] DELETE /subscriptions/bundles/{id}.
DELETE /v1/{account}/native/subscriptions/bundles/{bundle_id} · 2 credit(s)
Path params: bundle_id
curl -X DELETE \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/subscriptions/bundles/{bundle_id}" -d '{}'
import requests
r = requests.delete(
"https://api.creator-api.com/v1/{account}/native/subscriptions/bundles/{bundle_id}",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/subscriptions/bundles/{bundle_id}", {
method: "DELETE",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Delete chat · catalog flag: verified
[chats] DELETE /chats/{id}.
DELETE /v1/{account}/native/chats/{chat_id} · 2 credit(s)
Path params: chat_id
curl -X DELETE \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/chats/{chat_id}" -d '{}'
import requests
r = requests.delete(
"https://api.creator-api.com/v1/{account}/native/chats/{chat_id}",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/chats/{chat_id}", {
method: "DELETE",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Delete free trial link
[free-trial-links] DELETE /trials/{id}.
DELETE /v1/{account}/native/trials/{trial_id} · 2 credit(s)
Path params: trial_id
curl -X DELETE \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/trials/{trial_id}" -d '{}'
import requests
r = requests.delete(
"https://api.creator-api.com/v1/{account}/native/trials/{trial_id}",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/trials/{trial_id}", {
method: "DELETE",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Delete message · catalog flag: verified
[chat-messages] DELETE /messages/{id}.
DELETE /v1/{account}/native/messages/{message_id} · 2 credit(s)
Path params: message_id
curl -X DELETE \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/messages/{message_id}" -d '{}'
import requests
r = requests.delete(
"https://api.creator-api.com/v1/{account}/native/messages/{message_id}",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/messages/{message_id}", {
method: "DELETE",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Delete post · catalog flag: verified
[posts] DELETE /posts/{id}.
DELETE /v1/{account}/native/posts/{post_id} · 2 credit(s)
Path params: post_id
curl -X DELETE \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/posts/{post_id}" -d '{}'
import requests
r = requests.delete(
"https://api.creator-api.com/v1/{account}/native/posts/{post_id}",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/posts/{post_id}", {
method: "DELETE",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Delete promotion
[promotions] DELETE /promotions/{id}.
DELETE /v1/{account}/native/promotions/{promotion_id} · 2 credit(s)
Path params: promotion_id
curl -X DELETE \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/promotions/{promotion_id}" -d '{}'
import requests
r = requests.delete(
"https://api.creator-api.com/v1/{account}/native/promotions/{promotion_id}",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/promotions/{promotion_id}", {
method: "DELETE",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Delete social media button · catalog flag: verified
[settings] DELETE /users/social/buttons/{id}.
DELETE /v1/{account}/native/users/social/buttons/{button_id} · 2 credit(s) · REAL DESTRUCTIVE ACTION EXECUTED 2026-08-14 with Maxim's explicit authorization -- hyladiaz's Instagram button is genuinely deleted, no API restore path exists.
Path params: button_id
curl -X DELETE \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/users/social/buttons/{button_id}" -d '{}'
import requests
r = requests.delete(
"https://api.creator-api.com/v1/{account}/native/users/social/buttons/{button_id}",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/users/social/buttons/{button_id}", {
method: "DELETE",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Delete story · catalog flag: verified
[stories] DELETE /stories/{id}.
DELETE /v1/{account}/native/stories/{story_id} · 2 credit(s)
Path params: story_id
curl -X DELETE \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/stories/{story_id}" -d '{}'
import requests
r = requests.delete(
"https://api.creator-api.com/v1/{account}/native/stories/{story_id}",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/stories/{story_id}", {
method: "DELETE",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Delete story highlight
[story-highlights] DELETE /stories/highlights/{id}.
DELETE /v1/{account}/native/stories/highlights/{highlight_id} · 2 credit(s)
Path params: highlight_id
curl -X DELETE \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/stories/highlights/{highlight_id}" -d '{}'
import requests
r = requests.delete(
"https://api.creator-api.com/v1/{account}/native/stories/highlights/{highlight_id}",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/stories/highlights/{highlight_id}", {
method: "DELETE",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Delete tracking link · catalog flag: verified
[tracking-links] DELETE /campaigns/{id}.
DELETE /v1/{account}/native/campaigns/{campaign_id} · 2 credit(s)
Path params: campaign_id
curl -X DELETE \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/campaigns/{campaign_id}" -d '{}'
import requests
r = requests.delete(
"https://api.creator-api.com/v1/{account}/native/campaigns/{campaign_id}",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/campaigns/{campaign_id}", {
method: "DELETE",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Delete user list · catalog flag: verified
[user-list-collections] DELETE /lists/{id}.
DELETE /v1/{account}/native/lists/{list_id} · 2 credit(s)
Path params: list_id
curl -X DELETE \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/lists/{list_id}" -d '{}'
import requests
r = requests.delete(
"https://api.creator-api.com/v1/{account}/native/lists/{list_id}",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/lists/{list_id}", {
method: "DELETE",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Delete vault list · catalog flag: verified
[media-vault-lists] DELETE /vault/lists/{id}.
DELETE /v1/{account}/native/vault/lists/{list_id} · 2 credit(s)
Path params: list_id
curl -X DELETE \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/vault/lists/{list_id}" -d '{}'
import requests
r = requests.delete(
"https://api.creator-api.com/v1/{account}/native/vault/lists/{list_id}",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/vault/lists/{list_id}", {
method: "DELETE",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Get mass message · catalog flag: verified
[mass-messaging] GET /messages/queue/{id}.
GET /v1/{account}/native/messages/queue/{queue_id} · 1 credit(s)
Path params: queue_id
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/messages/queue/{queue_id}?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/messages/queue/{queue_id}?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/messages/queue/{queue_id}?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Get post · catalog flag: verified
[posts] GET /posts/{id}.
GET /v1/{account}/native/posts/{post_id} · 1 credit(s)
Path params: post_id
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/posts/{post_id}?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/posts/{post_id}?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/posts/{post_id}?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Get profile details · catalog flag: verified
[public-profiles] GET /users/{id}. exists as get_profile (by handle)
GET /v1/{account}/native/users/{user_id} · 1 credit(s)
Path params: user_id
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/users/{user_id}?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/users/{user_id}?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/users/{user_id}?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Get story stats · catalog flag: verified
[stories] GET /stories/{id}/stats.
GET /v1/{account}/native/stories/{story_id}/stats · 1 credit(s)
Path params: story_id
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/stories/{story_id}/stats?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/stories/{story_id}/stats?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/stories/{story_id}/stats?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Get subscription history · catalog flag: verified
[fans] GET /subscriptions/{id}/history.
GET /v1/{account}/native/subscriptions/{subscription_id}/history · 1 credit(s) · The path param subscription_id is really the fan's user_id (e.g. from list_active_fans), not a separate subscription-record id.
Path params: subscription_id
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/subscriptions/{subscription_id}/history?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/subscriptions/{subscription_id}/history?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/subscriptions/{subscription_id}/history?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Get transaction summary · catalog flag: verified
[analytics-financial] GET /payouts/transactions (fixed 2026-08-14 -- was pointed at /payments/all/transactions, a narrow/incomplete feed; /payouts/transactions is the real, complete, currently-updating ledger). Raw OF page, summarise client-side, or use the real server-side aggregation at get_analytics_transaction_summary.
GET /v1/{account}/native/payouts/transactions · 1 credit(s) · summarise client-side
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/payouts/transactions?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/payouts/transactions?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/payouts/transactions?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Get transactions by type · catalog flag: verified
[analytics-financial] GET /payouts/transactions (fixed 2026-08-14, see get_transaction_summary docstring for why). Raw OF page, filter by type client-side, or use the real server-side aggregation at get_analytics_transactions_by_type.
GET /v1/{account}/native/payouts/transactions · 1 credit(s) · summarise client-side
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/payouts/transactions?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/payouts/transactions?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/payouts/transactions?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Get user details · catalog flag: verified
[users] GET /users/{id}.
GET /v1/{account}/native/users/{user_id} · 1 credit(s)
Path params: user_id
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/users/{user_id}?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/users/{user_id}?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/users/{user_id}?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Get user list · catalog flag: verified
[user-list-collections] GET /lists/{id}.
GET /v1/{account}/native/lists/{list_id} · 1 credit(s)
Path params: list_id
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/lists/{list_id}?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/lists/{list_id}?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/lists/{list_id}?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Get vault media · catalog flag: verified
[media-vault] GET /vault/media/{id}.
GET /v1/{account}/native/vault/media/{media_id} · 1 credit(s)
Path params: media_id
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/vault/media/{media_id}?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/vault/media/{media_id}?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/vault/media/{media_id}?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Hide chat · catalog flag: verified
[chats] POST /chats/{id}/hide.
POST /v1/{account}/native/chats/{chat_id}/hide · 2 credit(s)
Path params: chat_id
curl -X POST \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/chats/{chat_id}/hide" -d '{}'
import requests
r = requests.post(
"https://api.creator-api.com/v1/{account}/native/chats/{chat_id}/hide",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/chats/{chat_id}/hide", {
method: "POST",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Like message · catalog flag: verified
[chat-messages] POST /messages/{id}/like.
POST /v1/{account}/native/messages/{message_id}/like · 2 credit(s) · Needs retest against an inbound (fan-authored) message -- our test message was one we sent, likely why 'like' rejected it while pin/unpin on the same id worked.
Path params: message_id
curl -X POST \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/messages/{message_id}/like" -d '{}'
import requests
r = requests.post(
"https://api.creator-api.com/v1/{account}/native/messages/{message_id}/like",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/messages/{message_id}/like", {
method: "POST",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
List chat media gallery · catalog flag: verified
[chats] GET /chats/{id}/media.
GET /v1/{account}/native/chats/{chat_id}/media · 1 credit(s)
Path params: chat_id
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/chats/{chat_id}/media?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/chats/{chat_id}/media?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/chats/{chat_id}/media?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
List chat messages · catalog flag: verified
[chat-messages] GET /chats/{id}/messages. exists as get_chat_messages. Each message includes an isOpened field, but it never reflects true read status, confirmed live against a real read message: it stays false even when the fan has demonstrably opened it. The field that actually works is isNew: it stays true until the fan genuinely opens the chat thread, then flips to false, confirmed live with a real read and unread control pair, and does not flip on its own just from polling it. Building per fan read tracking this way costs one call per fan per check at 1 credit each, cheap for a small audience but adds up fast for a mass message sent to hundreds or thousands of fans, and more importantly means many rapid sequential calls against the same connected account, which risks tripping OnlyFans own rate limiting or a session logout if pushed too hard in a short window. Test on a small audience first and pace repeated polls per fan rather than hammering this endpoint for every recipient of a big blast at once.
GET /v1/{account}/native/chats/{chat_id}/messages · 1 credit(s)
Path params: chat_id
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/chats/{chat_id}/messages?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/chats/{chat_id}/messages?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/chats/{chat_id}/messages?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
List pinned users in user list · catalog flag: verified
[user-list-collections] GET /lists/{id}/users/pinned.
GET /v1/{account}/native/lists/{list_id}/users/pinned · 1 credit(s)
Path params: list_id
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/lists/{list_id}/users/pinned?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/lists/{list_id}/users/pinned?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/lists/{list_id}/users/pinned?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
List shared tracking links · catalog flag: verified
[tracking-links] GET /campaigns/share-access. Tracking Links other creators have shared access to WITH this account (agency feature). Confirmed live 2026-08-16.
GET /v1/{account}/native/campaigns/share-access · 1 credit(s) · Live-tested 2026-08-16 on both hyladiaz and gammaboy1: real 200, empty list for both. Found by direct analogy to list_shared_trial_links's confirmed /trials/share-access, using this catalog's own established /trials vs /campaigns sibling-path pattern for trial vs tracking links -- not a blind guess.
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/campaigns/share-access?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/campaigns/share-access?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/campaigns/share-access?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
List story highlights · catalog flag: verified
[story-highlights] GET /users/{id}/stories/highlights.
GET /v1/{account}/native/users/{user_id}/stories/highlights · 1 credit(s)
Path params: user_id
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/users/{user_id}/stories/highlights?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/users/{user_id}/stories/highlights?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/users/{user_id}/stories/highlights?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
List story viewers · catalog flag: verified
[stories] GET /stories/{id}/viewers.
GET /v1/{account}/native/stories/{story_id}/viewers · 1 credit(s)
Path params: story_id
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/stories/{story_id}/viewers?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/stories/{story_id}/viewers?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/stories/{story_id}/viewers?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
List tracking link spenders · catalog flag: verified
[tracking-links] GET /campaigns/{id}/claimers.
GET /v1/{account}/native/campaigns/{campaign_id}/claimers · 1 credit(s)
Path params: campaign_id
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/campaigns/{campaign_id}/claimers?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/campaigns/{campaign_id}/claimers?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/campaigns/{campaign_id}/claimers?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
List tracking link subscribers · catalog flag: verified
[tracking-links] GET /campaigns/{id}/claimers.
GET /v1/{account}/native/campaigns/{campaign_id}/claimers · 1 credit(s)
Path params: campaign_id
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/campaigns/{campaign_id}/claimers?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/campaigns/{campaign_id}/claimers?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/campaigns/{campaign_id}/claimers?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
List user list users · catalog flag: verified
[user-list-collections] GET /lists/{id}/users.
GET /v1/{account}/native/lists/{list_id}/users · 1 credit(s)
Path params: list_id
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/lists/{list_id}/users?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/lists/{list_id}/users?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/lists/{list_id}/users?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Mark chat as read · catalog flag: verified
[chats] POST /chats/{id}/mark-as-read.
POST /v1/{account}/native/chats/{chat_id}/mark-as-read · 2 credit(s)
Path params: chat_id
curl -X POST \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/chats/{chat_id}/mark-as-read" -d '{}'
import requests
r = requests.post(
"https://api.creator-api.com/v1/{account}/native/chats/{chat_id}/mark-as-read",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/chats/{chat_id}/mark-as-read", {
method: "POST",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Mark chat as unread · catalog flag: verified
[chats] DELETE /chats/{id}/mark-as-read.
DELETE /v1/{account}/native/chats/{chat_id}/mark-as-read · 2 credit(s)
Path params: chat_id
curl -X DELETE \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/chats/{chat_id}/mark-as-read" -d '{}'
import requests
r = requests.delete(
"https://api.creator-api.com/v1/{account}/native/chats/{chat_id}/mark-as-read",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/chats/{chat_id}/mark-as-read", {
method: "DELETE",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Mark story as watched · catalog flag: verified
[stories] PUT /stories/{id}/watched.
PUT /v1/{account}/native/stories/{story_id}/watched · 2 credit(s)
Path params: story_id
curl -X PUT \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/stories/{story_id}/watched" -d '{}'
import requests
r = requests.put(
"https://api.creator-api.com/v1/{account}/native/stories/{story_id}/watched",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/stories/{story_id}/watched", {
method: "PUT",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Message buyers · catalog flag: verified
[engagement-messages] GET /messages/queue/{id}/buyers. sample 404 (no qmsg id on hyla)
GET /v1/{account}/native/messages/queue/{queue_id}/buyers · 1 credit(s)
Path params: queue_id
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/messages/queue/{queue_id}/buyers?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/messages/queue/{queue_id}/buyers?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/messages/queue/{queue_id}/buyers?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Mute chat notifications · catalog flag: verified
[chats] POST /chats/{id}/mute.
POST /v1/{account}/native/chats/{chat_id}/mute · 2 credit(s)
Path params: chat_id
curl -X POST \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/chats/{chat_id}/mute" -d '{}'
import requests
r = requests.post(
"https://api.creator-api.com/v1/{account}/native/chats/{chat_id}/mute",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/chats/{chat_id}/mute", {
method: "POST",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Pin message · catalog flag: verified
[chat-messages] POST /messages/{id}/pin.
POST /v1/{account}/native/messages/{message_id}/pin · 2 credit(s)
Path params: message_id
curl -X POST \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/messages/{message_id}/pin" -d '{}'
import requests
r = requests.post(
"https://api.creator-api.com/v1/{account}/native/messages/{message_id}/pin",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/messages/{message_id}/pin", {
method: "POST",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Pin unpin post · catalog flag: verified
[posts] POST /posts/{id}/pin.
POST /v1/{account}/native/posts/{post_id}/pin · 2 credit(s)
Path params: post_id
curl -X POST \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/posts/{post_id}/pin" -d '{}'
import requests
r = requests.post(
"https://api.creator-api.com/v1/{account}/native/posts/{post_id}/pin",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/posts/{post_id}/pin", {
method: "POST",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Pin unpin user in user list · catalog flag: verified
[user-list-collections] POST /lists/{id}/users/{id}/pin.
POST /v1/{account}/native/lists/{list_id}/users/{user_id}/pin · 2 credit(s) · CONFIRMED live 2026-08-14 as part of the same roundtrip: POST /lists/{list_id}/users/{user_id}/pin -> 200 {"success":true}, verified via GET /lists/{list_id}/users/pinned showing the user. Was previously blocked only because add_users_to_user_list couldn't get a user into a list to pin -- not broken itself.
Path params: list_id, user_id
curl -X POST \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/lists/{list_id}/users/{user_id}/pin" -d '{}'
import requests
r = requests.post(
"https://api.creator-api.com/v1/{account}/native/lists/{list_id}/users/{user_id}/pin",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/lists/{list_id}/users/{user_id}/pin", {
method: "POST",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Publish queue item
[queue] PUT /schedules/{id}/publish.
PUT /v1/{account}/native/schedules/{schedule_id}/publish · 2 credit(s)
Path params: schedule_id
curl -X PUT \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/schedules/{schedule_id}/publish" -d '{}'
import requests
r = requests.put(
"https://api.creator-api.com/v1/{account}/native/schedules/{schedule_id}/publish",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/schedules/{schedule_id}/publish", {
method: "PUT",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Remove media from list · catalog flag: verified
[media-vault-lists] DELETE /vault/lists/{id}/media.
DELETE /v1/{account}/native/vault/lists/{list_id}/media · 2 credit(s)
Path params: list_id
curl -X DELETE \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/vault/lists/{list_id}/media" -d '{}'
import requests
r = requests.delete(
"https://api.creator-api.com/v1/{account}/native/vault/lists/{list_id}/media",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/vault/lists/{list_id}/media", {
method: "DELETE",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Remove story from highlight
[story-highlights] DELETE /stories/highlights/{id}/{id}.
DELETE /v1/{account}/native/stories/highlights/{highlight_id}/{highlight_id2} · 2 credit(s)
Path params: highlight_id, highlight_id2
curl -X DELETE \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/stories/highlights/{highlight_id}/{highlight_id2}" -d '{}'
import requests
r = requests.delete(
"https://api.creator-api.com/v1/{account}/native/stories/highlights/{highlight_id}/{highlight_id2}",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/stories/highlights/{highlight_id}/{highlight_id2}", {
method: "DELETE",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Remove user from a user list · catalog flag: verified
[user-list-collections] DELETE /lists/{id}/users/{id}. exists as remove_from_list
DELETE /v1/{account}/native/lists/{list_id}/users/{user_id} · 2 credit(s) · CONFIRMED live 2026-08-14 as part of the add_users_to_user_list fix roundtrip on gammaboy1: DELETE /lists/{list_id}/users/{user_id} -> 200, user actually removed (GET list afterward returned empty users array). Was previously blocked only because there was no working way to get a user INTO a list to test removal on -- not broken itself.
Path params: list_id, user_id
curl -X DELETE \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/lists/{list_id}/users/{user_id}" -d '{}'
import requests
r = requests.delete(
"https://api.creator-api.com/v1/{account}/native/lists/{list_id}/users/{user_id}",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/lists/{list_id}/users/{user_id}", {
method: "DELETE",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Rename vault list · catalog flag: verified
[media-vault-lists] PATCH /vault/lists/{id}.
PATCH /v1/{account}/native/vault/lists/{list_id} · 2 credit(s)
Path params: list_id
curl -X PATCH \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/vault/lists/{list_id}" -d '{}'
import requests
r = requests.patch(
"https://api.creator-api.com/v1/{account}/native/vault/lists/{list_id}",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/vault/lists/{list_id}", {
method: "PATCH",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Restrict user · catalog flag: verified
[users] POST /users/{id}/restrict.
POST /v1/{account}/native/users/{user_id}/restrict · 2 credit(s) · Route confirmed via fake-id probe; real restrict effect intentionally never fired against a real fan.
Path params: user_id
curl -X POST \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/users/{user_id}/restrict" -d '{}'
import requests
r = requests.post(
"https://api.creator-api.com/v1/{account}/native/users/{user_id}/restrict",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/users/{user_id}/restrict", {
method: "POST",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Search chat messages · catalog flag: verified
[chat-messages] GET /chats/{id}/messages/search.
GET /v1/{account}/native/chats/{chat_id}/messages/search · 1 credit(s)
Path params: chat_id
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/chats/{chat_id}/messages/search?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/chats/{chat_id}/messages/search?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/chats/{chat_id}/messages/search?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Send chat message · catalog flag: verified
[chat-messages] POST /chats/{id}/messages. Send a direct message to one fan. chat_id is the fan user id. Body: {"text": "..."} sends a free text message and returns the created message object (has id). For a paid PPV message, add "price" (a number between 3 and 200) and either "lockedText": true (locks the text itself) or "mediaFiles": [...] (locks the attached media, upload it first via POST /v1/{account}/media/upload and pass its media_file object here). Optional "previews": [...] shows free preview media next to a locked send. Example: {"text": "check this out", "price": 5, "lockedText": false, "mediaFiles": [{"processId": "...", "host": "...", "name": "photo.jpg", "extra": {...}}]}. Live verified in production, including a real locked media PPV delivered and priced correctly for unlock. A send acts on the real account and reaches the fan immediately: treat every write as production, there is no sandbox.
POST /v1/{account}/native/chats/{chat_id}/messages · 2 credit(s)
Path params: chat_id
curl -X POST \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/chats/{chat_id}/messages" -d '{}'
import requests
r = requests.post(
"https://api.creator-api.com/v1/{account}/native/chats/{chat_id}/messages",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/chats/{chat_id}/messages", {
method: "POST",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Show post statistics · catalog flag: verified
[posts] GET /posts/{id}/stats.
GET /v1/{account}/native/posts/{post_id}/stats · 1 credit(s) · Returns lookCount (views), likeCount and commentCount plus daily charts. Live 200 on real posts 2026-09-18. Some posts have no statistics (check hasStats), those can answer 404.
Path params: post_id
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/posts/{post_id}/stats?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/posts/{post_id}/stats?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/posts/{post_id}/stats?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Show story · catalog flag: verified
[stories] GET /stories/{id}.
GET /v1/{account}/native/stories/{story_id} · 1 credit(s)
Path params: story_id
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/stories/{story_id}?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/stories/{story_id}?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/stories/{story_id}?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Show story highlight · catalog flag: verified
[story-highlights] GET /stories/highlights/{id}.
GET /v1/{account}/native/stories/highlights/{highlight_id} · 1 credit(s)
Path params: highlight_id
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/stories/highlights/{highlight_id}?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/stories/highlights/{highlight_id}?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/stories/highlights/{highlight_id}?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Show vault list · catalog flag: verified
[media-vault-lists] GET /vault/lists/{id}.
GET /v1/{account}/native/vault/lists/{list_id} · 1 credit(s)
Path params: list_id
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/vault/lists/{list_id}?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/vault/lists/{list_id}?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/vault/lists/{list_id}?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Stop promotion
[promotions] POST /promotions/{id}/finish.
POST /v1/{account}/native/promotions/{promotion_id}/finish · 2 credit(s)
Path params: promotion_id
curl -X POST \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/promotions/{promotion_id}/finish" -d '{}'
import requests
r = requests.post(
"https://api.creator-api.com/v1/{account}/native/promotions/{promotion_id}/finish",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/promotions/{promotion_id}/finish", {
method: "POST",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Subscribe to user · catalog flag: verified
[users] POST /users/{id}/subscribe.
POST /v1/{account}/native/users/{user_id}/subscribe · 2 credit(s) · Live-proven 2026-08-14 on the pre-authorized gammaboy1<->hyladiaz pair: POST /users/493820841/subscribe (gamma->hyla) returned 200 and created a real, verified active subscription (confirmed via GET /subscriptions/subscribes?type=active, hyla's id appeared). Used to unblock testing unsubscribe_from_user, which needed a fresh active subscription.
Path params: user_id
curl -X POST \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/users/{user_id}/subscribe" -d '{}'
import requests
r = requests.post(
"https://api.creator-api.com/v1/{account}/native/users/{user_id}/subscribe",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/users/{user_id}/subscribe", {
method: "POST",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Unblock user · catalog flag: verified
[users] DELETE /users/{id}/block.
DELETE /v1/{account}/native/users/{user_id}/block · 2 credit(s)
Path params: user_id
curl -X DELETE \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/users/{user_id}/block" -d '{}'
import requests
r = requests.delete(
"https://api.creator-api.com/v1/{account}/native/users/{user_id}/block",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/users/{user_id}/block", {
method: "DELETE",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Unlike message · catalog flag: verified
[chat-messages] DELETE /messages/{id}/like.
DELETE /v1/{account}/native/messages/{message_id}/like · 2 credit(s) · Same caveat as like_message.
Path params: message_id
curl -X DELETE \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/messages/{message_id}/like" -d '{}'
import requests
r = requests.delete(
"https://api.creator-api.com/v1/{account}/native/messages/{message_id}/like",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/messages/{message_id}/like", {
method: "DELETE",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Unmute chat notifications · catalog flag: verified
[chats] DELETE /chats/{id}/mute.
DELETE /v1/{account}/native/chats/{chat_id}/mute · 2 credit(s)
Path params: chat_id
curl -X DELETE \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/chats/{chat_id}/mute" -d '{}'
import requests
r = requests.delete(
"https://api.creator-api.com/v1/{account}/native/chats/{chat_id}/mute",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/chats/{chat_id}/mute", {
method: "DELETE",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Unpin message · catalog flag: verified
[chat-messages] DELETE /messages/{id}/pin.
DELETE /v1/{account}/native/messages/{message_id}/pin · 2 credit(s)
Path params: message_id
curl -X DELETE \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/messages/{message_id}/pin" -d '{}'
import requests
r = requests.delete(
"https://api.creator-api.com/v1/{account}/native/messages/{message_id}/pin",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/messages/{message_id}/pin", {
method: "DELETE",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Unrestrict user · catalog flag: verified
[users] DELETE /users/{id}/restrict.
DELETE /v1/{account}/native/users/{user_id}/restrict · 2 credit(s)
Path params: user_id
curl -X DELETE \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/users/{user_id}/restrict" -d '{}'
import requests
r = requests.delete(
"https://api.creator-api.com/v1/{account}/native/users/{user_id}/restrict",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/users/{user_id}/restrict", {
method: "DELETE",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Unsend delete mass message · catalog flag: verified
[mass-messaging] DELETE /messages/queue/{id}.
DELETE /v1/{account}/native/messages/queue/{queue_id} · 2 credit(s)
Path params: queue_id
curl -X DELETE \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/messages/queue/{queue_id}" -d '{}'
import requests
r = requests.delete(
"https://api.creator-api.com/v1/{account}/native/messages/queue/{queue_id}",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/messages/queue/{queue_id}", {
method: "DELETE",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Unsubscribe from user · catalog flag: verified
[users] DELETE /users/{id}/subscribe.
DELETE /v1/{account}/native/users/{user_id}/subscribe · 2 credit(s) · SOLVED 2026-08-14. The required 'reason' value is a numeric enum in the JSON body -- {"reason": 1} returns 200. Confirmed live: created a fresh active subscription via subscribe_to_user, then unsubscribed with reason=1, then verified via GET /subscriptions/subscribes?type=active that hyla's id was gone -- state matched the exact pre-test baseline. Earlier attempts failed for two stacked reasons: string reason values ('other' etc.) always get "Invalid reason", and separately gamma's prior subscription to hyla (from the July audit) had already lapsed by 2026-08-14 -- confirmed via GET /subscriptions/subscribes?type=active and type=expired, hyla's id was in neither list -- so early numeric attempts (reason=0/5) failed with "Subscription not found", not "Invalid reason", which was the clue that led to testing against a freshly created subscription instead.
Path params: user_id
curl -X DELETE \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/users/{user_id}/subscribe" -d '{}'
import requests
r = requests.delete(
"https://api.creator-api.com/v1/{account}/native/users/{user_id}/subscribe",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/users/{user_id}/subscribe", {
method: "DELETE",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Update mass message · catalog flag: verified
[mass-messaging] PUT /messages/queue/{id}.
PUT /v1/{account}/native/messages/queue/{queue_id} · 2 credit(s)
Path params: queue_id
curl -X PUT \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/messages/queue/{queue_id}" -d '{}'
import requests
r = requests.put(
"https://api.creator-api.com/v1/{account}/native/messages/queue/{queue_id}",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/messages/queue/{queue_id}", {
method: "PUT",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Update post · catalog flag: verified
[posts] PUT /posts/{id}.
PUT /v1/{account}/native/posts/{post_id} · 2 credit(s)
Path params: post_id
curl -X PUT \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/posts/{post_id}" -d '{}'
import requests
r = requests.put(
"https://api.creator-api.com/v1/{account}/native/posts/{post_id}",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/posts/{post_id}", {
method: "PUT",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Update social media button
[settings] PUT /users/social/buttons/{id}.
PUT /v1/{account}/native/users/social/buttons/{button_id} · 2 credit(s) · Requires {socialMedia, label, link} -- exact valid 'link' format for existing platforms not resolved.
Path params: button_id
curl -X PUT \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/users/social/buttons/{button_id}" -d '{}'
import requests
r = requests.put(
"https://api.creator-api.com/v1/{account}/native/users/social/buttons/{button_id}",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/users/social/buttons/{button_id}", {
method: "PUT",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Update story highlight
[story-highlights] PATCH /stories/highlights/{id}.
PATCH /v1/{account}/native/stories/highlights/{highlight_id} · 2 credit(s)
Path params: highlight_id
curl -X PATCH \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/stories/highlights/{highlight_id}" -d '{}'
import requests
r = requests.patch(
"https://api.creator-api.com/v1/{account}/native/stories/highlights/{highlight_id}",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/stories/highlights/{highlight_id}", {
method: "PATCH",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Update user list · catalog flag: verified
[user-list-collections] PATCH /lists/{id}.
PATCH /v1/{account}/native/lists/{list_id} · 2 credit(s)
Path params: list_id
curl -X PATCH \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/lists/{list_id}" -d '{}'
import requests
r = requests.patch(
"https://api.creator-api.com/v1/{account}/native/lists/{list_id}",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/lists/{list_id}", {
method: "PATCH",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
payouts
Can add vat documents · catalog flag: verified
[payouts] GET /payouts/can-add-vat-documents. Whether VAT documents may be submitted right now. Live verified 2026-09-23 (route read off the OnlyFans web client build 202609221225).
GET /v1/{account}/native/payouts/can-add-vat-documents · 1 credit(s) · whether VAT documents may be submitted (live verified 2026-09-23)
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/payouts/can-add-vat-documents?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/payouts/can-add-vat-documents?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/payouts/can-add-vat-documents?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Get account balances · catalog flag: verified
[payouts] GET /payouts/balances.
GET /v1/{account}/native/payouts/balances · 1 credit(s)
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/payouts/balances?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/payouts/balances?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/payouts/balances?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Get earning statistics · catalog flag: verified
[payouts] GET /payouts/stats.
GET /v1/{account}/native/payouts/stats · 1 credit(s)
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/payouts/stats?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/payouts/stats?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/payouts/stats?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Get earnings total · catalog flag: verified
[payouts] GET /payouts/chart. One earnings total plus the delta. Query: startDate, endDate, withTotal, filter[total]. Live verified 2026-09-23 (route read off the OnlyFans web client build 202609221225).
GET /v1/{account}/native/payouts/chart · 1 credit(s) · startDate, endDate, withTotal, filter[total]: one total plus the delta (live verified 2026-09-23)
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/payouts/chart?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/payouts/chart?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/payouts/chart?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Get eligibility · catalog flag: verified
[payouts] GET /payouts/check-receive.
GET /v1/{account}/native/payouts/check-receive · 1 credit(s)
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/payouts/check-receive?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/payouts/check-receive?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/payouts/check-receive?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Get payout balances · catalog flag: verified
[payouts] GET /payouts/balances. Available and pending balance, payout limits and the withdrawal period. Live verified 2026-09-23 (route read off the OnlyFans web client build 202609221225).
GET /v1/{account}/native/payouts/balances · 1 credit(s)
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/payouts/balances?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/payouts/balances?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/payouts/balances?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Get vat details · catalog flag: verified
[payouts] GET /payouts/vat. The VAT registration on file. Live verified 2026-09-23 (route read off the OnlyFans web client build 202609221225).
GET /v1/{account}/native/payouts/vat · 1 credit(s) · the VAT registration on file (live verified 2026-09-23)
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/payouts/vat?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/payouts/vat?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/payouts/vat?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
List payout methods · catalog flag: verified
[payouts] GET /payouts/other/bank. The payout methods this account can use. Live verified 2026-09-23 (route read off the OnlyFans web client build 202609221225).
GET /v1/{account}/native/payouts/other/bank · 1 credit(s) · the payout methods this account can use (live verified 2026-09-23)
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/payouts/other/bank?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/payouts/other/bank?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/payouts/other/bank?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
List payout requests · catalog flag: verified
[payouts] GET /payouts/requests.
GET /v1/{account}/native/payouts/requests · 1 credit(s)
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/payouts/requests?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/payouts/requests?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/payouts/requests?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
List referral payout requests · catalog flag: verified
[payouts] GET /payouts/requests/referral. Referral payout requests, empty when none were requested. Live verified 2026-09-23 (route read off the OnlyFans web client build 202609221225).
GET /v1/{account}/native/payouts/requests/referral · 1 credit(s) · empty when none were requested (live verified 2026-09-23)
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/payouts/requests/referral?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/payouts/requests/referral?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/payouts/requests/referral?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
List stripe payout requests · catalog flag: verified
[payouts] GET /payouts/requests/stripe. Stripe payout requests. Query: limit, lastPayoutId. Empty when none were requested. Live verified 2026-09-23 (route read off the OnlyFans web client build 202609221225).
GET /v1/{account}/native/payouts/requests/stripe · 1 credit(s) · limit, lastPayoutId; empty when none were requested (live verified 2026-09-23)
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/payouts/requests/stripe?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/payouts/requests/stripe?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/payouts/requests/stripe?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
List vat document requests · catalog flag: verified
[payouts] GET /payouts/requests/vat-documents. Submitted VAT documents, empty when none were submitted. Live verified 2026-09-23 (route read off the OnlyFans web client build 202609221225).
GET /v1/{account}/native/payouts/requests/vat-documents · 1 credit(s) · empty when none were submitted (live verified 2026-09-23)
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/payouts/requests/vat-documents?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/payouts/requests/vat-documents?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/payouts/requests/vat-documents?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
List vat entries · catalog flag: verified
[payouts] GET /payouts/vats. VAT entries, empty when the account has none. Live verified 2026-09-23 (route read off the OnlyFans web client build 202609221225).
GET /v1/{account}/native/payouts/vats · 1 credit(s) · empty when the account has no VAT entries (live verified 2026-09-23)
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/payouts/vats?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/payouts/vats?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/payouts/vats?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Request manual withdrawal
[payouts] POST /payouts/requests.
POST /v1/{account}/native/payouts/requests · 2 credit(s)
curl -X POST \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/payouts/requests" -d '{}'
import requests
r = requests.post(
"https://api.creator-api.com/v1/{account}/native/payouts/requests",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/payouts/requests", {
method: "POST",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Update payout frequency
[payouts] PATCH /payouts/requests.
PATCH /v1/{account}/native/payouts/requests · 2 credit(s)
curl -X PATCH \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/payouts/requests" -d '{}'
import requests
r = requests.patch(
"https://api.creator-api.com/v1/{account}/native/payouts/requests",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/payouts/requests", {
method: "PATCH",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
settings
Add social media button
[settings] POST /users/social/buttons. Body needs "buttonIds" (OF: "ButtonIds is required" / "ButtonIds are invalid" on an empty body) -- plural and array-shaped, which reads more like selecting from a fixed set of button/platform types than freely creating one with an arbitrary label+url. NOT confirmed: the competitor's equivalent endpoint takes {label, type, value} instead, which may reflect a different abstraction on their side rather than the raw native shape. Needs an OF web-app JS grep to nail down for real -- live-probed 2026-08-12, empty body only.
POST /v1/{account}/native/users/social/buttons · 2 credit(s)
curl -X POST \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/users/social/buttons" -d '{}'
import requests
r = requests.post(
"https://api.creator-api.com/v1/{account}/native/users/social/buttons",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/users/social/buttons", {
method: "POST",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Check username availability · catalog flag: verified
[settings] POST /users/exists.
POST /v1/{account}/native/users/exists · 2 credit(s)
curl -X POST \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/users/exists" -d '{}'
import requests
r = requests.post(
"https://api.creator-api.com/v1/{account}/native/users/exists",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/users/exists", {
method: "POST",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Enable disable drm · catalog flag: verified
[settings] PUT /users/me/settings/security. body: isDrmEnabled (bool)
PUT /v1/{account}/native/users/me/settings/security · 2 credit(s) · Consistently "Please refresh the page" on a healthy session -- unresolved, needs OF web-app JS-grep discovery. See needs-discovery.md.
curl -X PUT \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/users/me/settings/security" -d '{}'
import requests
r = requests.put(
"https://api.creator-api.com/v1/{account}/native/users/me/settings/security",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/users/me/settings/security", {
method: "PUT",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Enable disable welcome message
[settings] POST /messages/templates/reply_on_subscribe.
POST /v1/{account}/native/messages/templates/reply_on_subscribe · 2 credit(s) · the new-subscriber welcome template
curl -X POST \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/messages/templates/reply_on_subscribe" -d '{}'
import requests
r = requests.post(
"https://api.creator-api.com/v1/{account}/native/messages/templates/reply_on_subscribe",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/messages/templates/reply_on_subscribe", {
method: "POST",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Get blocked countries · catalog flag: verified
[settings] GET /users/me/settings. blockedCountries field
GET /v1/{account}/native/users/me/settings · 1 credit(s) · exists as get_settings
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/users/me/settings?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/users/me/settings?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/users/me/settings?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Get call settings · catalog flag: verified
[settings] GET /users/settings/calls. Video and audio call prices and whether incoming calls are on. Live verified 2026-09-23 (route read off the OnlyFans web client build 202609221225).
GET /v1/{account}/native/users/settings/calls · 1 credit(s) · video and audio call prices, incoming calls on or off (live verified 2026-09-23)
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/users/settings/calls?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/users/settings/calls?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/users/settings/calls?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Get drm status · catalog flag: verified
[settings] GET /users/me/settings. drm field
GET /v1/{account}/native/users/me/settings · 1 credit(s) · exists as get_settings
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/users/me/settings?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/users/me/settings?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/users/me/settings?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Get settings · catalog flag: verified
[settings] GET /users/me/settings. exists as get_settings
GET /v1/{account}/native/users/me/settings · 1 credit(s) · exists as get_settings
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/users/me/settings?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/users/me/settings?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/users/me/settings?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Get story settings · catalog flag: verified
[settings] GET /users/settings/story. Who may reply to stories. Live verified 2026-09-23 (route read off the OnlyFans web client build 202609221225).
GET /v1/{account}/native/users/settings/story · 1 credit(s) · who may reply to stories (live verified 2026-09-23)
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/users/settings/story?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/users/settings/story?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/users/settings/story?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Get stream settings · catalog flag: verified
[settings] GET /users/settings/streams. Price limits and what this account may stream. Live verified 2026-09-23 (route read off the OnlyFans web client build 202609221225).
GET /v1/{account}/native/users/settings/streams · 1 credit(s) · price limits and what this account may stream (live verified 2026-09-23)
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/users/settings/streams?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/users/settings/streams?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/users/settings/streams?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Get welcome message · catalog flag: verified
[settings] GET /messages/templates/reply_on_subscribe.
GET /v1/{account}/native/messages/templates/reply_on_subscribe · 1 credit(s) · Live-exercised repeatedly 2026-08-14 in both states: returns a full template object (id, text, price, isActive, media, etc.) when a template exists, and a clean 404 {"error":{"message":"Template not found."}} when none exists (verified on both hyladiaz and gammaboy1). Previously marked UNTESTABLE; reclassified now that both response shapes have been observed live.
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/messages/templates/reply_on_subscribe?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/messages/templates/reply_on_subscribe?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/messages/templates/reply_on_subscribe?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
List notification transports · catalog flag: verified
[settings] GET /users/settings/notifications/transports. The channels OnlyFans can notify on. Live verified 2026-09-23 (route read off the OnlyFans web client build 202609221225).
GET /v1/{account}/native/users/settings/notifications/transports · 1 credit(s) · the channels OnlyFans can notify on (live verified 2026-09-23)
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/users/settings/notifications/transports?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/users/settings/notifications/transports?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/users/settings/notifications/transports?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
List social media buttons · catalog flag: verified
[settings] GET /users/social/buttons.
GET /v1/{account}/native/users/social/buttons · 1 credit(s)
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/users/social/buttons?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/users/social/buttons?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/users/social/buttons?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Reorder social media buttons · catalog flag: verified
[settings] PUT /users/social/buttons.
PUT /v1/{account}/native/users/social/buttons · 2 credit(s) · This IS what add_social_media_button's documented route actually does -- see that entry.
curl -X PUT \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/users/social/buttons" -d '{}'
import requests
r = requests.put(
"https://api.creator-api.com/v1/{account}/native/users/social/buttons",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/users/social/buttons", {
method: "PUT",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Update blocked countries · catalog flag: verified
[settings] PUT /users/me/settings/security. body: blockedCountries (list of ISO country codes)
PUT /v1/{account}/native/users/me/settings/security · 2 credit(s) · Consistently "Please refresh the page" on a healthy session -- unresolved, needs OF web-app JS-grep discovery. See needs-discovery.md.
curl -X PUT \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/users/me/settings/security" -d '{}'
import requests
r = requests.put(
"https://api.creator-api.com/v1/{account}/native/users/me/settings/security",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/users/me/settings/security", {
method: "PUT",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Update welcome message · catalog flag: verified
[settings] POST /messages/templates/reply_on_subscribe.
POST /v1/{account}/native/messages/templates/reply_on_subscribe · 2 credit(s) · the new-subscriber welcome template ADDITIONAL 2026-08-14: DELETE /messages/templates/reply_on_subscribe also works (200 {"success":true}) and fully clears the template back to the true empty state (subsequent GET returns 404 "Template not found.", not just an empty-text POST -- empty string "" in POST's text field is itself rejected with "Text is not valid", so DELETE is the only real way to reset. Confirmed live on both hyladiaz and gammaboy1, used to clean up test artifacts from this session.
curl -X POST \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/messages/templates/reply_on_subscribe" -d '{}'
import requests
r = requests.post(
"https://api.creator-api.com/v1/{account}/native/messages/templates/reply_on_subscribe",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/messages/templates/reply_on_subscribe", {
method: "POST",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
smart-links
Add smart link tags · catalog flag: verified
Body: {tags: [string]}. Live verified 2026-08-14.
POST /v1/{account}/smart-links/{smart_link_id}/tags · 1 credit(s)
Path params: account, smart_link_id
curl -X POST \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}/tags" -d '{}'
import requests
r = requests.post(
"https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}/tags",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}/tags", {
method: "POST",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Create smart link · catalog flag: verified
Create a first-party Smart Link backed by real OnlyFans tracking inventory. Body: {name, link_type}; use link_type=tracking_link for ad tracking. Advertise the returned traffic_redirect_url (/go/{id}) to capture individual clicks and UTMs. This is a real provider write, not a sandbox. See /docs/instructify-tracking.md.
POST /v1/{account}/smart-links · 1 credit(s)
Path params: account
curl -X POST \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/smart-links" -d '{}'
import requests
r = requests.post(
"https://api.creator-api.com/v1/{account}/smart-links",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/smart-links", {
method: "POST",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Create smart link pixel · catalog flag: verified
Body: {platform: meta|tiktok|ga4, label, pixel_id, credential}. BYOP (bring your own pixel/token) -- the caller generates pixel_id+credential themselves in their own Meta/TikTok/GA4 account, same pattern onlyfansapi.com uses. Live verified 2026-08-14. Platform contracts: Meta Conversions API (https://developers.facebook.com/docs/marketing-api/conversions-api/using-the-api), TikTok Events API v1.3, GA4 Measurement Protocol (https://developers.google.com/analytics/devguides/collection/protocol/ga4/sending-events). Google Ads' own conversion-upload API is NOT supported -- it requires a Google-approved developer token tied to a Google Ads manager account, real external gatekeeping outside our control.
POST /v1/{account}/smart-links/{smart_link_id}/pixels · 1 credit(s)
Path params: account, smart_link_id
curl -X POST \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}/pixels" -d '{}'
import requests
r = requests.post(
"https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}/pixels",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}/pixels", {
method: "POST",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Create smart link postback · catalog flag: verified
Body: {url, http_method, body, headers, smart_link_scope, conversion_types, smart_link_ids}. Delivery happens from the smart-link poller when a matching conversion is detected. Live verified 2026-08-14.
POST /v1/{account}/smart-link-postbacks · 1 credit(s)
Path params: account
curl -X POST \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/smart-link-postbacks" -d '{}'
import requests
r = requests.post(
"https://api.creator-api.com/v1/{account}/smart-link-postbacks",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/smart-link-postbacks", {
method: "POST",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Delete smart link · catalog flag: verified
Disable the redirect and delete only this Smart Link and its native inventory. Native cleanup failure returns 502 and preserves recovery identifiers; success alone is not independent removal proof. Do not blindly retry an unclear provider write. See the integration guide cleanup section.
DELETE /v1/{account}/smart-links/{smart_link_id} · 1 credit(s)
Path params: account, smart_link_id
curl -X DELETE \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}" -d '{}'
import requests
r = requests.delete(
"https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}", {
method: "DELETE",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Delete smart link pixel · catalog flag: verified
Live verified 2026-08-14.
DELETE /v1/{account}/smart-links/{smart_link_id}/pixels/{pixel_id} · 1 credit(s)
Path params: account, smart_link_id, pixel_id
curl -X DELETE \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}/pixels/{pixel_id}" -d '{}'
import requests
r = requests.delete(
"https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}/pixels/{pixel_id}",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}/pixels/{pixel_id}", {
method: "DELETE",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Delete smart link postback · catalog flag: verified
Live verified 2026-08-14.
DELETE /v1/{account}/smart-link-postbacks/{postback_id} · 1 credit(s)
Path params: account, postback_id
curl -X DELETE \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/smart-link-postbacks/{postback_id}" -d '{}'
import requests
r = requests.delete(
"https://api.creator-api.com/v1/{account}/smart-link-postbacks/{postback_id}",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/smart-link-postbacks/{postback_id}", {
method: "DELETE",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Get smart link · catalog flag: verified
Live verified 2026-08-14.
GET /v1/{account}/smart-links/{smart_link_id} · free
Path params: account, smart_link_id
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Get smart link clicks · catalog flag: verified
Read individually recorded CreatorAPI redirect clicks, including UTM/click IDs, referrer and bot/duplicate flags. Native-only historical links have no retroactive per-visit data. For the Instructify data envelope and ISO date filters use GET /api/smart-links/{smart_link_id}/clicks; legacy /v1 query/response formats remain distinct.
GET /v1/{account}/smart-links/{smart_link_id}/clicks · free
Path params: account, smart_link_id
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}/clicks"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}/clicks",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}/clicks", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Get smart link conversions · catalog flag: verified
Recorded first-party acquisition and payment conversions, including click attribution when available. For the Instructify data envelope, numeric USD publication and ISO date filters use GET /api/smart-links/{smart_link_id}/conversions. Legacy /v1 reports retain their own response format and pending financial evidence.
GET /v1/{account}/smart-links/{smart_link_id}/conversions · free · 2026-10-07: OnlyFans polling persists page progress and deduplicates observed conversions; initial history is silent. Coverage is recorded conversions, not complete historical attribution. Delivery retries are isolated-tested, not advertising-platform end-to-end verified.
Path params: account, smart_link_id
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}/conversions"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}/conversions",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}/conversions", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Get smart link fans · catalog flag: verified
Fan list for this link's claimers. Live verified 2026-08-14.
GET /v1/{account}/smart-links/{smart_link_id}/fans · free
Path params: account, smart_link_id
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}/fans"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}/fans",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}/fans", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Get smart link postback · catalog flag: verified
Live verified 2026-08-14.
GET /v1/{account}/smart-link-postbacks/{postback_id} · free
Path params: account, postback_id
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/smart-link-postbacks/{postback_id}"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/smart-link-postbacks/{postback_id}",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/smart-link-postbacks/{postback_id}", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Get smart link spenders
Observed campaign-attributed gross revenue per fan; provider lifetime spend is separate. Coverage is recorded conversions only.
GET /v1/{account}/smart-links/{smart_link_id}/spenders · free · 2026-10-06: corrected attribution boundary; isolated regressions passed; recorded-conversions coverage. 2026-10-07: OnlyFans polling persists page progress and deduplicates observed conversions; initial history is silent. Coverage is recorded conversions, not complete historical attribution. Delivery retries are isolated-tested, not advertising-platform end-to-end verified.
Path params: account, smart_link_id
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}/spenders"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}/spenders",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}/spenders", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Get smart link stats · catalog flag: verified
Real OF-reported subscriber-conversion trend + click/subscriber totals for this link. Live verified 2026-08-14.
GET /v1/{account}/smart-links/{smart_link_id}/stats · free · 2026-10-07: OnlyFans polling persists page progress and deduplicates observed conversions; initial history is silent. Coverage is recorded conversions, not complete historical attribution. Delivery retries are isolated-tested, not advertising-platform end-to-end verified.
Path params: account, smart_link_id
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}/stats"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}/stats",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}/stats", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
List smart link pixels · catalog flag: verified
Credentials are never echoed back. Live verified 2026-08-14.
GET /v1/{account}/smart-links/{smart_link_id}/pixels · free
Path params: account, smart_link_id
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}/pixels"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}/pixels",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}/pixels", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
List smart link postbacks · catalog flag: verified
Live verified 2026-08-14.
GET /v1/{account}/smart-link-postbacks · free
Path params: account
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/smart-link-postbacks"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/smart-link-postbacks",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/smart-link-postbacks", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
List smart link tags · catalog flag: verified
Local metadata, not an OF concept. Live verified 2026-08-14.
GET /v1/{account}/smart-links/{smart_link_id}/tags · free
Path params: account, smart_link_id
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}/tags"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}/tags",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}/tags", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
List smart links · catalog flag: verified
List smart links for the account. Live verified 2026-08-14.
GET /v1/{account}/smart-links · free
Path params: account
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/smart-links"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/smart-links",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/smart-links", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Remove smart link tags · catalog flag: verified
Body: {tags: [string]}. Live verified 2026-08-14.
DELETE /v1/{account}/smart-links/{smart_link_id}/tags · 1 credit(s)
Path params: account, smart_link_id
curl -X DELETE \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}/tags" -d '{}'
import requests
r = requests.delete(
"https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}/tags",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}/tags", {
method: "DELETE",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Test smart link pixel
Sends a real event to the pixel's platform using its stored credential. Request construction verified against each platform's official documented contract + a local mock (2026-08-14) -- NOT live-delivered to a real Meta/TikTok/GA4 account in this session (no test credentials available); will genuinely deliver once a caller configures a real pixel_id+credential of their own.
POST /v1/{account}/smart-links/{smart_link_id}/pixels/{pixel_id}/test-event · 1 credit(s) · Request shape verified against each platform's docs + a local mock, not against a real Meta/TikTok/GA4 account (no test credentials available).
Path params: account, smart_link_id, pixel_id
curl -X POST \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}/pixels/{pixel_id}/test-event" -d '{}'
import requests
r = requests.post(
"https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}/pixels/{pixel_id}/test-event",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}/pixels/{pixel_id}/test-event", {
method: "POST",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Update smart link pixel · catalog flag: verified
Live verified 2026-08-14.
PATCH /v1/{account}/smart-links/{smart_link_id}/pixels/{pixel_id} · 1 credit(s)
Path params: account, smart_link_id, pixel_id
curl -X PATCH \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}/pixels/{pixel_id}" -d '{}'
import requests
r = requests.patch(
"https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}/pixels/{pixel_id}",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/smart-links/{smart_link_id}/pixels/{pixel_id}", {
method: "PATCH",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Update smart link postback · catalog flag: verified
Live verified 2026-08-14.
PATCH /v1/{account}/smart-link-postbacks/{postback_id} · 1 credit(s)
Path params: account, postback_id
curl -X PATCH \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/smart-link-postbacks/{postback_id}" -d '{}'
import requests
r = requests.patch(
"https://api.creator-api.com/v1/{account}/smart-link-postbacks/{postback_id}",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/smart-link-postbacks/{postback_id}", {
method: "PATCH",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
statistics
Calculate total transactions
GET /v1/{account}/analytics/transactions/count. Complete period count.
GET /v1/{account}/analytics/transactions/count · free · start_date/end_date; incomplete pagination fails.
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/analytics/transactions/count?start_date=2026-01-01&end_date=2026-01-31"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/analytics/transactions/count?start_date=2026-01-01&end_date=2026-01-31",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/analytics/transactions/count?start_date=2026-01-01&end_date=2026-01-31", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Get earnings · catalog flag: verified
[statistics] GET /earnings/chart.
GET /v1/{account}/native/earnings/chart · 1 credit(s) · empty without query; a bare call through this API defaults to monthlyTotal=1 (one row per month, net + gross). Day series: startDate, endDate, withTotal plus filter[total_amount], filter[subscribes_amount], filter[tips_amount], filter[post_amount], filter[messages_amount]
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/earnings/chart?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/earnings/chart?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/earnings/chart?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Get following count · catalog flag: verified
[statistics] GET /subscriptions/subscribes/count. How many accounts this creator follows. Live verified 2026-09-23 (route read off the OnlyFans web client build 202609221225).
GET /v1/{account}/native/subscriptions/subscribes/count · 1 credit(s) · how many accounts this creator follows (live verified 2026-09-23)
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/subscriptions/subscribes/count?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/subscriptions/subscribes/count?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/subscriptions/subscribes/count?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Get posts chart · catalog flag: verified
[statistics] GET /posts/chart. Posts and views per day. Query: startDate, endDate, withTotal, filter[posts], filter[views]. Live verified 2026-09-23 (route read off the OnlyFans web client build 202609221225).
GET /v1/{account}/native/posts/chart · 1 credit(s) · startDate, endDate, withTotal, filter[posts], filter[views] (live verified 2026-09-23)
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/posts/chart?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/posts/chart?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/posts/chart?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Get profile qr views · catalog flag: verified
[statistics] GET /users/me/profile/views/qr. Profile visits that came from the QR code. Live verified 2026-09-23 (route read off the OnlyFans web client build 202609221225).
GET /v1/{account}/native/users/me/profile/views/qr · 1 credit(s) · profile visits that came from the QR code (live verified 2026-09-23)
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/users/me/profile/views/qr?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/users/me/profile/views/qr?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/users/me/profile/views/qr?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Get profile visitors · catalog flag: verified
[statistics] GET /users/me/profile/stats.
GET /v1/{account}/native/users/me/profile/stats · 1 credit(s)
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/users/me/profile/stats?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/users/me/profile/stats?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/users/me/profile/stats?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Get subscriber count · catalog flag: verified
[statistics] GET /subscriptions/subscribers/count. One number: the fan total, far cheaper than paging the subscriber list. Live verified 2026-09-23 (route read off the OnlyFans web client build 202609221225).
GET /v1/{account}/native/subscriptions/subscribers/count · 1 credit(s) · one number, the fastest way to a total fan count (live verified 2026-09-23)
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/subscriptions/subscribers/count?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/subscriptions/subscribers/count?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/subscriptions/subscribers/count?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Get subscriber statistics · catalog flag: verified
[statistics] GET /subscriptions/count/all.
GET /v1/{account}/native/subscriptions/count/all · 1 credit(s) · This native route returns current counts. For historical total/new/renewed events use GET /v1/{account}/analytics/subscribers with start_date/end_date. detailed=true adds known paid/free historical-price counts and an unknown remainder, not a deleted-fan count. Incomplete reads fail; detailed=false skips historical-price paging.
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/subscriptions/count/all"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/subscriptions/count/all",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/subscriptions/count/all", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Get today activity · catalog flag: verified
[statistics] GET /users/me/stats/today-activity. Stories, posts, chats and streams sent today. Live verified 2026-09-23 (route read off the OnlyFans web client build 202609221225).
GET /v1/{account}/native/users/me/stats/today-activity · 1 credit(s) · stories, posts, chats and streams sent today (live verified 2026-09-23)
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/users/me/stats/today-activity?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/users/me/stats/today-activity?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/users/me/stats/today-activity?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Get top streak · catalog flag: verified
[statistics] GET /streaks/top. The best streak of this account. Live verified 2026-09-23 (route read off the OnlyFans web client build 202609221225).
GET /v1/{account}/native/streaks/top · 1 credit(s) · the account best streak (live verified 2026-09-23)
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/streaks/top?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/streaks/top?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/streaks/top?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
List streaks · catalog flag: verified
[statistics] GET /streaks. Posting streaks with day and post counts. Query: startDate, endDate. Live verified 2026-09-23 (route read off the OnlyFans web client build 202609221225).
GET /v1/{account}/native/streaks · 1 credit(s) · posting streaks with days and post counts, startDate and endDate (live verified 2026-09-23)
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/streaks?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/native/streaks?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/native/streaks?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
webhooks
Create webhook · catalog flag: verified
[webhooks] POST /v1/{account}/webhooks. Platform-agnostic: works identically for any connected account (OnlyFans, Fansly, 4based, Fanvue), not an OnlyFans-specific feature. Body: {url, events: [...], headers?: {"Authorization": "Bearer ..."}}. headers are optional custom request headers added to every delivery (up to 10, for an endpoint behind a sign in gate or API key check); their values are write only, later reads show only the header names. Every delivery is also signed: X-CreatorAPI-Signature: sha256=<hex HMAC SHA256 of the raw body with the whsec_ secret>, plus X-CreatorAPI-Event, X-CreatorAPI-Delivery (event id, stable across retries) and X-CreatorAPI-Timestamp. Delivery: every event is POSTed once and should be answered with a 2xx within 15 seconds. Occasional timeouts are normal for webhooks on the public internet (slow handlers, cold starts, proxies and network hops between us and your server), so delivery is at least once: an event that gets no 2xx in time is retried with backoff for up to 24 hours, and the same event can reach you more than once. Answer with 2xx right away, do slow work (API calls, database writes) after responding, and dedupe on X-CreatorAPI-Delivery. Deliveries are free; API calls your handler makes are billed like any other call, so a handler that calls the API before responding and does not dedupe pays again for every repeat. Returns the webhook including its signing secret (shown once). Live verified 2026-08-14 (created, delivered a real test POST, cleaned up).
POST /v1/{account}/webhooks · 1 credit(s)
Path params: account
curl -X POST \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/webhooks" -d '{}'
import requests
r = requests.post(
"https://api.creator-api.com/v1/{account}/webhooks",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/webhooks", {
method: "POST",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Delete webhook · catalog flag: verified
[webhooks] DELETE /v1/{account}/webhooks/{hook_id}. Platform-agnostic: works identically for any connected account (OnlyFans, Fansly, 4based, Fanvue), not an OnlyFans-specific feature. Live verified 2026-08-14.
DELETE /v1/{account}/webhooks/{hook_id} · 1 credit(s)
Path params: account, hook_id
curl -X DELETE \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/webhooks/{hook_id}" -d '{}'
import requests
r = requests.delete(
"https://api.creator-api.com/v1/{account}/webhooks/{hook_id}",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/webhooks/{hook_id}", {
method: "DELETE",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Get webhook · catalog flag: verified
[webhooks] GET /v1/{account}/webhooks/{hook_id}. Platform-agnostic: works identically for any connected account (OnlyFans, Fansly, 4based, Fanvue), not an OnlyFans-specific feature. Live verified 2026-08-14.
GET /v1/{account}/webhooks/{hook_id} · free
Path params: account, hook_id
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/webhooks/{hook_id}"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/webhooks/{hook_id}",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/webhooks/{hook_id}", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
List webhook deliveries · catalog flag: verified
[webhooks] GET /v1/{account}/webhooks/{hook_id}/deliveries?limit=. Platform-agnostic: works identically for any connected account (OnlyFans, Fansly, 4based, Fanvue), not an OnlyFans-specific feature. Recent delivery attempts and their outcomes. Live verified 2026-08-14.
GET /v1/{account}/webhooks/{hook_id}/deliveries · free
Path params: account, hook_id
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/webhooks/{hook_id}/deliveries?limit=50"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/webhooks/{hook_id}/deliveries?limit=50",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/webhooks/{hook_id}/deliveries?limit=50", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
List webhook events · catalog flag: verified
[webhooks] GET /v1/webhooks/events. Platform-agnostic: works identically for any connected account (OnlyFans, Fansly, 4based, Fanvue), not an OnlyFans-specific feature. Lists every event type a webhook can subscribe to (e.g. subscriptions.new, messages.new, messages.purchased, posts.published) with a description. messages.purchased payloads name the content: message_id (join to messageId of the direct_messages export rows), queue_id (equals the id of the mass_messages export row when is_mass_message is true), media_ids, message_price, message_sent_at and content_match (notification when resolved, none when the platform gave no purchase notification within six minutes). posts.purchased carries the fan and the amounts only, the platform exposes no post id on the payment: resolve the post through posts/{post_id}/buyers of your paid posts. messages.new fires when a fan writes in a conversation, on OnlyFans and 4based, read from the conversation list once per cycle. What a platform can deliver differs: a 4based account gets messages.new, posts.published and the subscriber events, but no money events, because 4based exposes no transaction feed (its own earnings statistics endpoint answers empty for every date window). Live verified 2026-09-23.
GET /v1/webhooks/events · free
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/webhooks/events"
import requests
r = requests.get(
"https://api.creator-api.com/v1/webhooks/events",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/webhooks/events", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
List webhooks · catalog flag: verified
[webhooks] GET /v1/{account}/webhooks. Platform-agnostic: works identically for any connected account (OnlyFans, Fansly, 4based, Fanvue), not an OnlyFans-specific feature. Lists webhooks configured for the account. Live verified 2026-08-14.
GET /v1/{account}/webhooks · free
Path params: account
curl -X GET \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/webhooks"
import requests
r = requests.get(
"https://api.creator-api.com/v1/{account}/webhooks",
headers={"X-API-Key": KEY},
)
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/webhooks", {
method: "GET",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Replay webhook deliveries · catalog flag: verified
[webhooks] POST /v1/{account}/webhooks/{hook_id}/replay. Platform-agnostic. Re-sends events that failed to reach this webhook (endpoint returned 401, 5xx or was down) once you fixed the endpoint. Sends the original signed envelope again with the same event id, once per event, oldest first, using the current url and headers; events that already landed are skipped, so calling it again is safe. Failed events stay replayable, independent of the automatic retry schedule (backoff from 1 minute up to 24 hours). Body, all optional: delivery_ids (delivery or event ids), since / until (unix seconds), limit (default 500, max 1000), dry_run (count only). Stops early when the first 5 re-sends all fail. Free.
POST /v1/{account}/webhooks/{hook_id}/replay · free
Path params: account, hook_id
curl -X POST \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/webhooks/{hook_id}/replay" -d '{}'
import requests
r = requests.post(
"https://api.creator-api.com/v1/{account}/webhooks/{hook_id}/replay",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/webhooks/{hook_id}/replay", {
method: "POST",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Test webhook · catalog flag: verified
[webhooks] POST /v1/{account}/webhooks/{hook_id}/test. Platform-agnostic: works identically for any connected account (OnlyFans, Fansly, 4based, Fanvue), not an OnlyFans-specific feature. Sends a real test delivery to the webhook's URL and reports the real response status. Live verified 2026-08-14 (a real 405 came back from a URL that does not accept POST, proving this is a genuine delivery attempt, not a fake success).
POST /v1/{account}/webhooks/{hook_id}/test · 1 credit(s)
Path params: account, hook_id
curl -X POST \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/webhooks/{hook_id}/test" -d '{}'
import requests
r = requests.post(
"https://api.creator-api.com/v1/{account}/webhooks/{hook_id}/test",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/webhooks/{hook_id}/test", {
method: "POST",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
Update webhook · catalog flag: verified
[webhooks] PATCH /v1/{account}/webhooks/{hook_id}. Platform-agnostic: works identically for any connected account (OnlyFans, Fansly, 4based, Fanvue), not an OnlyFans-specific feature. Body: any of {url, events, active, headers}. headers replaces the custom header set, {} clears it, omitting it keeps the current headers. Live verified 2026-08-14 (toggled active=false).
PATCH /v1/{account}/webhooks/{hook_id} · 1 credit(s)
Path params: account, hook_id
curl -X PATCH \
-H "X-API-Key: $CREATORS_API_KEY" \
"https://api.creator-api.com/v1/{account}/webhooks/{hook_id}" -d '{}'
import requests
r = requests.patch(
"https://api.creator-api.com/v1/{account}/webhooks/{hook_id}",
headers={"X-API-Key": KEY},
).json()
print(r.json())
const r = await fetch("https://api.creator-api.com/v1/{account}/webhooks/{hook_id}", {
method: "PATCH",
headers: { "X-API-Key": KEY },
});
console.log(await r.json());
No endpoint matches that filter.