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.
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.
curl -X GET \
-H "X-API-Key: $CREATOR_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/tiers"
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:
{
"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.
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" }.
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=.
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.
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.
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.
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>, ... }.
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.
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 }.
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.
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" }.
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.
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"
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=.
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" }.
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.
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)
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.
curl -X POST \
-H "X-API-Key: $CREATOR_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/user/{fanUserId}/follow"
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.
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.
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)
curl -X GET \
-H "X-API-Key: $CREATOR_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/blocked?limit=50"
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=.
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.
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.
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.
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.
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"
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 }.
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.
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"
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.
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.
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.
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.
curl -X GET \
-H "X-API-Key: $CREATOR_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/user/{selfId}/voucher/history/{voucherId}"
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.
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" }.
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.
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.
curl -X GET \
-H "X-API-Key: $CREATOR_API_KEY" \
"https://api.creator-api.com/v1/{account}/native/file-stack/{fileStackId}/like"
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.
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"
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.
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"
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.
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.