Charfeed
v1.0

Charfeed API

REST API for the Charfeed platform

auth

post/v1/auth/sign-up

Create a Cognito account with email and password

201 with tokens when the pool confirms the account itself. 202 with `{ confirmationRequired: true }` and no tokens when the address has to be confirmed first: a 6-digit code was mailed to it — return it to `confirm-sign-up`.

Parameters

header parameters

X-Charfeed-Client

`web` from the web app; omitted by the native apps. Refused for `admin`: the admin pool has no sign-up.

string

Request body

application/json
emailstringrequired
passwordstringrequired

Responses

application/json
idTokenstringrequired
refreshTokenstring
expiresInintegerrequired
localIdstringrequired
isNewUserboolean
post/v1/auth/confirm-sign-up

Confirm the address of a new account and sign in

Returns the 6-digit code mailed at sign-up, with the password of that sign-up. On success the address is confirmed and the session is opened. 401 when the password is not the one the sign-up was made with — nothing is confirmed then — and for an address nobody registered; 400 `invalid_code` / `expired_code` for the code.

Parameters

header parameters

X-Charfeed-Client

`web` from the web app; omitted by the native apps. Refused for `admin`: the admin pool has no sign-up.

string

Request body

application/json
emailstringrequired
codestringrequired
passwordstringrequired

Responses

application/json
idTokenstringrequired
refreshTokenstring
expiresInintegerrequired
localIdstringrequired
isNewUserboolean
post/v1/auth/resend-confirmation

Mail the sign-up confirmation code again

Always 204 — does not disclose whether the address has a sign-up waiting for its code.

Request body

application/json
emailstringrequired

Responses

No response body

post/v1/auth/sign-in

Exchange email and password for Cognito tokens

A member client signs in to the member pool and gets the tokens. The admin console (`X-Charfeed-Client: admin`) signs in to the admin pool, which never signs anyone in on a password alone: it is answered with the next step of the sign-in — `{ challenge: "new_password" | "totp_setup" | "totp", session }`.

Parameters

header parameters

X-Charfeed-Client

`web` from the web app, `admin` from the admin console: the refresh token is then kept in an HttpOnly cookie of that client and left out of the response. Omitted by clients that keep the token themselves. `admin` signs in against the admin pool, every other value against the member pool.

string

Request body

application/json
emailstringrequired
passwordstringrequired

Responses

Admin console only: the next step of the sign-in.

application/json
idTokenstringrequired
refreshTokenstring
expiresInintegerrequired
localIdstringrequired
isNewUserboolean
post/v1/auth/new-password

Replace the temporary password of an admin's invitation

Admin console only, for the `new_password` step. Answers with the tokens, or with the next step of the sign-in — `{ challenge: "new_password" | "totp_setup" | "totp", session }`.

Parameters

header parameters

X-Charfeed-Clientrequired

`admin` — these routes serve the admin console only.

string

Request body

application/json
emailstringrequired
sessionstringrequired
newPasswordstringrequired

Responses

application/json
challengestringrequired
"new_password""totp_setup""totp"
sessionstringrequired
post/v1/auth/totp/setup

Start setting up an authenticator app

Admin console only, for the `totp_setup` step. Returns the new factor's secret, the `otpauth://` URI for its QR code and the `session` its first code is verified with.

Parameters

header parameters

X-Charfeed-Clientrequired

`admin` — these routes serve the admin console only.

string

Request body

application/json
emailstringrequired
sessionstringrequired

Responses

application/json
secretCodestringrequired
otpauthUristringrequired
sessionstringrequired
post/v1/auth/totp/verify

Turn the authenticator on with its first code

Admin console only. From then on every sign-in of the account asks for a code. Answers with the tokens, or with the next step of the sign-in — `{ challenge: "new_password" | "totp_setup" | "totp", session }`.

Parameters

header parameters

X-Charfeed-Clientrequired

`admin` — these routes serve the admin console only.

string

Request body

application/json
emailstringrequired
sessionstringrequired
codestringrequired

Responses

application/json
idTokenstringrequired
refreshTokenstring
expiresInintegerrequired
localIdstringrequired
isNewUserboolean
post/v1/auth/totp/challenge

Finish a sign-in with the code from the authenticator app

Admin console only, for the `totp` step. Answers with the tokens, or with the next step of the sign-in — `{ challenge: "new_password" | "totp_setup" | "totp", session }`.

Parameters

header parameters

X-Charfeed-Clientrequired

`admin` — these routes serve the admin console only.

string

Request body

application/json
emailstringrequired
sessionstringrequired
codestringrequired

Responses

application/json
idTokenstringrequired
refreshTokenstring
expiresInintegerrequired
localIdstringrequired
isNewUserboolean
post/v1/auth/oauth/exchange

Finish social sign-in on the web

Exchanges the authorization code the Cognito Hosted UI returned to the web app (with its PKCE verifier) and opens a cookie session. Web client only — a native app exchanges its code with Cognito itself.

Parameters

header parameters

X-Charfeed-Clientrequired

`web` from the web app, `admin` from the admin console: the refresh token is then kept in an HttpOnly cookie of that client and left out of the response. Omitted by clients that keep the token themselves. `admin` signs in against the admin pool, every other value against the member pool.

string

Request body

