Create Post
Create a new post on fansly.
Publish a new post to the creator's wall.
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
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).previewIdis optional. - 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.
Time Format
All time-related parameters (scheduledFor, expiresAt) must be provided as Unix timestamps in milliseconds (e.g., 1779801881000).
content or mediaIds is required.postToFYP is true or the media has some restrictions like PPV or require subscription. Format: {mediaId: ... and previewId (if needed, otherwise null)}true to publish the post to the For You Page (FYP). Requires mediaId pointing to a public video of 3+ seconds.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.
ppv, subscription, follow, list, limited_time.access_type includes ppv.access_type includes subscription.access_type includes list.access_type includes list.access_type includes limited_time.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 |