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).
  • 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.
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 `access_type` is `"ppv"`.
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.
access_type ?
string[]
Set to `["ppv"]` to charge for viewing the attached media. Only `"ppv"` is supported currently.
price ?
number
The price for PPV content in dollars (e.g., `5` for $5.00). Required if `access_type` includes `"ppv"`.
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.

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