application/json
codestringrequired
codeVerifierstringrequired
redirectUristringrequired

Responses

application/json
idTokenstringrequired
refreshTokenstring
expiresInintegerrequired
localIdstringrequired
isNewUserboolean
post/v1/auth/refresh

Exchange a refresh token for a fresh idToken

A web client sends no token: it is read from the session cookie. Any other client sends `refreshToken` in the body.

Parameters

header parameters

X-Charfeed-Client

`web` from the web app, `admin` from the admin console: the refresh token is then kept in an HttpOnly cookie of that client and left out of the response. Omitted by clients that keep the token themselves. `admin` signs in against the admin pool, every other value against the member pool.

string

Request body

application/json
refreshTokenstring

Responses

application/json
idTokenstringrequired
refreshTokenstring
expiresInintegerrequired
localIdstringrequired
isNewUserboolean
post/v1/auth/sign-out

End a session

Revokes the session's refresh token — the cookie's for a web client, the body's otherwise — and clears the cookie. Other sessions of the user are untouched. Always 204.

Parameters

header parameters

X-Charfeed-Client

`web` from the web app, `admin` from the admin console: the refresh token is then kept in an HttpOnly cookie of that client and left out of the response. Omitted by clients that keep the token themselves. `admin` signs in against the admin pool, every other value against the member pool.

string

Request body

application/json
refreshTokenstring

Responses

No response body

post/v1/auth/send-password-reset

Trigger the password-reset email

Always returns 204 — does not disclose whether the email is registered.

Request body

application/json
emailstringrequired

Responses

No response body

post/v1/auth/send-email-verification Auth required

Trigger the email-verification email

Responses

No response body

blocks

get/v1/users/me/blocks Auth required

List the caller's blocked users (paginated, newest first)

Parameters

query parameters

cursor
string
pageSize
integerdefault: 20

Responses

application/json
itemsarray<object>required
array
items:
uidstringrequired
handlestringrequired
displayNamestringrequirednullable
avatarUrlstringrequirednullable
blockedAtstringrequired
nextCursorstringrequirednullable
post/v1/users/me/blocks Auth required

Block a user (idempotent — re-block returns existing record)

Parameters

header parameters

Idempotency-Keyrequired

UUID v4

string

Request body

application/json
targetUidstringrequired

Responses

application/json
blockedUidstringrequired
blockedAtstringrequired
isNewbooleanrequired
delete/v1/users/me/blocks/{targetUid} Auth required

Unblock a user (no-op if not blocked)

Parameters

path parameters

targetUidrequired
string

Responses

application/json
removedbooleanrequired

mutes

get/v1/users/me/mutes Auth required

List the caller's muted users (paginated, newest first)

Parameters

query parameters

cursor
string
pageSize
integerdefault: 20

Responses

application/json
itemsarray<object>required
array
items:
uidstringrequired
handlestringrequired
displayNamestringrequirednullable
avatarUrlstringrequirednullable
mutedAtstringrequired
nextCursorstringrequirednullable
post/v1/users/me/mutes Auth required

Mute a user (idempotent — re-mute returns existing record)

Parameters

header parameters

Idempotency-Keyrequired

UUID v4

string

Request body

application/json
targetUidstringrequired

Responses

application/json
mutedUidstringrequired
mutedAtstringrequired
isNewbooleanrequired
delete/v1/users/me/mutes/{targetUid} Auth required

Unmute a user (no-op if not muted)

Parameters

path parameters

targetUidrequired
string

Responses

application/json
removedbooleanrequired

characters

post/v1/characters Auth required

Create a new character (pending status)

Parameters

header parameters

Idempotency-Keyrequired

UUID v4

string

Request body

application/json
handlestringrequired
displayNamestringrequired
biostringnullable
avatarUrlstringnullable
coverUrlstringnullable
avatarUploadIdstring
coverUploadIdstring
tagsarray<string>
arraydefault: []
items:
string
contentTypesarray<string>required
array
items:
string
worldstringnullable

Responses

application/json
characterIdstringrequired
handlestringrequired
statusstringrequired
"pending""approved""rejected"
get/v1/characters/by-id/{id}

Get character by id

Parameters

path parameters

idrequired
string

Responses

application/json
idstringrequired
handlestringrequired
displayNamestringrequired
biostringrequirednullable
avatarUrlstringrequirednullable
coverUrlstringrequirednullable
tagsarray<string>required
array
items:
string
contentTypesarray<string>required
array
items:
string
worldstringrequirednullable
hasActiveTiersbooleanrequired
countersobjectrequired
followersintegerrequired
subscribersintegerrequired
postsintegerrequired
verifiedbooleanrequired
featuredbooleanrequired
visibilitystringrequired
"public""private"
interactionsRestrictedstringrequired
"public""subscribers_only"
proactiveMessagesboolean
cheapestTierobjectrequirednullable
priceCentsintegerrequired
currencystringrequired
chatOfferKindsarray<string>required
array
items:
string
createdAtstringrequired
updatedAtstringrequired
statusstring
"pending""approved""rejected"
commissionBpsinteger
commissionValidUntilstringnullable
ownerIdstring
payoutAccountIdstringnullable
suspendedboolean
featuredRankintegernullable
chatModelstring
"haiku-4-5""sonnet-4-6""opus-4-7"
get/v1/characters/by-handle/{handle}

