# CreatorAPI · 4Based 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:

```
{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.

| Shorthand | What you get | Rewrites to |
| --- | --- | --- |
| `me` | The creator's own 4based profile | `/user/{id}` |
| `subscribers` | Subscriber list | `/user/{id}/subscription` |
| `subscriber-count` | Active, cancelled and pending counts | `/user/{id}/subscription-count` |
| `tiers` | Subscription tiers and prices | `/user/{id}/subscription/configuration` |
| `chats` | Conversation list | `/user/{id}/chatsByList` |
| `feed` | The creator's own feed | `/base` |
| `vault` | Media vault | `/user/{id}/vault` |
| `earnings` | Earnings stats | `/user/{id}/process/stats` |

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` and `subscribers` 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.
* 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)

```bash
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());
```

## Subscribers

### List subscribers

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

```bash
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.

```bash
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`.

```bash
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"])
```

## Messaging

### List conversations

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

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

```bash
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`.

```bash
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.

```bash
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"
```

## Feed & vault

### Get the feed

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

```bash
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)

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

## 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.

```bash
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())
```

## Connect a 4based account

You connect a 4based creator to your key by importing a captured session. 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.

```bash
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"
```
