Home/Docs/4Based reference

4Based API Reference

Native access to 4based.com creator accounts through the CreatorAPI proxy. One key, the same shape as OnlyFans and Fansly. You never touch 4based's tokens, headers or its /user/{id}/... path layout · CreatorAPI resolves the creator's own id for you and signs every request server side. Native read and write · shorthand aliases for the common reads · self id resolved for you.

How every call works

All native 4based routes are reached through one pattern:

Text
{METHOD} https://api.creator-api.com/v1/{account}/native/{native_path}

{account} is the connected 4based account id. Auth header X-API-Key: <your key>. GET is read only; writes need a full scope key. Billing: read = 1 credit, write = 2 credits.

Shorthands · you do not need the raw paths

4based puts the creator's own id in almost every path (/user/{id}/...). You do not have to know it. Call the shorthand and CreatorAPI rewrites it to the real path and fills in the id. An explicit query param always wins over the default.

ShorthandWhat you getRewrites to
meThe creator's own 4based profile/user/{id}
subscribersSubscriber list/user/{id}/subscription
subscriber-countActive, cancelled and pending counts/user/{id}/subscription-count
tiersSubscription tiers and prices/user/{id}/subscription/configuration
chatsConversation list/user/{id}/chatsByList
feedThe creator's own feed/base
vaultMedia vault/user/{id}/vault
earningsEarnings stats/user/{id}/process/stats
listsFan segmentation lists/user/{id}/user-lists
vouchersDiscount/voucher codes/user/{id}/voucher
templatesSaved chat reply templates/user/{id}/chat/configured_message
payoutCurrent withdrawable balance/user/{id}/payout/available
unreadUnread message count per conversation/user/{id}/chat/unread-messages
chat-configYour DM pricing (unlock price, default message price)/user/{id}/chat/configuration
payout-historyFull payout request history/user/{id}/payout
postback-urlsYour configured 4based postback/webhook URLs/user/{id}/postback-url
interactionsFans who recently liked/commented/visited/user/{id}/interaction
share-configYour referral/sharing link configuration/user/{id}/share/configuration
reelsThis creator's own Reels/reels (?user_id={id} filled in for you)
content / postsEvery post you own, any type (feed, vault, moments)/user/{id}/file-stack
momentsJust the Moments among your posts/user/{id}/file-stack (?categories=moment filled in for you)
blockedFans you have blocked/user/{id}/blocked
mutedFans you have muted/user/{id}/muted
restrictedFans you have restricted/user/{id}/restricted
followingAccounts you follow/user/{id}/following
followersFans following you/user/{id}/follower (yes, singular on 4based's side, the shorthand stays plural)
activityYour activity/notification feed/activity
partnershipsYour ad-partner partnerships/partnerships
searchSearch or browse any 4based account/user

So GET /v1/{account}/native/subscribers just works, the same way me works on OnlyFans and Fansly. There is no /me route on 4based itself; the shorthand me maps to the real profile route /user/{id}.

4based response notes

  • Self id: the id in /user/{id}/... is the creator's 4based ObjectId. CreatorAPI fills it in for every shorthand, so you never send it.
  • Default paging: chats, subscribers and lists require a limit upstream (4based returns 400 without one), so CreatorAPI adds limit=50 when you omit it. Pass your own ?limit= and ?offset= to page. (lists hard-fails without it — "limit is required" — the other two just come back empty instead.)
  • Empty lists: an account with no subscribers, chats or earnings yet returns an empty body, not an error. That is the real 4based response, not a fault.
  • Amounts: money fields (tier price, earnings) come through exactly as 4based returns them, with the currency field alongside. Read the currency per row before you aggregate.

Account & profile

Get the creator profile

GET /v1/{account}/native/me · 1 credit(s)

Shell
curl -X GET \
  -H "X-API-Key: $CREATOR_API_KEY" \
  "https://api.creator-api.com/v1/{account}/native/me"
Python
import requests
r = requests.get(
    "https://api.creator-api.com/v1/{account}/native/me",
    headers={"X-API-Key": CREATOR_API_KEY},
)
print(r.json())
JavaScript
const r = await fetch(
  "https://api.creator-api.com/v1/{account}/native/me",
  { headers: { "X-API-Key": process.env.CREATOR_API_KEY } },
);
console.log(await r.json());

me/profile return the same full object: bio, follower/following counts, verification status, coins, notification settings, last activity, and more · richer than just the basics.

Search or browse accounts

GET /v1/{account}/native/search · 1 credit(s)

Any 4based account, not scoped to yours — for finding a partnership target or resolving a handle. ?search= is free text; ?limit=/?offset= page it.

Shell
curl -X GET \
  -H "X-API-Key: $CREATOR_API_KEY" \
  "https://api.creator-api.com/v1/{account}/native/search?search=jane&limit=10"

Subscribers

List subscribers

GET /v1/{account}/native/subscribers · 1 credit(s)

Shell
curl -X GET \
  -H "X-API-Key: $CREATOR_API_KEY" \
  "https://api.creator-api.com/v1/{account}/native/subscribers?limit=50&offset=0"
Python
import requests
r = requests.get(
    "https://api.creator-api.com/v1/{account}/native/subscribers",
    headers={"X-API-Key": CREATOR_API_KEY},
    params={"limit": 50, "offset": 0},
)
print(r.json())
JavaScript
const r = await fetch(
  "https://api.creator-api.com/v1/{account}/native/subscribers?limit=50&offset=0",
  { headers: { "X-API-Key": process.env.CREATOR_API_KEY } },
);
console.log(await r.json());

Subscriber count

GET /v1/{account}/native/subscriber-count · 1 credit(s)

Returns active, cancelled and pending cancelled subscription counts.

Shell
curl -X GET \
  -H "X-API-Key: $CREATOR_API_KEY" \
  "https://api.creator-api.com/v1/{account}/native/subscriber-count"

Subscription tiers

List tiers and prices

GET /v1/{account}/native/tiers · 1 credit(s)

Each tier carries its price, repeat_days, type, status and currency.

Shell
curl -X GET \
  -H "X-API-Key: $CREATOR_API_KEY" \
  "https://api.creator-api.com/v1/{account}/native/tiers"
Python
import requests
r = requests.get(
    "https://api.creator-api.com/v1/{account}/native/tiers",
    headers={"X-API-Key": CREATOR_API_KEY},
)
for tier in r.json():
    print(tier["type"], tier["price"], tier["currency"])

Create a tier · and how bundles actually work

POST /v1/{account}/native/user/{selfId}/subscription/configuration · 2 credit(s) · full scope key

A "promotion bundle" in 4based's own UI is not a separate object · it is one entry in this same request's initial_payment_options array (a discounted multi-month commitment, e.g. 20% off if a fan commits to 3 months). amount is not computed for you, send the discounted total yourself.

Body:

JSON
{
  "price": 10,
  "currency": "USD",
  "type": "premium",
  "status": "active",
  "repeat_days": 28,
  "recurring_payment": { "duration_unit": "MONTH", "duration_value": 1, "amount": 10, "description": "Recurring subscription" },
  "initial_payment_options": [
    { "discount": 20, "duration_unit": "MONTH", "duration_value": 3, "amount": 24, "description": "Promotion Bundle" }
  ]
}

initial_payment_options can be an empty array for a plain tier with no bundle. The response echoes back the created tier including a server-assigned _id and a read-only amount_netto per amount (4based's own cut already subtracted) · don't send that field.

Shell
curl -X POST \
  -H "X-API-Key: $CREATOR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"price":10,"currency":"USD","type":"premium","status":"active","repeat_days":28,"recurring_payment":{"duration_unit":"MONTH","duration_value":1,"amount":10,"description":"Recurring subscription"},"initial_payment_options":[]}' \
  "https://api.creator-api.com/v1/{account}/native/user/{selfId}/subscription/configuration"

Deactivate a tier

PUT /v1/{account}/native/user/{selfId}/subscription/configuration/{tierId} · 2 credit(s) · full scope key

4based has no hard delete for tiers, this soft-deletes it the same way the platform's own client does on a price change. Body { "status": "deleted", "modification_type": "price_change" }.

Shell
curl -X PUT \
  -H "X-API-Key: $CREATOR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"status":"deleted","modification_type":"price_change"}' \
  "https://api.creator-api.com/v1/{account}/native/user/{selfId}/subscription/configuration/{tierId}"

Messaging

List conversations

GET /v1/{account}/native/chats · 1 credit(s)

CreatorAPI adds limit=50 when you omit it. Page with ?limit= and ?offset=.

Shell
curl -X GET \
  -H "X-API-Key: $CREATOR_API_KEY" \
  "https://api.creator-api.com/v1/{account}/native/chats?limit=50"

Read messages in a chat

GET /v1/{account}/native/user/{selfId}/chat/{chatId}/message · 1 credit(s)

The messages route needs the chat id, so it takes the full path. Use the me response to get the creator's _id as {selfId}, and a chat id from chats.

Shell
curl -X GET \
  -H "X-API-Key: $CREATOR_API_KEY" \
  "https://api.creator-api.com/v1/{account}/native/user/{selfId}/chat/{chatId}/message?limit=50"

Send a message or PPV

POST /v1/{account}/native/user/{selfId}/chat/{chatId}/message · 2 credit(s) · full scope key

Body { "message": "hey", "file_stack_id": "...", "message_price": 500, "local_id": "..." }. Set message_price above zero for a pay per view message; leave it out for a free message.

Shell
curl -X POST \
  -H "X-API-Key: $CREATOR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"message":"hey there"}' \
  "https://api.creator-api.com/v1/{account}/native/user/{selfId}/chat/{chatId}/message"

Get one conversation

GET /v1/{account}/native/user/{selfId}/chat/{chatId} · 1 credit(s)

The chat's own metadata (participants, timestamps), not its messages. Get a {chatId} from chats or from the unread-count shorthand below.

Shell
curl -X GET \
  -H "X-API-Key: $CREATOR_API_KEY" \
  "https://api.creator-api.com/v1/{account}/native/user/{selfId}/chat/{chatId}"

Unread message count

GET /v1/{account}/native/unread · 1 credit(s)

One object keyed by chat id: { "<chatId>": <unread_count>, ... }.

Shell
curl -X GET \
  -H "X-API-Key: $CREATOR_API_KEY" \
  "https://api.creator-api.com/v1/{account}/native/unread"

Your DM pricing

GET /v1/{account}/native/chat-config · 1 credit(s)

Your own configured unlock price and default per-message price.

Shell
curl -X GET \
  -H "X-API-Key: $CREATOR_API_KEY" \
  "https://api.creator-api.com/v1/{account}/native/chat-config"

Pin or unpin a conversation

POST /v1/{account}/native/user/{selfId}/chat/{chatId}/pin · 2 credit(s) · full scope key

Body { "is_pinned": true }.

Shell
curl -X POST \
  -H "X-API-Key: $CREATOR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"is_pinned":true}' \
  "https://api.creator-api.com/v1/{account}/native/user/{selfId}/chat/{chatId}/pin"

Mark a conversation as unread

POST /v1/{account}/native/user/{selfId}/chat/{chatId}/mark-as-unread · 2 credit(s) · full scope key

Only changes anything on a conversation that is currently marked read; 4based returns a conflict if it already has unread messages.

Shell
curl -X POST \
  -H "X-API-Key: $CREATOR_API_KEY" \
  "https://api.creator-api.com/v1/{account}/native/user/{selfId}/chat/{chatId}/mark-as-unread"

Edit a sent message

PUT /v1/{account}/native/user/{selfId}/chat/{chatId}/message/{messageId} · 2 credit(s) · full scope key

Body { "text": "corrected message" }.

Shell
curl -X PUT \
  -H "X-API-Key: $CREATOR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"text":"corrected message"}' \
  "https://api.creator-api.com/v1/{account}/native/user/{selfId}/chat/{chatId}/message/{messageId}"

Delete all messages in a conversation

PUT /v1/{account}/native/user/{selfId}/chat/{chatId}/delete-all-chat-messages-for-user · 2 credit(s) · full scope key

Clears the conversation on your side, no body needed.

Delete an entire conversation

PUT /v1/{account}/native/user/{selfId}/chat/{chatId}/delete-chat-for-user-by-user-id · 2 credit(s) · full scope key

Set your DM pricing

POST /v1/{account}/native/user/{selfId}/chat/configuration · 2 credit(s) · full scope key

The write side of chat-config above (that one is read only). Body { "unlock_price": 10, "message_price": 5 }. Upsert safe · an empty or partial body does not clobber prices you have already set.

Shell
curl -X POST \
  -H "X-API-Key: $CREATOR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"unlock_price":10,"message_price":5}' \
  "https://api.creator-api.com/v1/{account}/native/user/{selfId}/chat/configuration"

Mass messaging

4based gates sending on a paid/verified creator plan (a featureerror if your account is not eligible); reading and managing what you have already sent works regardless.

Send a mass message

POST /v1/{account}/native/user/{selfId}/chat/mass-message/ · 2 credit(s) · full scope key

Body { "message": "hey everyone", "file_stack_id": "...", "message_price": 500 }, same shape as a 1:1 message.

List sent mass messages

GET /v1/{account}/native/user/{selfId}/chat/mass-message/ · 1 credit(s)

Shell
curl -X GET \
  -H "X-API-Key: $CREATOR_API_KEY" \
  "https://api.creator-api.com/v1/{account}/native/user/{selfId}/chat/mass-message/"

Edit or cancel a mass message

PUT /v1/{account}/native/user/{selfId}/chat/mass-message/{messageId} · 2 credit(s) · full scope key DELETE /v1/{account}/native/user/{selfId}/chat/mass-message/{messageId} · 2 credit(s) · full scope key

Edit is useful for one still scheduled and not yet sent.

Fan lists

List your fan-segmentation lists

GET /v1/{account}/native/lists · 1 credit(s)

CreatorAPI adds limit=50 when you omit it (4based hard-requires it here). Page with ?limit= and ?offset=.

Shell
curl -X GET \
  -H "X-API-Key: $CREATOR_API_KEY" \
  "https://api.creator-api.com/v1/{account}/native/lists?limit=50"

Create a list

POST /v1/{account}/native/user/{selfId}/user-lists · 2 credit(s) · full scope key

Body { "name": "VIP whales" }.

Shell
curl -X POST \
  -H "X-API-Key: $CREATOR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"VIP whales"}' \
  "https://api.creator-api.com/v1/{account}/native/user/{selfId}/user-lists"

Delete a list

DELETE /v1/{account}/native/user/{selfId}/user-lists/{listId} · 2 credit(s) · full scope key

Fans in one list

GET /v1/{account}/native/user/{selfId}/user-lists/{listId}/users?limit=50 · 1 credit(s)

limit is required upstream.

Rename a list

PUT /v1/{account}/native/user/{selfId}/user-lists/{listId} · 2 credit(s) · full scope key

Body { "name": "New name" }.

Add or remove fans from a list

POST /v1/{account}/native/user/{selfId}/user-lists/{listId}/add-users · 2 credit(s) · full scope key POST /v1/{account}/native/user/{selfId}/user-lists/{listId}/remove-users · 2 credit(s) · full scope key

Body { "user_ids": ["...", "..."] }. 4based only allows adding fans who are already following the creator; adding anyone else is rejected.

Shell
curl -X POST \
  -H "X-API-Key: $CREATOR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"user_ids":["64f0a1b2c3d4e5f678901234"]}' \
  "https://api.creator-api.com/v1/{account}/native/user/{selfId}/user-lists/{listId}/add-users"

Check which lists a fan is on

GET /v1/{account}/native/user/{selfId}/user-lists/contains-user/{fanUserId} · 1 credit(s)

Shell
curl -X GET \
  -H "X-API-Key: $CREATOR_API_KEY" \
  "https://api.creator-api.com/v1/{account}/native/user/{selfId}/user-lists/contains-user/{fanUserId}"

Follow and unfollow

POST /v1/{account}/native/user/{fanUserId}/follow · 2 credit(s) · full scope key DELETE /v1/{account}/native/user/{fanUserId}/follow · 2 credit(s) · full scope key

The fan you are following goes in the URL, not the request body, and no body is needed.

Shell
curl -X POST \
  -H "X-API-Key: $CREATOR_API_KEY" \
  "https://api.creator-api.com/v1/{account}/native/user/{fanUserId}/follow"
Shell
curl -X DELETE \
  -H "X-API-Key: $CREATOR_API_KEY" \
  "https://api.creator-api.com/v1/{account}/native/user/{fanUserId}/follow"

Remove a follower

DELETE /v1/{account}/native/user/{fanUserId}/un-follow · 2 credit(s) · full scope key

Not the reverse of the follow calls above. This removes a fan FROM your own follower list, forcing them to stop following you · you are not unfollowing them, you are removing them as a follower. {fanUserId} is the follower to remove, no body needed.

Shell
curl -X DELETE \
  -H "X-API-Key: $CREATOR_API_KEY" \
  "https://api.creator-api.com/v1/{account}/native/user/{fanUserId}/un-follow"

Followers and following

GET /v1/{account}/native/followers · 1 credit(s) GET /v1/{account}/native/following · 1 credit(s)

Who follows you, and who you follow. Note the underlying 4based route for followers is singular (/follower) · the shorthand stays plural since that reads naturally, CreatorAPI resolves it either way.

Shell
curl -X GET \
  -H "X-API-Key: $CREATOR_API_KEY" \
  "https://api.creator-api.com/v1/{account}/native/followers?limit=50"

Blocked, muted and restricted fans

GET /v1/{account}/native/blocked · 1 credit(s) GET /v1/{account}/native/muted · 1 credit(s) GET /v1/{account}/native/restricted · 1 credit(s)

Shell
curl -X GET \
  -H "X-API-Key: $CREATOR_API_KEY" \
  "https://api.creator-api.com/v1/{account}/native/blocked?limit=50"

Feed & vault

Get the feed

GET /v1/{account}/native/feed · 1 credit(s)

Shell
curl -X GET \
  -H "X-API-Key: $CREATOR_API_KEY" \
  "https://api.creator-api.com/v1/{account}/native/feed?limit=50"

List the media vault

GET /v1/{account}/native/vault · 1 credit(s)

Shell
curl -X GET \
  -H "X-API-Key: $CREATOR_API_KEY" \
  "https://api.creator-api.com/v1/{account}/native/vault?limit=50"

Post comments

GET /v1/{account}/native/file-stack/{fileStackId}/comment · 1 credit(s) POST /v1/{account}/native/file-stack/{fileStackId}/comment · 2 credit(s) · full scope key DELETE /v1/{account}/native/file-stack/{fileStackId}/comment/{commentId} · 2 credit(s) · full scope key

Read, write or delete comments on one of your posts. POST body { "text": "..." }.

Shell
curl -X POST \
  -H "X-API-Key: $CREATOR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"text":"Thanks for watching!"}' \
  "https://api.creator-api.com/v1/{account}/native/file-stack/{fileStackId}/comment"

Content, Reels & Moments

Everything you own

GET /v1/{account}/native/content (alias posts) · 1 credit(s)

Every post you own regardless of where it is surfaced · feed, vault, moments, all of it. Different from feed (the public feed view): this is your own full inventory, including private and subscription-only items. Filter with ?categories=, ?contentType=, ?is_subscription_item=, ?tag=.

Shell
curl -X GET \
  -H "X-API-Key: $CREATOR_API_KEY" \
  "https://api.creator-api.com/v1/{account}/native/content?limit=50"

Just your Moments

GET /v1/{account}/native/moments · 1 credit(s)

Same endpoint as content above, categories=moment filled in for you. Your own explicit ?categories= still wins if you pass one.

Shell
curl -X GET \
  -H "X-API-Key: $CREATOR_API_KEY" \
  "https://api.creator-api.com/v1/{account}/native/moments?limit=50"

Your Reels

GET /v1/{account}/native/reels · 1 credit(s)

A separate top-level feed from content, not a filtered view. Your own id is filled in as user_id for you, so this returns your Reels, not the public Reels feed.

Shell
curl -X GET \
  -H "X-API-Key: $CREATOR_API_KEY" \
  "https://api.creator-api.com/v1/{account}/native/reels?limit=50"

Get one post

GET /v1/{account}/native/file-stack/{fileStackId} · 1 credit(s)

The full post object · not a metrics sub-resource, the post itself (dimensions, price, categories, is_subscription_item, …). Get a {fileStackId} from content, moments, reels or feed.

Shell
curl -X GET \
  -H "X-API-Key: $CREATOR_API_KEY" \
  "https://api.creator-api.com/v1/{account}/native/file-stack/{fileStackId}"

Create a post

POST /v1/{account}/media/upload · write

Not under /native/ · this is its own route (see media upload for the general pattern shared with OnlyFans and Fansly). Unlike those two, 4based has no separate upload-then-attach step: send the file and it publishes immediately, this call returns the created post.

Multipart form-data: file (required), plus optional categories (comma-separated, defaults to media,image or media,video by mime type), description, price (0 or 300+, minor units · a standalone PPV price), is_subscription_item (true/false), tag (comma-separated), private (true/false), to_be_posted_at (ISO 8601, schedules instead of publishing now).

price and is_subscription_item are mutually exclusive in practice: 4based never prices subscription-included content separately, so setting both keeps price at 0.

Shell
curl -X POST \
  -H "X-API-Key: $CREATOR_API_KEY" \
  -F "[email protected];type=image/jpeg" \
  -F "description=New drop 🔥" \
  -F "price=300" \
  "https://api.creator-api.com/v1/{account}/media/upload"
Python
import requests
r = requests.post(
    "https://api.creator-api.com/v1/{account}/media/upload",
    headers={"X-API-Key": CREATOR_API_KEY},
    files={"file": ("photo.jpg", open("photo.jpg", "rb"), "image/jpeg")},
    data={"description": "New drop 🔥", "price": 300},
)
print(r.json())

Edit or delete a post

PUT /v1/{account}/native/file-stack/{fileStackId} · 2 credit(s) · full scope key DELETE /v1/{account}/native/file-stack/{fileStackId} · 2 credit(s) · full scope key

PUT body is whatever fields you're changing, e.g. { "description": "...", "price": 500 }.

Shell
curl -X PUT \
  -H "X-API-Key: $CREATOR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"price":500}' \
  "https://api.creator-api.com/v1/{account}/native/file-stack/{fileStackId}"

Post sale stats

GET /v1/{account}/native/user/{selfId}/file-stack/{fileStackId}/sale/stats · 1 credit(s)

Hour-bucketed sales for one post (distinct from the view stats above). timePeriod is required, same as view stats.

Shell
curl -X GET \
  -H "X-API-Key: $CREATOR_API_KEY" \
  "https://api.creator-api.com/v1/{account}/native/user/{selfId}/file-stack/{fileStackId}/sale/stats?timePeriod=day"

Earnings

Earnings stats

GET /v1/{account}/native/earnings · 1 credit(s)

Optional init_from and init_to (YYYY-MM-DD) narrow the window. Amounts arrive as 4based returns them, with currency alongside.

Shell
curl -X GET \
  -H "X-API-Key: $CREATOR_API_KEY" \
  "https://api.creator-api.com/v1/{account}/native/earnings"
Python
import requests
r = requests.get(
    "https://api.creator-api.com/v1/{account}/native/earnings",
    headers={"X-API-Key": CREATOR_API_KEY},
    params={"init_from": "2026-01-01", "init_to": "2026-07-01"},
)
print(r.json())

Vouchers

List discount/voucher codes

GET /v1/{account}/native/vouchers · 1 credit(s)

4based vouchers are created per fan (a target_user_id is required to issue one), not a public reusable coupon code.

Shell
curl -X GET \
  -H "X-API-Key: $CREATOR_API_KEY" \
  "https://api.creator-api.com/v1/{account}/native/vouchers?limit=50"

Redeem a voucher code

POST /v1/{account}/native/voucher/redeem · 2 credit(s) · full scope key

Body { "code": "MYCODE123" }. Not scoped by account in the URL — 4based resolves the redeeming account from your connected session.

Shell
curl -X POST \
  -H "X-API-Key: $CREATOR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"code":"MYCODE123"}' \
  "https://api.creator-api.com/v1/{account}/native/voucher/redeem"

Create a voucher for a fan

POST /v1/{account}/native/user/{selfId}/voucher · 2 credit(s) · full scope key

Body needs at least { "target_user_id": "<fanUserId>" } — 4based confirmed this field is required, the full discount/configuration shape is not yet completely mapped, expect to iterate.

Get, update or delete one voucher

GET /v1/{account}/native/user/{selfId}/voucher/{voucherId} · 1 credit(s) PUT /v1/{account}/native/user/{selfId}/voucher/{voucherId} · 2 credit(s) · full scope key DELETE /v1/{account}/native/user/{selfId}/voucher/{voucherId} · 2 credit(s) · full scope key

Get a {voucherId} from the vouchers list above.

Voucher redemption history

GET /v1/{account}/native/voucher/user/history/{voucherId} · 1 credit(s)

How many times / by whom one voucher has been redeemed.

Shell
curl -X GET \
  -H "X-API-Key: $CREATOR_API_KEY" \
  "https://api.creator-api.com/v1/{account}/native/voucher/user/history/{voucherId}"

Voucher lifecycle events

GET /v1/{account}/native/user/{selfId}/voucher/history/{voucherId} · 1 credit(s)

A different endpoint from redemption history above · the voucher's own history (edits, status changes), not who redeemed it.

Shell
curl -X GET \
  -H "X-API-Key: $CREATOR_API_KEY" \
  "https://api.creator-api.com/v1/{account}/native/user/{selfId}/voucher/history/{voucherId}"

Chat templates

List saved reply templates

GET /v1/{account}/native/templates · 1 credit(s)

Shell
curl -X GET \
  -H "X-API-Key: $CREATOR_API_KEY" \
  "https://api.creator-api.com/v1/{account}/native/templates"

Payout

Current withdrawable balance

GET /v1/{account}/native/payout · 1 credit(s)

Shell
curl -X GET \
  -H "X-API-Key: $CREATOR_API_KEY" \
  "https://api.creator-api.com/v1/{account}/native/payout"
JSON
{"amount": 160.94, "amountOpen": 0}

Full payout history

GET /v1/{account}/native/payout-history · 1 credit(s)

Every payout request, not just the current withdrawable balance.

Shell
curl -X GET \
  -H "X-API-Key: $CREATOR_API_KEY" \
  "https://api.creator-api.com/v1/{account}/native/payout-history"

Request a payout

POST /v1/{account}/native/user/{selfId}/payout/ · 2 credit(s) · full scope key

Requests the full balance shown by payout above · there is no partial-amount option. Real money movement on an account with a payout method configured; 4based returns 403 if none is on file.

Shell
curl -X POST \
  -H "X-API-Key: $CREATOR_API_KEY" \
  "https://api.creator-api.com/v1/{account}/native/user/{selfId}/payout/"

Postback URLs

List your configured postback/webhook URLs

GET /v1/{account}/native/postback-urls · 1 credit(s)

4based's own callback mechanism, separate from CreatorAPI's own webhooks.

Shell
curl -X GET \
  -H "X-API-Key: $CREATOR_API_KEY" \
  "https://api.creator-api.com/v1/{account}/native/postback-urls"

Register a postback URL

POST /v1/{account}/native/user/{selfId}/postback-url · 2 credit(s) · full scope key

Body { "postback_url": "https://your-server.example.com/hook" }.

Shell
curl -X POST \
  -H "X-API-Key: $CREATOR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"postback_url":"https://your-server.example.com/hook"}' \
  "https://api.creator-api.com/v1/{account}/native/user/{selfId}/postback-url"

Edit or remove a postback URL

PUT /v1/{account}/native/user/{selfId}/postback-url/{postbackId} · 2 credit(s) · full scope key DELETE /v1/{account}/native/user/{selfId}/postback-url/{postbackId} · 2 credit(s) · full scope key

PUT body same shape as create above.

Fan relationships

Recent interactions

GET /v1/{account}/native/interactions · 1 credit(s)

Users who have recently interacted with you (likes, comments, visits), distinct from your subscriber and follower lists.

Shell
curl -X GET \
  -H "X-API-Key: $CREATOR_API_KEY" \
  "https://api.creator-api.com/v1/{account}/native/interactions"

Per-fan relationship notes

GET /v1/{account}/native/user/{selfId}/pivot/{fanUserId} · 1 credit(s)

Any relationship metadata you have attached to one specific fan.

Block or unblock a fan

PUT /v1/{account}/native/user/{selfId}/block/{fanUserId} · 2 credit(s) · full scope key DELETE /v1/{account}/native/user/{selfId}/block/{fanUserId} · 2 credit(s) · full scope key

Shell
curl -X PUT \
  -H "X-API-Key: $CREATOR_API_KEY" \
  "https://api.creator-api.com/v1/{account}/native/user/{selfId}/block/{fanUserId}"

Start a conversation

POST /v1/{account}/native/user/{selfId}/chat/user/{fanUserId} · 2 credit(s) · full scope key

Opens a new chat with a fan who does not have one yet.

Chat read status

Mark one conversation as received

PUT /v1/{account}/native/user/{selfId}/chat/{chatId}/update-messages-status-received · 2 credit(s) · full scope key

Mark every conversation as received

PUT /v1/{account}/native/user/{selfId}/chat-overview/update-all-my-messages-status-received · 2 credit(s) · full scope key

Per-chat pricing

Read a chat's price override

GET /v1/{account}/native/user/{selfId}/chat/{chatId}/price-override · 1 credit(s)

Returns the effective message price for this one conversation, whether it is your global default or a custom override, plus whether a change cooldown is active.

JSON
{"data": {"effective_message_price": 10, "is_override": true, "global_message_price": 12, "cooldown_active": true, "cooldown_expires_at": "2026-08-08T10:47:17+00:00"}}

Set or clear a chat's price override

PUT /v1/{account}/native/user/{selfId}/chat/{chatId}/price-override · 2 credit(s) · full scope key DELETE /v1/{account}/native/user/{selfId}/chat/{chatId}/price-override · 2 credit(s) · full scope key

Body for PUT: { "message_price": 500 }. 4based enforces a cooldown after a change before the override can be changed again; a call during the cooldown returns a 409.

Shell
curl -X PUT \
  -H "X-API-Key: $CREATOR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"message_price":500}' \
  "https://api.creator-api.com/v1/{account}/native/user/{selfId}/chat/{chatId}/price-override"

Publishing

Publish a scheduled or draft post immediately

PUT /v1/{account}/native/file-stack/post-now · 2 credit(s) · full scope key

Not scoped by account in the URL — the file-stack id in the body identifies the post.

Shell
curl -X PUT \
  -H "X-API-Key: $CREATOR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"<fileStackId>"}' \
  "https://api.creator-api.com/v1/{account}/native/file-stack/post-now"

Add media to the vault

PUT /v1/{account}/native/user/{selfId}/vault · 2 credit(s) · full scope key

Body { "id": "<fileStackId>" }.

Update a vault item

PUT /v1/{account}/native/user/{selfId}/vault/{vaultItemId} · 2 credit(s) · full scope key

Addresses one already-vaulted item directly, unlike the add call above.

Activity feed

Your activity/notifications

GET /v1/{account}/native/activity · 1 credit(s)

Likes, comments, sales, subscriptions, tips and more, newest first. ?since_id= pages forward from a cursor.

Shell
curl -X GET \
  -H "X-API-Key: $CREATOR_API_KEY" \
  "https://api.creator-api.com/v1/{account}/native/activity?limit=50"

Reset the unread counter

GET /v1/{account}/native/activity/reset · 1 credit(s)

Top-level, not scoped by account in the URL on 4based's side.

Post likes

GET /v1/{account}/native/file-stack/{fileStackId}/like · 1 credit(s) POST /v1/{account}/native/file-stack/{fileStackId}/like · 2 credit(s) · full scope key DELETE /v1/{account}/native/file-stack/{fileStackId}/like · 2 credit(s) · full scope key

Who liked one of your posts, and liking/unliking one as this creator.

Shell
curl -X GET \
  -H "X-API-Key: $CREATOR_API_KEY" \
  "https://api.creator-api.com/v1/{account}/native/file-stack/{fileStackId}/like"

Fan relationship notes

Set or clear notes on a fan

PUT /v1/{account}/native/user/{selfId}/pivot/{fanUserId} · 2 credit(s) · full scope key DELETE /v1/{account}/native/user/{selfId}/pivot/{fanUserId}/{pivotKey} · 2 credit(s) · full scope key

Write side of the per-fan relationship notes covered under Fan relationships above (that section's GET is read only).

Chat tips and live status

Send or unlock a tip

POST /v1/{account}/native/user/{selfId}/chat/{chatId}/tip · 2 credit(s) · full scope key POST /v1/{account}/native/user/{selfId}/chat/user/{fanUserId}/unlock-tip · 2 credit(s) · full scope key

Body { "amount": 500 } for both.

Typing indicator

POST /v1/{account}/native/user/{selfId}/chat/{chatId}/typing · 2 credit(s) · full scope key

Body { "value": true }.

Delete one message

PUT /v1/{account}/native/user/{selfId}/chat/{chatId}/delete-message-for-users-in-chat · 2 credit(s) · full scope key

Body { "id": "<messageId>" }. Distinct from clearing the whole conversation under Messaging above.

Manage saved reply templates

Write side of templates above (that shorthand is read only).

POST /v1/{account}/native/user/{selfId}/chat/configured_message/ · 2 credit(s) · full scope key PUT /v1/{account}/native/user/{selfId}/chat/configured_message/{templateId} · 2 credit(s) · full scope key DELETE /v1/{account}/native/user/{selfId}/chat/configured_message/{templateId} · 2 credit(s) · full scope key

Shell
curl -X POST \
  -H "X-API-Key: $CREATOR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"text":"Hey! Thanks for subscribing 💕"}' \
  "https://api.creator-api.com/v1/{account}/native/user/{selfId}/chat/configured_message/"

Reorder a fan list

PATCH /v1/{account}/native/user/{selfId}/user-lists/{listId}/position · 2 credit(s) · full scope key

Body { "position": 0 }.

Manage a subscriber's subscription

POST /v1/{account}/native/user/{selfId}/subscription/{subscriptionId}/modify · 2 credit(s) · full scope key

Body { "status": "..." }. Get a {subscriptionId} from subscribers above.

Look up a user by handle

GET /v1/{account}/native/user/name/{username} · 1 credit(s)

An alternate lookup key to a raw ObjectId, works for any 4based account.

Shell
curl -X GET \
  -H "X-API-Key: $CREATOR_API_KEY" \
  "https://api.creator-api.com/v1/{account}/native/user/name/{username}"

Ad-partner program

Your partnerships and revenue share

GET /v1/{account}/native/partnerships · 1 credit(s) GET /v1/{account}/native/partnerships/calculate-max-percentage · 1 credit(s)

The second call returns the platform-wide split, e.g. {"owner_percentage":70,"webmaster_share_percentage":10,"webmaster_rev_share_percentage":5}.

Apply, verify or cancel a partnership

POST /v1/{account}/native/partnerships · 2 credit(s) · full scope key GET /v1/{account}/native/partnerships/get-verification-url/{partnershipId} · 1 credit(s) PUT /v1/{account}/native/partnerships/webmaster-cancellation/{partnershipId} · 2 credit(s) · full scope key

Applying is gated to accounts 4based has admitted to its beta for the program; the call is real, expect a 403 until your account is eligible.

Reporting

POST /v1/{account}/native/incident · 2 credit(s) · full scope key POST /v1/{account}/native/file-stack/{fileStackId}/incident · 2 credit(s) · full scope key

Body { "subject": "..." } for both, report a general incident or one specific post.

New-subscriber welcome message

4based has no native equivalent of OnlyFans' welcome-message auto-send, so this is a CreatorAPI-side feature: we store your message and send it ourselves the moment a real new subscription shows up in your activity feed. These three calls are NOT proxied to 4based at all, they talk to CreatorAPI's own storage.

Read, set or clear it

GET /v1/{account}/4based/welcome-message · 1 credit(s) PUT /v1/{account}/4based/welcome-message · 2 credit(s) · full scope key DELETE /v1/{account}/4based/welcome-message · 2 credit(s) · full scope key

Body for PUT: { "text": "Hey! Thanks so much for subscribing 💕", "price": 0, "is_active": true }. price above 0 sends it as a PPV message.

Shell
curl -X PUT \
  -H "X-API-Key: $CREATOR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"text":"Hey! Thanks so much for subscribing 💕","is_active":true}' \
  "https://api.creator-api.com/v1/{account}/4based/welcome-message"
Python
import requests
r = requests.put(
    "https://api.creator-api.com/v1/{account}/4based/welcome-message",
    headers={"X-API-Key": CREATOR_API_KEY},
    json={"text": "Hey! Thanks so much for subscribing 💕", "is_active": True},
)
print(r.json())

Once set and active, a background job checks your activity feed for new subscriptions and sends it automatically — nothing else to call. Turn is_active off to pause without losing the saved text; delete it entirely to clear it.

Connect a 4based account

The easy way · email and password, no session capture

Unlike OnlyFans and Fansly, 4based's own login is a plain request with no hosted browser needed. Send the creator's 4based email and password once · CreatorAPI exchanges it for a session token in process. By default the password is then discarded, never logged or stored, only the resulting token is kept.

POST /v1/connect/login · full scope key

Body { "platform": "4based", "identifier": "[email protected]", "password": "...", "creator_id": "optional_your_id", "save_password": false }.

If the account has two factor authentication on, this call returns 401 with { "detail": { "code": "2fa_required", "message": "Enter the 6 digit code from your 4based authenticator app" } } instead of a session. Collect the code and call POST /v1/connect/login again with the same body plus "totp_code": "123456" · identifier and password go along again, same round trip 4based's own login page makes.

Optional save_password: true keeps an encrypted copy of the password so the automatic token refresh job can sign back in on your behalf if 4based ever rejects the session, instead of the connection going dark until you manually reconnect. Off by default. If you turn it on, the response includes "password_saved": true. Disconnecting the account (DELETE /v1/accounts/{creator_id}) deletes the stored password immediately, whether or not you ever turned this on.

Shell
curl -X POST \
  -H "X-API-Key: $CREATOR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"platform":"4based","identifier":"[email protected]","password":"..."}' \
  "https://api.creator-api.com/v1/connect/login"
Python
import requests
r = requests.post(
    "https://api.creator-api.com/v1/connect/login",
    headers={"X-API-Key": CREATOR_API_KEY},
    json={"platform": "4based", "identifier": "[email protected]", "password": "..."},
)
print(r.json())

Advanced · import an already-captured session

If you already have a 4based session token (from your own capture tooling), skip the login call and import it directly. No proxy is required for 4based.

POST /v1/connect/import · full scope key

Body { "creator_id": "your_id", "platform": "4based", "auth": { "token": "...", "resource": "...", "account_id": "..." } }. The three auth fields come from a logged in 4based session. On success the account is verified and attached to your key.

Shell
curl -X POST \
  -H "X-API-Key: $CREATOR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"creator_id":"my_creator","platform":"4based","auth":{"token":"...","resource":"...","account_id":"..."}}' \
  "https://api.creator-api.com/v1/connect/import"
No endpoint matches that filter.