Get character by handle

Parameters

path parameters

handlerequired
string

Responses

application/json
idstringrequired
handlestringrequired
displayNamestringrequired
biostringrequirednullable
avatarUrlstringrequirednullable
coverUrlstringrequirednullable
tagsarray<string>required
array
items:
string
contentTypesarray<string>required
array
items:
string
worldstringrequirednullable
hasActiveTiersbooleanrequired
countersobjectrequired
followersintegerrequired
subscribersintegerrequired
postsintegerrequired
verifiedbooleanrequired
featuredbooleanrequired
visibilitystringrequired
"public""private"
interactionsRestrictedstringrequired
"public""subscribers_only"
proactiveMessagesboolean
cheapestTierobjectrequirednullable
priceCentsintegerrequired
currencystringrequired
chatOfferKindsarray<string>required
array
items:
string
createdAtstringrequired
updatedAtstringrequired
statusstring
"pending""approved""rejected"
commissionBpsinteger
commissionValidUntilstringnullable
ownerIdstring
payoutAccountIdstringnullable
suspendedboolean
featuredRankintegernullable
chatModelstring
"haiku-4-5""sonnet-4-6""opus-4-7"
get/v1/characters/{id}/tiers

List character tiers (active by default; owner/admin may include inactive)

Parameters

path parameters

idrequired
string

query parameters

includeInactiverequired
one of:
string
string

Responses

application/json
itemsarray<object>required
array
items:
idstringrequired
characterIdstringrequired
namestringrequired
descriptionstringrequirednullable
priceAmountintegerrequired
currencystringrequired
activebooleanrequired
orderintegerrequired
subscribersCountintegerrequired
mrrCentsintegerrequired
get/v1/characters/{id}/dashboard Auth required

Aggregated creator-dashboard summary (owner or admin only) — replaces the four-fetch pattern

Parameters

path parameters

idrequired
string

Responses

application/json
characterIdstringrequired
mrrCentsintegerrequired
mrrDeltaPctnumberrequired
subscribersCountintegerrequired
subscribersDeltaintegerrequired
postsThisMonthintegerrequired
postsDeltaintegerrequired
arpuCentsintegerrequired
churnRatenumberrequired
tipsCentsintegerrequired
nextPayoutCentsintegerrequired
nextPayoutAtstringrequirednullable
topPostsarray<object>required
array
items:
postIdstringrequired
thumbnailUrlstringrequirednullable
captionstringrequirednullable
likesintegerrequired
unlocksintegerrequired
revenueCentsintegerrequired
patch/v1/characters/{id} Auth required

Update character fields (owner or admin only)

Parameters

path parameters

idrequired
string

header parameters

Idempotency-Keyrequired

UUID v4

string

Request body

application/json
displayNamestring
biostringnullable
avatarUrlstringnullable
coverUrlstringnullable
tagsarray<string>
array
items:
string
worldstringnullable
visibilitystring
"public""private"
interactionsRestrictedstring
"public""subscribers_only"
proactiveMessagesboolean

Responses

application/json
successbooleanrequired
updatedAtintegerrequired

chat-sales

post/v1/chat/offers/initiate Auth required

Start an offer from a CTA outside the chat (tip, post unlock, tier subscribe, paid DM). Body: { characterId, kind, referenceId?, tipAmountMinor?, tipMessage?, paidDmMessage? }. The offer is created pending in the caller's conversation with the character.

Parameters

header parameters

Idempotency-Keyrequired

UUID v4

string

Responses

application/json
offerIdstringrequired
conversationIdstringrequired
offerPayloadobjectrequired
idstringrequired
characterIdstringrequired
subscriberUidstringrequired
chatSessionIdstringrequired
chatMessageIdstringrequirednullable
originatorstringrequired
"llm""subscriber"
offerKindstringrequired
"tier_subscribe""post_unlock""tip""paid_dm"
referencedResourceIdstringrequirednullable
quotedAmountintegerrequired
quotedCurrencystringrequired
offerCopystringrequired
subscriberNotestringrequirednullable
statusstringrequired
"pending""accepted""declined""expired"
expiresAtstringrequired
createdAtstringrequired
acceptedAtstringrequirednullable
declinedAtstringrequirednullable
paymentIdstringrequirednullable
post/v1/chat/offers/{offerId}/accept Auth required

Accept a chat offer and pay for it in coins

Parameters

path parameters

offerIdrequired
string

header parameters

Idempotency-Keyrequired

UUID v4

string

Request body

application/json
object

Responses

application/json
offerIdstringrequired
paymentIdstringrequired
coinsSpentintegerrequired
subscriptionIdstringrequirednullable
walletobjectrequired
coinsintegerrequired
updatedAtstringrequirednullable
post/v1/chat/offers/{offerId}/decline Auth required

Decline a chat offer

Parameters

path parameters

offerIdrequired
string

header parameters

Idempotency-Keyrequired

UUID v4

string

Responses

application/json
successbooleanrequired
offerIdstringrequired
get/v1/chat/preferences Auth required

Get the caller's chat-sales preferences

Responses

application/json
fewerOffersGlobalbooleanrequired
fewerOffersPerCharacterobjectrequired
patch/v1/chat/preferences Auth required

