Fansly API LogoFansly API
Posts

Create Post

Create a new post on fansly.

Publish a new post to the creator's wall.

https://v1.apifansly.com/api/fansly
POST
/{account_id}/posts

Get Started

All requests to the Fansly API require an API Key. See the Authentication page for details.

Request Body

curl -X POST "https://v1.apifansly.com/api/fansly/{account_id}/posts" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "content": "Sample post content...",
    "mediaIds": ["YOUR_MEDIA_ID"],
    "wallIds": ["wal_id"]
  }'
fetch("https://v1.apifansly.com/api/fansly/{account_id}/posts", {
  method: "POST",
  headers: {
    "x-api-key": "YOUR_API_KEY",
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    content: "Sample post content...",
    mediaIds: ["YOUR_MEDIA_ID"],
    wallIds: ["wal_id"]
  })
})
import requests

url = "https://v1.apifansly.com/api/fansly/{account_id}/posts"
headers = {
    "x-api-key": "YOUR_API_KEY",
    "Content-Type": "application/json"
}
payload = {
    "content": "Sample post content...",
    "mediaIds": ["YOUR_MEDIA_ID"],
    "wallIds": ["wal_id"]
}

response = requests.post(url, headers=headers, json=payload)
print(response.json())
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.http.HttpRequest.BodyPublishers;

HttpClient client = HttpClient.newHttpClient();
String json = "{\"content\": \"Sample post content...\", \"mediaIds\": [\"YOUR_MEDIA_ID\"], \"wallIds\": [\"wal_id\"]}";

HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create("https://v1.apifansly.com/api/fansly/{account_id}/posts"))
        .header("x-api-key", "YOUR_API_KEY")
        .header("Content-Type", "application/json")
        .POST(BodyPublishers.ofString(json))
        .build();

client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
        .thenApply(HttpResponse::body)
        .thenAccept(System.out::println)
        .join();
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;

var client = new HttpClient();
client.DefaultRequestHeaders.Add("x-api-key", "YOUR_API_KEY");

var json = "{\"content\": \"Sample post content...\", \"mediaIds\": [\"YOUR_MEDIA_ID\"], \"wallIds\": [\"wal_id\"]}";
var content = new StringContent(json, Encoding.UTF8, "application/json");

var response = await client.PostAsync("https://v1.apifansly.com/api/fansly/{account_id}/posts", content);
var responseString = await response.Content.ReadAsStringAsync();

Console.WriteLine(responseString);
package main

import (
    "bytes"
    "fmt"
    "io/ioutil"
    "net/http"
)

func main() {
    url := "https://v1.apifansly.com/api/fansly/{account_id}/posts"
    payload := []byte(`{"content": "Sample post content...", "mediaIds": ["YOUR_MEDIA_ID"], "wallIds": ["wal_id"]}`)

    req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload))
    req.Header.Set("x-api-key", "YOUR_API_KEY")
    req.Header.Set("Content-Type", "application/json")

    client := &http.Client{}
    resp, _ := client.Do(req)
    defer resp.Body.Close()

    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Println(string(body))
}

Complete Request Payload Example

Here is a comprehensive payload demonstrating how to create a post with all reply permission options, attached media, and wall targeting:

{
  "content": "Check out my new content! 🔥",
  "mediaIds": ["media_id_1", "media_id_2"],
  "postToFYP": true,
  "scheduledFor": 0,
  "expiresAt": 0,
  "wallIds": [],
  "pinWallIds": [],
  "replyPermissions": {
    "following": true,
    "subscribed": true,
    "tipped": true,
    "tippedMinAmount": 0.50,
    "followedMe": true,
    "mediaPurchases": true,
    "mediaPurchasesMinAmount": 4.00
  }
}

Path Parameters

account_id*
string
The unique identifier for the connected account.

Request Body Parameters

Content Validation Rules

  • Standard Post: At least one of content, mediaIds must be provided.
  • FYP Post: When postToFYP is true, mediaIds is strictly required (must reference at least one video of 3+ seconds and be public). previewId is optional.
  • PPV Post: When access_type includes "ppv", both mediaIds and price are required. The price is passed in dollars (e.g., 5 for $5.00).
  • Free Media: To attach media for free, provide only content and mediaIds. Omit access_type and price.

Time Format

All time-related parameters (scheduledFor, expiresAt) must be provided as Unix timestamps in milliseconds (e.g., 1779801881000).

content ?
string
The text content of the post. At least one of content or mediaIds is required.
mediaIds ?
string[]
An array of media IDs to attach. Obtainable from Vault Media or Upload Media endpoint. Required when postToFYP is true or the media has some restrictions like PPV or require subscription. Format: {mediaId: ... and previewId (if needed, otherwise null)}
postToFYP ?
boolean
Set to true to publish the post to the For You Page (FYP). Requires mediaId pointing to a public video of 3+ seconds.
replyPermissions ?
object
Controls who can reply to the post. See the Reply Permissions section below for available options.
wallIds ?
string[]
An array of Wall IDs where the post should be published. Omit to post to the default wall.
scheduledFor ?
number
Timestamp in milliseconds for scheduling the post (0 or omit for immediate).
expiresAt ?
number
Timestamp in milliseconds for post expiration (0 for never).
pinWallIds ?
string[]
Specific Wall IDs where the post should be pinned.
inReplyTo ?
string
The ID of the post to reply to.
quotedPostId ?
string
The ID of the post being quoted.

