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.com
POST/v1/{account_id}/chats/{user_id}/messages
Bearer

Authorization

default
AuthorizationBearer <token>

Send your FansMetric API key as a Bearer token in the Authorization header.

In: header

Path Parameters

  • account_id*integer

    OnlyFans numeric account ID.

  • user_id*integer

    Fan/user ID to send the message to.

Request Body

application/json
  • textstring

    Message text. Can contain HTML. Required unless mediaFiles or giphyId is present.

  • lockedTextboolean

    Hide text behind paywall. Default false.

  • mediaFilesarray

    Array of vault media IDs (integers).

  • pricestring

    PPV price. 0 = free. Non-zero must be 3-200 and requires mediaFiles.

  • previewsarray

    Array of vault media IDs to use as previews. Subset of mediaFiles.

  • giphyIdstring

    Giphy GIF ID — get from /gifs/trending or /gifs/search.

  • replyToMessageIdstring

    Message ID being replied to.

  • rfTagstring

    OF creator user IDs to tag (release forms).

  • rfGueststring

    Release-form guest IDs.

  • rfPartnerstring

    Release-form partner IDs.

Response Fields

  • data.responseTypestring

    Always "message".

  • data.idinteger

    Created message ID.

  • data.textstring

    Message text as sent.

  • data.createdAtstring

    ISO 8601 timestamp.

  • data.fromUserobject

    Sender summary (id, _view).

  • data.mediaCountinteger

    Number of media attachments.

  • data.mediaarray

    Media items attached to the message.

  • data.priceinteger

    PPV price. 0 if free.

  • data.isFreeboolean

    True when price is 0.

  • data.isLikedboolean

    True if the recipient has liked the message.

  • data.isPinnedboolean

    True if the message is currently pinned.

  • data.canBePinnedboolean

    Whether the message can be pinned.

  • data.giphyIdstring | null

    Attached Giphy ID, if any.

  • data.queueIdinteger

    Queue ID for the send job (used to cancel or look up the queued message).

  • dataobject | array

    Endpoint-specific payload. See the fields below for this route.

  • _meta._credits.usedinteger

    Credits consumed by this request (currently always 1).

  • _meta._rate_limits.limit_minuteinteger

    Maximum requests per minute for the organization.

  • _meta._rate_limits.remaining_minuteinteger

    Remaining requests in the current minute window.

  • _meta._rate_limits.limit_dayinteger

    Maximum requests per day for the organization.

  • _meta._rate_limits.remaining_dayinteger

    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
{
"data":{
"responseType":"message"
"id":1000000000001
"text":"Hello!"
"giphyId":null
"createdAt":"2026-05-15T10:00:00+00:00"
"fromUser":{
"id":100000001
"_view":"t"
}
"mediaCount":0
"media":[]
"price":0
"isFree":true
"isLiked":false
"isPinned":false
"canBePinned":true
"queueId":10000000001
}
"_meta":{
"_credits":{
"used":1
}
"_rate_limits":{
"limit_minute":1000
"remaining_minute":993
"limit_day":50000
"remaining_day":49993
}
}
}