Update the caller's chat-sales preferences

Parameters

header parameters

Idempotency-Keyrequired

UUID v4

string

Request body

application/json
fewerOffersGlobalboolean
fewerOffersPerCharacterobject

Responses

application/json
fewerOffersGlobalbooleanrequired
fewerOffersPerCharacterobjectrequired
get/v1/characters/{characterId}/chat-revenue Auth required

Get chat-attributed revenue for a character (owner only)

Parameters

path parameters

characterIdrequired
string

query parameters

from
stringdate-time
to
stringdate-time

Responses

application/json
characterIdstringrequired
totalAmountGrossintegerrequired
totalCountintegerrequired
currencystringrequired
byOfferKindobjectrequired
byOriginatorobjectrequired
bucketsarray<object>required
array
items:
datestringrequired
offerKindstringrequired
"tier_subscribe""post_unlock""tip""paid_dm"
countintegerrequired
amountGrossintegerrequired
currencystringrequired
get/v1/characters/{characterId}/chat-sales-config Auth required

Get a character's chat-sales config (owner only)

Parameters

path parameters

characterIdrequired
string

Responses

application/json
enabledOfferKindsarray<string>required
array
items:
string
aggressivenessanyrequired
patch/v1/characters/{characterId}/chat-sales-config Auth required

Update a character's chat-sales config (owner only)

Parameters

path parameters

characterIdrequired
string

header parameters

Idempotency-Keyrequired

UUID v4

string

Request body

application/json
enabledOfferKindsarray<string>
array
items:
string
aggressivenessany

Responses

application/json
enabledOfferKindsarray<string>required
array
items:
string
aggressivenessanyrequired

posts

post/v1/posts Auth required

Create a new post

Parameters

header parameters

Idempotency-Keyrequired

UUID v4

string

Request body

application/json
characterIdstringrequired
accessstringrequired
"free""tier"
minTierIdstringnullable
ratingstring
"sfw""suggestive""nsfw"
mediaRefsarray<object>required
array
items:
uploadIdstringrequired
kindstringrequired
"image""video"
captionstringnullable
tagsarray<string>
arraydefault: []
items:
string

Responses

application/json
postIdstringrequired
createdAtintegerrequired
get/v1/posts/{id}

Get post by id (preview URLs only)

Parameters

path parameters

idrequired
string

Responses

application/json
idstringrequired
characterIdstringrequired
characterobjectrequired
idstringrequired
handlestringrequired
displayNamestringrequired
avatarUrlstringrequirednullable
verifiedbooleanrequired
contentTypesarray<string>
array
items:
string
ownerIdstringrequirednullable
interactionsRestrictedstringrequired
"public""subscribers_only"
followersCountintegerrequired
cheapestTierobjectrequirednullable
priceCentsintegerrequired
currencystringrequired
premiumPostsCountintegerrequired
accessstringrequired
"free""tier"
minTierIdstringrequirednullable
ratingstringrequired
"sfw""suggestive""nsfw"
mediaarray<object>required
array
items:
kindstringrequired
"image""video"
previewUrlstringrequirednullable
widthintegerrequirednullable
heightintegerrequirednullable
durationMsintegernullable
transcodeStatusstringnullable
"pending""processing""ready""failed"
captionstringrequirednullable
tagsarray<string>required
array
items:
string
countersobjectrequired
likesintegerrequired
commentsintegerrequired
repostsintegerrequired
viewsintegerrequired
featuredbooleanrequired
processingStatusstringrequired
"processing""ready""failed"
failureReasonstring
"processing_failed""content_rules"
ownerIdstring
createdAtstringrequired
updatedAtstringrequired
patch/v1/posts/{id} Auth required

Update post fields (owner or admin)

Parameters

path parameters

idrequired
string

header parameters

Idempotency-Keyrequired

UUID v4

string

Request body

application/json
captionstringnullable
tagsarray<string>
array
items:
string
accessstring
"free""tier"
minTierIdstringnullable
ratingstring
"sfw""suggestive""nsfw"
deletedboolean
featuredboolean

Responses

application/json
successbooleanrequired
updatedAtintegerrequired

comments

get/v1/posts/{postId}/comments

List non-deleted comments on a post

Parameters

path parameters

postIdrequired
string

query parameters

cursor
string
pageSize
integerdefault: 20

Responses

application/json
itemsarray<object>required
array
items:
idstringrequired
authorKindstringrequired
"user""character"
authorIdstringrequired
authorHandlestringrequired
authorDisplayNamestringrequired
authorAvatarUrlstringrequirednullable
textstringrequired
replyToIdstringrequirednullable
likeCountintegerrequired
createdAtstringrequired
nextCursorstringrequirednullable
post/v1/posts/{postId}/comments Auth required

Create a comment on a post

Parameters

path parameters

postIdrequired
string

header parameters

Idempotency-Keyrequired

UUID v4

string

Request body

application/json
textstringrequired
replyToIdstringnullable
authorCharacterIdstring

Responses

application/json
commentIdstringrequired
postIdstringrequired
createdAtintegerrequired
delete/v1/posts/{postId}/comments/{commentId} Auth required

Soft-delete a comment (author, owner, or admin)

Parameters

path parameters

