Messages
Send Message
Sends a message in a chat. Supports text, vault media, GIFs, replies, PPV pricing, and release-form tagging. Requires permission api_messages_send.
https://public-api.fansmetric.comAuthorization
defaultAuthorizationBearer <token>Send your FansMetric API key as a Bearer token in the Authorization header.
In: header
Path Parameters
account_id*integerOnlyFans numeric account ID.
user_id*integerFan/user ID to send the message to.
Request Body
application/jsontextstringMessage text. Can contain HTML. Required unless
mediaFilesorgiphyIdis present.lockedTextbooleanHide text behind paywall. Default false.
mediaFilesarrayArray of vault media IDs (integers).
pricestringPPV price. 0 = free. Non-zero must be 3-200 and requires
mediaFiles.previewsarrayArray of vault media IDs to use as previews. Subset of
mediaFiles.giphyIdstringGiphy GIF ID — get from
/gifs/trendingor/gifs/search.replyToMessageIdstringMessage ID being replied to.
rfTagstringOF creator user IDs to tag (release forms).
rfGueststringRelease-form guest IDs.
rfPartnerstringRelease-form partner IDs.
Response Fields
data.responseTypestringAlways
"message".data.idintegerCreated message ID.
data.textstringMessage text as sent.
data.createdAtstringISO 8601 timestamp.
data.fromUserobjectSender summary (
id,_view).data.mediaCountintegerNumber of media attachments.
data.mediaarrayMedia items attached to the message.
data.priceintegerPPV price.
0if free.data.isFreebooleanTrue when
priceis 0.data.isLikedbooleanTrue if the recipient has liked the message.
data.isPinnedbooleanTrue if the message is currently pinned.
data.canBePinnedbooleanWhether the message can be pinned.
data.giphyIdstring | nullAttached Giphy ID, if any.
data.queueIdintegerQueue ID for the send job (used to cancel or look up the queued message).
dataobject | arrayEndpoint-specific payload. See the fields below for this route.
_meta._credits.usedintegerCredits consumed by this request (currently always
1)._meta._rate_limits.limit_minuteintegerMaximum requests per minute for the organization.
_meta._rate_limits.remaining_minuteintegerRemaining requests in the current minute window.
_meta._rate_limits.limit_dayintegerMaximum requests per day for the organization.
_meta._rate_limits.remaining_dayintegerRemaining requests in the current day window.
| Field | Type | Description |
|---|---|---|
| data.responseType | string | Always "message". |
| data.id | integer | Created message ID. |
| data.text | string | Message text as sent. |
| data.createdAt | string | ISO 8601 timestamp. |
| data.fromUser | object | Sender summary (id, _view). |
| data.mediaCount | integer | Number of media attachments. |
| data.media | array | Media items attached to the message. |
| data.price | integer | PPV price. 0 if free. |
| data.isFree | boolean | True when price is 0. |
| data.isLiked | boolean | True if the recipient has liked the message. |
| data.isPinned | boolean | True if the message is currently pinned. |
| data.canBePinned | boolean | Whether the message can be pinned. |
| data.giphyId | string | null | Attached Giphy ID, if any. |
| data.queueId | integer | Queue ID for the send job (used to cancel or look up the queued message). |
| data | object | array | Endpoint-specific payload. See the fields below for this route. |
| _meta._credits.used | integer | Credits consumed by this request (currently always 1). |
| _meta._rate_limits.limit_minute | integer | Maximum requests per minute for the organization. |
| _meta._rate_limits.remaining_minute | integer | Remaining requests in the current minute window. |
| _meta._rate_limits.limit_day | integer | Maximum requests per day for the organization. |
| _meta._rate_limits.remaining_day | integer | Remaining requests in the current day window. |
curl --request POST "https://public-api.fansmetric.com/v1/100000001/chats/sample_user_id/messages" \
--header "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
--data '{
"text": "Hello!",
"lockedText": false,
"mediaFiles": [],
"price": 0,
"previews": [],
"giphyId": null,
"replyToMessageId": null
}'Response
200