The Only API docs
Content

Create signed media upload

Stage 1 of OnlyFans' media upload. Returns pre-signed S3 URL(s) that you then PUT the bytes to.

POST
/api2/v2/upload/signed/create

Stage 1 of OnlyFans' media upload. Returns pre-signed S3 URL(s) that you then PUT the bytes to.

Body (verified live 2026-08-06):

{ "key": "upload/{uuid4}/{nonce}/{url-encoded-lowercased-filename}", "parts": 1, "contentType": "image/jpeg", "secure": false }

The key prefix comes from GET /api2/v2/initupload.s3.uploadPath (upload/, or upload/secure/ when secure is true). parts is floor(size / 5242880) + 1 for files ≥ 5 MiB, else 1.

A wrong or missing key is what produces 400 {"error":{"message":"Bad key"}} — the field really is named key, and it must be a path under the account's upload prefix.

Response: { keys: [{putUrl}], uploadId, putUrl, getUrl }. Multipart when keys[] is populated and the file is ≥ 5 MiB; otherwise PUT the whole file to putUrl.

You normally don't call this directlyPOST /accounts/{of_user_id}/media runs all four stages for you.

OnlyFans only — Fansly accounts are rejected on /api2/v2/*.

Guide: The two surfaces

X-API-Key<token>

Your CRM panel API key

In: header

Header Parameters

user-id*string

Creator account ID of the account to act as (e.g. 509955039). Required — omitting it returns 400 user-id header is required. Use GET /accounts to list your connected accounts. On /api2/v2/* the account must be an OnlyFans account; Fansly accounts are rejected there.

X-Proxy?string

Proxy URL — HTTP or SOCKS5 (e.g. http://user:pass@host:port or socks5://user:pass@host:port). Optional on post-connection routes, where it overrides the proxy saved at login time. Required on the connection routes (POST /accounts/login, POST /accounts/login/cookies, POST /accounts/login/verify-otp) for OnlyFans accounts; optional for Fansly.

Request Body

application/json

Upload descriptor. Prefer POST /accounts/{of_user_id}/media, which runs all four stages for you.

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

curl -X POST "https://example.com/api2/v2/upload/signed/create" \  -H "user-id: 509955039" \  -H "Content-Type: application/json" \  -d '{    "key": "upload/0e683d4d-1726-4506-a04d-2a5d05f5b9e1/1031326954680/photo.jpg",    "parts": 1,    "contentType": "image/jpeg",    "secure": false  }'
{  "success": true,  "status_code": 0,  "data": null,  "relogin": true}