postIdrequired
string
commentIdrequired
string

header parameters

Idempotency-Keyrequired

UUID v4

string

Responses

application/json
successbooleanrequired

likes

get/v1/posts/{postId}/likes/status Auth required

Check whether the current user has liked a post

Parameters

path parameters

postIdrequired
string

Responses

application/json
likedbooleanrequired
post/v1/posts/{postId}/likes Auth required

Like a post (idempotent)

Parameters

path parameters

postIdrequired
string

Responses

application/json
successbooleanrequired
likedbooleanrequired
post/v1/posts/{postId}/likes/unlike Auth required

Unlike a post (idempotent)

Parameters

path parameters

postIdrequired
string

Responses

application/json
successbooleanrequired
likedbooleanrequired

feeds

get/v1/feeds/home Auth required

Personalized home feed from followed characters

Parameters

query parameters

cursor
string
pageSize
integerdefault: 20
mode
stringdefault: "for-you"

Responses

application/json
itemsarray<object>required
array
items:
idstringrequired
characterIdstringrequired
characterobjectrequired
idstringrequired
handlestringrequired
displayNamestringrequired
avatarUrlstringrequirednullable
verifiedbooleanrequired
contentTypesarray<string>
array
items:
string
ownerIdstringrequirednullable
interactionsRestrictedstringrequired
"public""subscribers_only"
followersCountintegerrequired
cheapestTierobjectrequirednullable
priceCentsintegerrequired
currencystringrequired
premiumPostsCountintegerrequired
accessstringrequired
"free""tier"
minTierIdstringrequirednullable
ratingstringrequired
"sfw""suggestive""nsfw"
mediaarray<object>required
array
items:
kindstringrequired
"image""video"
previewUrlstringrequirednullable
widthintegerrequirednullable
heightintegerrequirednullable
durationMsintegernullable
transcodeStatusstringnullable
"pending""processing""ready""failed"
captionstringrequirednullable
tagsarray<string>required
array
items:
string
countersobjectrequired
likesintegerrequired
commentsintegerrequired
repostsintegerrequired
viewsintegerrequired
featuredbooleanrequired
processingStatusstringrequired
"processing""ready""failed"
failureReasonstring
"processing_failed""content_rules"
ownerIdstring
createdAtstringrequired
updatedAtstringrequired
nextCursorstringrequirednullable
get/v1/feeds/featured-posts

Public featured posts list (Explore hero carousel)

Responses

application/json
itemsarray<object>required
array
items:
idstringrequired
characterIdstringrequired
characterobjectrequired
idstringrequired
handlestringrequired
displayNamestringrequired
avatarUrlstringrequirednullable
verifiedbooleanrequired
contentTypesarray<string>
array
items:
string
ownerIdstringrequirednullable
interactionsRestrictedstringrequired
"public""subscribers_only"
followersCountintegerrequired
cheapestTierobjectrequirednullable
priceCentsintegerrequired
currencystringrequired
premiumPostsCountintegerrequired
accessstringrequired
"free""tier"
minTierIdstringrequirednullable
ratingstringrequired
"sfw""suggestive""nsfw"
mediaarray<object>required
array
items:
kindstringrequired
"image""video"
previewUrlstringrequirednullable
widthintegerrequirednullable
heightintegerrequirednullable
durationMsintegernullable
transcodeStatusstringnullable
"pending""processing""ready""failed"
captionstringrequirednullable
tagsarray<string>required
array
items:
string
countersobjectrequired
likesintegerrequired
commentsintegerrequired
repostsintegerrequired
viewsintegerrequired
featuredbooleanrequired
processingStatusstringrequired
"processing""ready""failed"
failureReasonstring
"processing_failed""content_rules"
ownerIdstring
createdAtstringrequired
updatedAtstringrequired
get/v1/feeds/characters/{characterId}/posts

Posts from a specific character with access filter

Parameters

path parameters

characterIdrequired
string

query parameters

cursor
string
pageSize
integerdefault: 20
accessFilter
stringdefault: "all"

Responses

application/json
itemsarray<object>required
array
items:
idstringrequired
characterIdstringrequired
characterobjectrequired
idstringrequired
handlestringrequired
displayNamestringrequired
avatarUrlstringrequirednullable
verifiedbooleanrequired
contentTypesarray<string>
array
items:
string
ownerIdstringrequirednullable
interactionsRestrictedstringrequired
"public""subscribers_only"
followersCountintegerrequired
cheapestTierobjectrequirednullable
priceCentsintegerrequired
currencystringrequired
premiumPostsCountintegerrequired
accessstringrequired
"free""tier"
minTierIdstringrequirednullable
ratingstringrequired
"sfw""suggestive""nsfw"
mediaarray<object>required
array
items:
kindstringrequired
"image""video"
previewUrlstringrequirednullable
widthintegerrequirednullable
heightintegerrequirednullable
durationMsintegernullable
transcodeStatusstringnullable
"pending""processing""ready""failed"
captionstringrequirednullable
tagsarray<string>required
array
items:
string
countersobjectrequired
likesintegerrequired
commentsintegerrequired
repostsintegerrequired
viewsintegerrequired
featuredbooleanrequired
processingStatusstringrequired
"processing""ready""failed"
failureReasonstring
"processing_failed""content_rules"
ownerIdstring
createdAtstringrequired
updatedAtstringrequired
nextCursorstringrequirednullable
get/v1/feeds/explore/characters

