Fansly API LogoFansly API
Mass messaging

Update a Mass Message

Update a mass message that was previously scheduled.

https://v1.apifansly.com/api/fansly
PUT
/{account_id}/mass-messaging/scheduled/{scheduled_message_id}

Get Started

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

curl -X PUT "https://v1.apifansly.com/api/fansly/{account_id}/mass-messaging/scheduled/{scheduled_message_id}" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "content": "message_content",
    "mediaIds": ["media_id"],
    "access_type": ["ppv"],
    "price": 10.00, // $10.00
    "scheduledFor": time_in_milliseconds
  }'
fetch("https://v1.apifansly.com/api/fansly/{account_id}/mass-messaging/scheduled/{scheduled_message_id}", {
  method: "PUT",
  headers: {
    "x-api-key": "YOUR_API_KEY",
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    content: "message_content",
    mediaIds: ["media_id"],
    access_type: ["ppv"],
    price: 10.00, // $10.00
    scheduledFor: time_in_milliseconds
  })
})
import requests

url = "https://v1.apifansly.com/api/fansly/{account_id}/mass-messaging/scheduled/{scheduled_message_id}"
headers = {
    "x-api-key": "YOUR_API_KEY",
    "Content-Type": "application/json"
}
payload = {
    "content": "message_content",
    "mediaIds": ["media_id"],
    "access_type": ["ppv"],
    "price": 10.00, // $10.00
    "scheduledFor": time_in_milliseconds
}

response = requests.PUT(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;

HttpClient client = HttpClient.newHttpClient();

String requestBody = "{\"content\":\"message_content\",\"mediaIds\":[\"media_id\"],\"access_type\":[\"ppv\"],\"price\":10.00,\"scheduledFor\":time_in_milliseconds}";

HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create("https://v1.apifansly.com/api/fansly/{account_id}/mass-messaging/scheduled/{scheduled_message_id}"))
        .header("x-api-key", "YOUR_API_KEY")
        .header("Content-Type", "application/json")
        .PUT(HttpRequest.BodyPublishers.ofString(requestBody))
        .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 jsonBody = "{\"content\":\"message_content\",\"mediaIds\":[\"media_id\"],\"access_type\":[\"ppv\"],\"price\":10.00,\"scheduledFor\":time_in_milliseconds}";
var content = new StringContent(jsonBody, Encoding.UTF8, "application/json");

var response = await client.PutAsync("https://v1.apifansly.com/api/fansly/{account_id}/mass-messaging/scheduled/{scheduled_message_id}", 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}/mass-messaging/scheduled/{scheduled_message_id}"
    payload := []byte(`{"content":"message_content","mediaIds":["media_id"],"access_type":["ppv"],"price":10.00,"scheduledFor":time_in_milliseconds}`)

    req, _ := http.NewRequest("PUT", 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))
}

Path Parameters

account_id*
string
The unique identifier for the connected account.
scheduled_message_id*
string
The unique identifier for the scheduled message.

Request Body

Message

content*
string
The text content of the broadcast message.
mediaIds ?
array
Array of uploaded media IDs, or objects in the form {mediaId: ... and previewId (if needed, otherwise null)}, to attach to the message.
scheduledFor*
number
Epoch timestamp in milliseconds for when to send the message. If omitted, the message sends immediately.

Media Permissions

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.

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 beyond the standard access types.

Response

{
    "statusCode": 201,
    "message": "Success",
    "data": {
        "status_code": 200,
        "data": {
            "success": true,
            "response": "broadcast sent"
        }
    },
    "timestamp": "2026-06-19T13:42:24.655Z"
}

On this page