Media
Upload Media
Upload media files (images/videos) to the Fansly.
How to Upload Media to Fansly
Uploading media to Fansly is a two-step process:
- Initiate Upload: Create an upload job and get a
jobId. - Track Status: Use the
jobIdto track the background processing until completion.
Important: The signed CDN links returned in the completion status are temporary and expire after 5 hours.
Step 1: Initiate Media Upload
This endpoint initiates the upload and queues a background job for processing.
https://v1.apifansly.com
POST
/api/fansly/{accountId}/media/upload
Get Started
All requests to the Fansly API require an API Key. See the Authentication page for details.
Authentication
curl -X POST "https://v1.apifansly.com/api/fansly/{accountId}/media/upload" \
-H "x-api-key: YOUR_API_KEY" \
-F "file=@/path/to/image.jpg"const formData = new FormData();
formData.append('file', fileInput.files[0]);
fetch("https://v1.apifansly.com/api/fansly/{accountId}/media/upload", {
method: "POST",
headers: {
"x-api-key": "YOUR_API_KEY"
},
body: formData
})import requests
url = "https://v1.apifansly.com/api/fansly/{accountId}/media/upload"
headers = {"x-api-key": "YOUR_API_KEY"}
files = {"file": open("image.jpg", "rb")}
response = requests.post(url, headers=headers, files=files)
print(response.json())import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.file.Path;
// Note: Java 11+ HttpClient doesn't natively support multipart/form-data.
// Use a library like Apache HttpComponents or a custom body publisher.using System.Net.Http;
var client = new HttpClient();
client.DefaultRequestHeaders.Add("x-api-key", "YOUR_API_KEY");
var content = new MultipartFormDataContent();
var fileContent = new ByteArrayContent(System.IO.File.ReadAllBytes("image.jpg"));
content.Add(fileContent, "file", "image.jpg");
var response = await client.PostAsync("https://v1.apifansly.com/api/fansly/{accountId}/media/upload", content);package main
import (
"bytes"
"io"
"mime/multipart"
"net/http"
"os"
)
func main() {
file, _ := os.Open("image.jpg")
defer file.Close()
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
part, _ := writer.CreateFormFile("file", "image.jpg")
io.Copy(part, file)
writer.Close()
req, _ := http.NewRequest("POST", "https://v1.apifansly.com/api/fansly/{accountId}/media/upload", body)
req.Header.Set("Content-Type", writer.FormDataContentType())
req.Header.Set("x-api-key", "YOUR_API_KEY")
client := &http.Client{}
client.Do(req)
}Path Parameters
accountId*
stringThe ID of the connected Fansly account.
Request Body (Multipart/Form-Data)
| Field | Type | Required | Description |
|---|---|---|---|
file | file | Yes | The media file to upload. |
formInputs | array | No | Optional metadata for the upload (JSON array of {type: number, value: string}). |
Response
{
"statusCode": 201,
"message": "Success",
"data": {
"success": true,
"jobId": "7",
"bucketName": "87550xxxxxxxxxxxxxx",
"message": "Upload job queued. Use the status endpoint to track progress."
},
"timestamp": "2026-02-04T18:35:01.526Z"
}Step 2: Track Upload Status
Check the status of a media upload job using the jobId from Step 1.
https://v1.apifansly.com
GET
/api/fansly/media/upload/{jobId}/status
Path Parameters
jobId*
stringThe JOB ID returned by the initiate upload endpoint.
Authentication
curl -X GET "https://v1.apifansly.com/api/fansly/media/upload/8/status" \
-H "x-api-key: YOUR_API_KEY"fetch("https://v1.apifansly.com/api/fansly/media/upload/8/status", {
method: "GET",
headers: {
"x-api-key": "YOUR_API_KEY"
}
})import requests
url = "https://v1.apifansly.com/api/fansly/media/upload/8/status"
headers = {"x-api-key": "YOUR_API_KEY"}
response = requests.get(url, headers=headers)
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();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://v1.apifansly.com/api/fansly/media/upload/8/status"))
.header("x-api-key", "YOUR_API_KEY")
.GET()
.build();
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.thenAccept(System.out::println)
.join();using System.Net.Http;
var client = new HttpClient();
client.DefaultRequestHeaders.Add("x-api-key", "YOUR_API_KEY");
var response = await client.GetAsync("https://v1.apifansly.com/api/fansly/media/upload/8/status");package main
import (
"fmt"
"net/http"
)
func main() {
url := "https://v1.apifansly.com/api/fansly/media/upload/8/status"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Set("x-api-key", "YOUR_API_KEY")
client := &http.Client{}
client.Do(req)
}Response
{
"statusCode": 200,
"message": "Success",
"data": {
"success": true,
"jobId": "8",
"state": "completed",
"progress": 100,
"result": {
"success": true,
"bucketName": "87550xxxxxxxxxxxxxx",
"mediaId": "87474xxxxxxxxxxxxxx",
"accountMedia": [
{
"id": "87550xxxxxxxxxxxxxx",
"mediaId": "87474xxxxxxxxxxxxxx",
"accountId": "86540xxxxxxxxxxxxxx",
"media": {
"id": "87474xxxxxxxxxxxxxx",
"type": 1, // 1 = Image, 2 = Video
"mimetype": "image/jpeg",
"filename": "image.jpeg",
"location": "/86540.../87474....jpeg",
"width": 444,
"height": 421,
"createdAt": 1770048976,
"variants": [
{
"id": "87474xxxxxxxxxxxxxx",
"type": 1,
"mimetype": "image/jpeg",
"width": 378,
"height": 360,
"locations": [
{
"locationId": "1",
"location": "https://cdn3.fansly.com/.../image_360.jpeg?..."
}
]
}
],
"locations": [
{
"locationId": "1",
"location": "https://cdn3.fansly.com/.../image.jpeg?..."
}
]
}
}
]
}
},
"timestamp": "2026-02-04T18:40:19.559Z"
}Response Fields
| Field | Type | Description |
|---|---|---|
statusCode | number | The HTTP status code |
data | object | Main response container |
├─ success | boolean | Result status |
├─ jobId | string | The tracked job ID |
├─ state | string | Current job state (waiting, active, completed, failed) |
├─ progress | number | Job progress percentage |
└─ result | object | Details of the uploaded media (available when state is completed) |
├─ mediaId | string | The unique ID for the backend media object |
└─ accountMedia | array | List of media objects associated with the account |
└─ media | object | Detailed media metadata including variants and signed CDN locations |
timestamp | string | ISO 8601 response timestamp |