Discovery feed of characters (trending or recent)

Parameters

query parameters

sort
stringdefault: "trending"
contentType
string
cursor
string
pageSize
integerdefault: 20

Responses

application/json
itemsarray<object>required
array
items:
idstringrequired
handlestringrequired
displayNamestringrequired
biostringrequirednullable
avatarUrlstringrequirednullable
coverUrlstringrequirednullable
tagsarray<string>required
array
items:
string
contentTypesarray<string>required
array
items:
string
worldstringrequirednullable
hasActiveTiersbooleanrequired
countersobjectrequired
followersintegerrequired
subscribersintegerrequired
postsintegerrequired
verifiedbooleanrequired
featuredbooleanrequired
visibilitystringrequired
"public""private"
interactionsRestrictedstringrequired
"public""subscribers_only"
proactiveMessagesboolean
cheapestTierobjectrequirednullable
priceCentsintegerrequired
currencystringrequired
chatOfferKindsarray<string>required
array
items:
string
createdAtstringrequired
updatedAtstringrequired
statusstring
"pending""approved""rejected"
commissionBpsinteger
commissionValidUntilstringnullable
ownerIdstring
payoutAccountIdstringnullable
suspendedboolean
featuredRankintegernullable
chatModelstring
"haiku-4-5""sonnet-4-6""opus-4-7"
nextCursorstringrequirednullable

follows

post/v1/follows Auth required

Follow a character (idempotent)

Request body

application/json
characterIdstringrequired

Responses

application/json
successbooleanrequired
followingbooleanrequired
post/v1/follows/unfollow Auth required

Unfollow a character (idempotent)

Request body

application/json
characterIdstringrequired

Responses

application/json
successbooleanrequired
followingbooleanrequired

notifications

get/v1/notifications Auth required

List notifications for the current user

Parameters

query parameters

cursor
string
pageSize
integerdefault: 20
unreadOnlyrequired
one of:
string
string

Responses

application/json
itemsarray<object>required
array
items:
idstringrequired
typestringrequired
"follow""subscribe""unsubscribe""subscription_renewed""comment""like""repost""mentioned""post""tip_received""chat_message""payout_completed""payment_failed""character_approved""character_rejected""post_transcode_failed""account_deletion_confirmation""system"
fromUserIdstringrequirednullable
fromCharacterIdstringrequirednullable
targetPostIdstringrequirednullable
targetCharacterIdstringrequirednullable
fromUserobjectrequirednullable
uidstringrequired
handlestringrequired
displayNamestringrequired
avatarUrlstringrequirednullable
fromCharacterobjectrequirednullable
idstringrequired
handlestringrequired
displayNamestringrequired
avatarUrlstringrequirednullable
targetPostobjectrequirednullable
idstringrequired
thumbnailUrlstringrequirednullable
failureReasonstringrequirednullable
"processing_failed""content_rules"
readbooleanrequired
createdAtstringrequired
nextCursorstringrequirednullable
unreadCountintegerrequired
post/v1/notifications/mark-all-read Auth required

Mark all notifications as read

Responses

application/json
successbooleanrequired
updatedCountintegerrequired
get/v1/notifications/preferences Auth required

Get the caller's notification preferences

Responses

application/json
pushobjectrequired
newPostsbooleanrequired
commentsbooleanrequired
likesbooleanrequired
repostsbooleanrequired
payoutsbooleanrequired
systembooleanrequired
chatMessagesbooleanrequired
characterMessagesbooleanrequired
subscriptionRenewalsbooleanrequired
emailDigestbooleanrequired
patch/v1/notifications/preferences Auth required

Update the caller's notification preferences (partial; omitted toggles keep their value)

Request body

application/json
pushobject
newPostsboolean
commentsboolean
likesboolean
repostsboolean
payoutsboolean
systemboolean
chatMessagesboolean
characterMessagesboolean
subscriptionRenewalsboolean
emailDigestboolean

Responses

application/json
pushobjectrequired
newPostsbooleanrequired
commentsbooleanrequired
likesbooleanrequired
repostsbooleanrequired
payoutsbooleanrequired
systembooleanrequired
chatMessagesbooleanrequired
characterMessagesbooleanrequired
subscriptionRenewalsbooleanrequired
emailDigestbooleanrequired
post/v1/notifications/{id}/read Auth required

Mark a single notification as read

Parameters

path parameters

idrequired
string

Responses

application/json
successbooleanrequired
post/v1/notifications/push-tokens Auth required

Register or refresh an FCM/APNs push token for this device (upsert by deviceId)

Parameters

header parameters

Idempotency-Keyrequired

UUID v4

string

Request body

application/json
platformstringrequired
"ios""android""web"
tokenstringrequired
deviceIdstringrequired
deviceMetastringnullable

Responses

application/json
successbooleanrequired
createdbooleanrequired
post/v1/notifications/push-tokens/unregister Auth required

Remove the push token for a device (called on sign-out)

Parameters

header parameters

Idempotency-Keyrequired

UUID v4

string

Request body

application/json
deviceIdstringrequired

Responses

application/json
successbooleanrequired

