🚀 Fansly API (Alpha) is live!WIP - Updated Daily
Fansly API Logo
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:

  1. Initiate Upload: Create an upload job and get a jobId.
  2. Track Status: Use the jobId to 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*
string
The ID of the connected Fansly account.

Request Body (Multipart/Form-Data)

FieldTypeRequiredDescription
filefileYesThe media file to upload.
formInputsarrayNoOptional 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*
string
The 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

FieldTypeDescription
statusCodenumberThe HTTP status code
dataobjectMain response container
├─ successbooleanResult status
├─ jobIdstringThe tracked job ID
├─ statestringCurrent job state (waiting, active, completed, failed)
├─ progressnumberJob progress percentage
└─ resultobjectDetails of the uploaded media (available when state is completed)
├─ mediaIdstringThe unique ID for the backend media object
└─ accountMediaarrayList of media objects associated with the account
└─ mediaobjectDetailed media metadata including variants and signed CDN locations
timestampstringISO 8601 response timestamp

On this page