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*
stringThe unique identifier for the connected account.
Request Body Parameters
Content Validation Rules
- Standard Post: At least one of
content,mediaIdsmust be provided. - FYP Post: When
postToFYPistrue,mediaIdsis strictly required (must reference at least one video of 3+ seconds and be public). - PPV Post: When
access_typeincludes"ppv", bothmediaIdsandpriceare required. The price is passed in dollars (e.g.,5for $5.00). - Free Media: To attach media for free, provide only
contentandmediaIds. Omitaccess_typeandprice.
content ?
stringThe 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 ?
booleanSet 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 ?
numberThe price for PPV content in dollars (e.g., `5` for $5.00). Required if `access_type` includes `"ppv"`.
replyPermissions ?
objectControls 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 ?
numberTimestamp in milliseconds for scheduling the post (0 or omit for immediate).
expiresAt ?
numberTimestamp in milliseconds for post expiration (0 for never).
pinWallIds ?
string[]Specific Wall IDs where the post should be pinned.
inReplyTo ?
stringThe ID of the post to reply to.
quotedPostId ?
stringThe 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
following | boolean | No | Allow replies from users who are following you. |
subscribed | boolean | No | Allow replies from subscribed users. |
tipped | boolean | No | Allow replies from users who have tipped you. |
tippedMinAmount | number | No | Minimum tip amount in dollars. Only used when tipped is true. |
followedMe | boolean | No | Allow replies from users you follow back. |
mediaPurchases | boolean | No | Allow replies from users who have purchased your media. |
mediaPurchasesMinAmount | number | No | Minimum 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
| Field | Type | Description |
|---|---|---|
statusCode | number | HTTP status code of the response (201) |
message | string | A human-readable status message |
data | object | The main response payload |
├─ status_code | number | Internal Fansly operation status code |
└─ data | object | Nested data container |
└─ response | object | The created post object |
├─ id | string | Unique identifier of the created post |
├─ accountId | string | The account ID that owns the post |
├─ content | string | The text content of the post |
├─ fypFlags | number | Internal FYP visibility flags |
├─ inReplyTo | string | null | ID of the post being replied to, if any |
├─ quotedPostId | string | null | ID of the post being quoted, if any |
├─ replyPermissionFlags | number | Raw combined reply permission bitmask |
├─ postReplyPermissionFlags | array | Applied reply permission rule objects |
├─ expiresAt | number | Unix timestamp for expiration (0 = never expires) |
├─ attachments | array | List of media attachments on the post |
├─ wallIds | array | Wall IDs the post was published to |
├─ pinWallIds | array | Wall IDs where the post is pinned |
├─ pinned | number | Whether the post is pinned |
├─ mediaLikeCount | number | Total number of media likes |
├─ totalTipAmount | number | Total tip amount received on the post |
├─ attachmentTipAmount | number | Tip amount attributed to attachments |
└─ accountMentions | array | List of accounts mentioned in the post |
timestamp | string | ISO 8601 timestamp of when the response was generated |