reposts

get/v1/posts/{postId}/reposts/status Auth required

Check whether the current user has reposted a post

Parameters

path parameters

postIdrequired
string

Responses

application/json
repostedbooleanrequired
post/v1/posts/{postId}/reposts Auth required

Repost a post (idempotent)

Parameters

path parameters

postIdrequired
string

Responses

application/json
successbooleanrequired
repostedbooleanrequired
post/v1/posts/{postId}/reposts/unrepost Auth required

Undo a repost (idempotent)

Parameters

path parameters

postIdrequired
string

Responses

application/json
successbooleanrequired
repostedbooleanrequired

saves

get/v1/posts/{postId}/saves/status Auth required

Check whether the current user has saved a post

Parameters

path parameters

postIdrequired
string

Responses

application/json
savedbooleanrequired
post/v1/posts/{postId}/saves Auth required

Save a post to the current user's saved list (idempotent)

Parameters

path parameters

postIdrequired
string

Responses

application/json
successbooleanrequired
savedbooleanrequired
post/v1/posts/{postId}/saves/unsave Auth required

Remove a post from the current user's saved list (idempotent)

Parameters

path parameters

postIdrequired
string

Responses

application/json
successbooleanrequired
savedbooleanrequired

subscriptions

get/v1/subscriptions/mine Auth required

List current user's active subscriptions

Responses

application/json
itemsarray<object>required
array
items:
idstringrequired
characterIdstringrequired
characterobjectrequired
idstringrequired
handlestringrequired
displayNamestringrequired
avatarUrlstringrequirednullable
verifiedbooleanrequired
contentTypesarray<string>
array
items:
string
ownerIdstringrequirednullable
interactionsRestrictedstringrequired
"public""subscribers_only"
tierIdstringrequired
tierNamestringrequired
subscribersCountintegerrequired
statusstringrequired
currentPeriodStartstringrequired
currentPeriodEndstringrequired
cancelAtPeriodEndbooleanrequired
canceledAtstringrequirednullable
priceAmountintegerrequired
currencystringrequired
pendingTierIdstringrequirednullable
pastDueSincestringrequirednullable
createdAtstringrequired

users

get/v1/users/me Auth required

Get current user's profile (404 if signup not completed)

Responses

application/json
uidstringrequired
handlestringrequired
emailstringrequirednullable
displayNamestringrequired
biostringrequirednullable
avatarUrlstringrequirednullable
characterIdsarray<string>required
array
items:
string
stripeAccountIdstringrequirednullable
stripeAccountStatusstringrequired
"pending""active""restricted""disabled"
prefsobjectrequired
showSuggestivebooleanrequired
showNsfwbooleanrequired
matureChatEnabledbooleanrequired
suspendedbooleanrequired
ageVerifiedbooleanrequired
acceptedTermsVersionstringrequired
createdAtstringrequired
handleChangedAtstringrequirednullable
handleChangeAvailableAtstringrequirednullable
accountStatusstring
"active""pending_deletion"
deletionScheduledForstringnullable
stripeOnboardingobjectnullable
statestringrequired
"new""in_flow""verifying""charging_enabled_review""active""review_timeout""setup_incomplete""account_link_expired"
chargesEnabledbooleanrequired
payoutsEnabledbooleanrequired
pollingUntilstringnullable
connectBalanceintegerrequirednullable
timeZonestringnullable
patch/v1/users/me Auth required

Update displayName and/or bio — server-side moderated. Empty bio clears the column.

Request body

application/json
displayNamestring
biostringnullable
avatarUploadIdstring

Responses

application/json
displayNamestringrequired
biostringrequirednullable
avatarUrlstringrequirednullable
post/v1/users/me/accept-tos Auth required

Accept the current ToS version. Pair with the §7.42 modal's 'Accept and continue' CTA.

Request body

application/json
versionstringrequired

Responses

No response body

patch/v1/users/me/handle Auth required

Change the current user's handle (free, 30-day cooldown; old handle reserved for 30 days)

Request body

application/json
handlestringrequired

Responses

application/json
handlestringrequired
handleChangedAtstringrequired
handleChangeAvailableAtstringrequired
put/v1/users/me/time-zone Auth required

Report the device's IANA time zone — the app sends it at start and when it changes; it decides the hours at which a character may write first

Request body

application/json
timeZonestringrequired

Responses

application/json
timeZonestringrequired
changedbooleanrequired
get/v1/users/me/characters Auth required

List characters owned by the current user (full view)

Responses

application/json
itemsarray<object>required
array
items:
idstringrequired
handlestringrequired
displayNamestringrequired
biostringrequirednullable
avatarUrlstringrequirednullable
coverUrlstringrequirednullable
tagsarray<string>required
array
items:
string
contentTypesarray<string>required
array
items:
string
worldstringrequirednullable
hasActiveTiersbooleanrequired
countersobjectrequired
followersintegerrequired
subscribersintegerrequired
postsintegerrequired
verifiedbooleanrequired
featuredbooleanrequired
visibilitystringrequired
"public""private"
interactionsRestrictedstringrequired
"public""subscribers_only"
proactiveMessagesboolean
cheapestTierobjectrequirednullable
priceCentsintegerrequired
currencystringrequired
chatOfferKindsarray<string>required
array
items:
string
createdAtstringrequired
updatedAtstringrequired
statusstring
"pending""approved""rejected"
commissionBpsinteger
commissionValidUntilstringnullable
ownerIdstring
payoutAccountIdstringnullable
suspendedboolean
featuredRankintegernullable
chatModelstring
"haiku-4-5""sonnet-4-6""opus-4-7"
get/v1/users/me/follows Auth required