Media Permissions

Configure access rules for media attached to the message. Supports PPV pricing, subscription tiers, follower-only access, list-based restrictions, and time-limited availability. Multiple access types can be combined to create custom media access requirements.

access_type ?
string | string[]
Access rule(s) for the attached media. Accepts a single value or an array. One of: ppv, subscription, follow, list, limited_time.
price ?
number
The price to unlock the media in dollars. Used when access_type includes ppv.
subscriptionTierId ?
string
The subscription tier ID required to access the media. Used when access_type includes subscription.
subscriptionTierName ?
string
The name of the subscription tier required to access the media.
subscriptionTierBefore ?
number
Epoch timestamp before which the subscription tier rule is active.
subscriptionTierAfter ?
number
Epoch timestamp after which the subscription tier rule is active.
listId ?
string
The list ID required to access the media. Used when access_type includes list.
listLabel ?
string
The name of the list required to access the media. Required if access_type includes list.
validBefore ?
number
Epoch timestamp before which the media is accessible. Used when access_type includes limited_time.
validAfter ?
number
Epoch timestamp after which the media is accessible.
permissions ?
array
Array of custom permission rules for advanced access configurations. Each object defines its own rule using the same fields as above (access_type, price, subscriptionTierId, etc.). Rules are OR'd together. The media unlocks if any single rule's conditions are satisfied.

Reply Permissions

The replyPermissions object controls who can reply to the post. All fields are optional. Omit the object entirely for unrestricted replies.

ParameterTypeRequiredDescription
followingbooleanNoAllow replies from users who are following you.
subscribedbooleanNoAllow replies from subscribed users.
tippedbooleanNoAllow replies from users who have tipped you.
tippedMinAmountnumberNoMinimum tip amount in dollars. Only used when tipped is true.
followedMebooleanNoAllow replies from users you follow back.
mediaPurchasesbooleanNoAllow replies from users who have purchased your media.
mediaPurchasesMinAmountnumberNoMinimum media purchase amount in dollars (e.g., 4.00 for $4.00). Only used when mediaPurchases is true.

Response

{
    "statusCode": 201,
    "message": "Success",
    "data": {
        "status_code": 200,
        "data": {
            "success": true,
            "response": {
                "id": "post_id",
                "accountId": "account_id",
                "content": "Check out my new content! 🔥",
                "fypFlags": 0,
                "inReplyTo": null,
                "quotedPostId": null,
                "replyPermissionFlags": 0,
                "postReplyPermissionFlags": [
                    {
                        "id": "perm_id",
                        "postId": "post_id",
                        "flags": 62,
                        "type": 0,
                        "metadata": "{}"
                    }
                ],
                "expiresAt": 0,
                "attachments": [
                    {
                        "contentType": 1,
                        "contentId": "content_id",
                        "pos": 0,
                        "postId": "post_id"
                    }
                ],
                "wallIds": [],
                "pinWallIds": [],
                "pinned": 0,
                "mediaLikeCount": 0,
                "totalTipAmount": 0,
                "attachmentTipAmount": 0,
                "accountMentions": []
            }
        }
    },
    "timestamp": "2026-02-01T01:09:02.943Z"
}

Response Body

FieldTypeDescription
statusCodenumberHTTP status code of the response (201)
messagestringA human-readable status message
dataobjectThe main response payload
├─ status_codenumberInternal Fansly operation status code
└─ dataobjectNested data container
└─ responseobjectThe created post object
├─ idstringUnique identifier of the created post
├─ accountIdstringThe account ID that owns the post
├─ contentstringThe text content of the post
├─ fypFlagsnumberInternal FYP visibility flags
├─ inReplyTostring | nullID of the post being replied to, if any
├─ quotedPostIdstring | nullID of the post being quoted, if any
├─ replyPermissionFlagsnumberRaw combined reply permission bitmask
├─ postReplyPermissionFlagsarrayApplied reply permission rule objects
├─ expiresAtnumberUnix timestamp for expiration (0 = never expires)
├─ attachmentsarrayList of media attachments on the post
├─ wallIdsarrayWall IDs the post was published to
├─ pinWallIdsarrayWall IDs where the post is pinned
├─ pinnednumberWhether the post is pinned
├─ mediaLikeCountnumberTotal number of media likes
├─ totalTipAmountnumberTotal tip amount received on the post
├─ attachmentTipAmountnumberTip amount attributed to attachments
└─ accountMentionsarrayList of accounts mentioned in the post
timestampstringISO 8601 timestamp of when the response was generated

On this page