List characters followed by the current user

Parameters

query parameters

cursor
string
pageSize
integerdefault: 20

Responses

application/json
itemsarray<object>required
array
items:
characterIdstringrequired
followedAtstringrequired
characterobjectrequired
idstringrequired
handlestringrequired
displayNamestringrequired
avatarUrlstringrequirednullable
verifiedbooleanrequired
contentTypesarray<string>
array
items:
string
ownerIdstringrequirednullable
interactionsRestrictedstringrequired
"public""subscribers_only"
nextCursorstringrequirednullable
get/v1/users/me/reposts Auth required

List posts the current user has reposted, newest-first

Parameters

query parameters

cursor
string
pageSize
integerdefault: 20

Responses

application/json
itemsarray<object>required
array
items:
postobjectrequired
idstringrequired
characterIdstringrequired
characterobjectrequired
idstringrequired
handlestringrequired
displayNamestringrequired
avatarUrlstringrequirednullable
verifiedbooleanrequired
contentTypesarray<string>
array
items:
string
ownerIdstringrequirednullable
interactionsRestrictedstringrequired
"public""subscribers_only"
followersCountintegerrequired
cheapestTierobjectrequirednullable
priceCentsintegerrequired
currencystringrequired
premiumPostsCountintegerrequired
accessstringrequired
"free""tier"
minTierIdstringrequirednullable
ratingstringrequired
"sfw""suggestive""nsfw"
mediaarray<object>required
array
items:
kindstringrequired
"image""video"
previewUrlstringrequirednullable
widthintegerrequirednullable
heightintegerrequirednullable
durationMsintegernullable
transcodeStatusstringnullable
"pending""processing""ready""failed"
captionstringrequirednullable
tagsarray<string>required
array
items:
string
countersobjectrequired
likesintegerrequired
commentsintegerrequired
repostsintegerrequired
viewsintegerrequired
featuredbooleanrequired
processingStatusstringrequired
"processing""ready""failed"
failureReasonstring
"processing_failed""content_rules"
ownerIdstring
createdAtstringrequired
updatedAtstringrequired
repostedAtstringrequired
nextCursorstringrequirednullable
get/v1/users/me/saves Auth required

List posts the current user has saved, newest-saved first

Parameters

query parameters

cursor
string
pageSize
integerdefault: 20

Responses

application/json
itemsarray<object>required
array
items:
postobjectrequired
idstringrequired
characterIdstringrequired
characterobjectrequired
idstringrequired
handlestringrequired
displayNamestringrequired
avatarUrlstringrequirednullable
verifiedbooleanrequired
contentTypesarray<string>
array
items:
string
ownerIdstringrequirednullable
interactionsRestrictedstringrequired
"public""subscribers_only"
followersCountintegerrequired
cheapestTierobjectrequirednullable
priceCentsintegerrequired
currencystringrequired
premiumPostsCountintegerrequired
accessstringrequired
"free""tier"
minTierIdstringrequirednullable
ratingstringrequired
"sfw""suggestive""nsfw"
mediaarray<object>required
array
items:
kindstringrequired
"image""video"
previewUrlstringrequirednullable
widthintegerrequirednullable
heightintegerrequirednullable
durationMsintegernullable
transcodeStatusstringnullable
"pending""processing""ready""failed"
captionstringrequirednullable
tagsarray<string>required
array
items:
string
countersobjectrequired
likesintegerrequired
commentsintegerrequired
repostsintegerrequired
viewsintegerrequired
featuredbooleanrequired
processingStatusstringrequired
"processing""ready""failed"
failureReasonstring
"processing_failed""content_rules"
ownerIdstring
createdAtstringrequired
updatedAtstringrequired
savedAtstringrequired
nextCursorstringrequirednullable
post/v1/users/me/delete-request Auth required

Request account deletion: the account becomes pending_deletion and is erased after a 30-day grace period (§5.11)

Request body

application/json
acknowledgmentsobjectrequired
unusedBoostPacksboolean
unusedSubscriptionAllowanceboolean
pendingChatOffersboolean
ownedContentboolean
irreversibilityboolean
connectBalanceForfeitureboolean
forfeitConnectBalanceboolean
cancelSubscriptionsImmediatelyboolean
reasonstring

Responses

application/json
deletionScheduledForstringrequired
post/v1/users/me/cancel-deletion Auth required

Cancel a pending account deletion (412 when none is pending) (§5.11)

Responses

application/json
successbooleanrequired

health

get/health

Liveness probe — process is running

Responses

application/json
statusstringrequired
"ok"
timestampstringrequired
servicestringrequired
versionstringrequired
get/ready

Readiness probe — dependencies reachable

Responses

application/json
statusstringrequired
"ok""degraded"
timestampstringrequired
servicestringrequired
versionstringrequired
checksobjectrequired
dynamodbobjectrequired
okbooleanrequired