The Only API docs
Content

Finish signed upload

Stage 3 of OnlyFans' media upload — completes an S3 multipart upload after every part has been PUT.

POST
/api2/v2/upload/signed/finish

Stage 3 of OnlyFans' media upload — completes an S3 multipart upload after every part has been PUT.

Body (verified live 2026-08-06):

{ "key": "<same key as create>", "parts": [{ "ETag": "\"abc…\"", "PartNumber": 1 }], "uploadId": "<from create>", "secure": false }

Returns { "ETag": "…" } for the assembled object.

Single-part uploads (< 5 MiB) skip this call — the ETag comes straight off the S3 PUT response.

Note that neither this nor create puts anything in the vault; a fourth stage hands the S3 descriptor to OnlyFans' converter host (GET /api2/v2/initupload.geoUploadHosts). POST /accounts/{of_user_id}/media does all of it 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

Multipart completion. Single-part uploads (< 5 MiB) skip this call entirely — the ETag comes off the PUT response. Prefer POST /accounts/{of_user_id}/media.

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

curl -X POST "https://example.com/api2/v2/upload/signed/finish" \  -H "user-id: 509955039" \  -H "Content-Type: application/json" \  -d '{    "key": "upload/0e683d4d-1726-4506-a04d-2a5d05f5b9e1/1031326954680/photo.jpg",    "parts": [      {        "ETag": "\\"5623a10f3404a04d201a8e38aea195d6\\"",        "PartNumber": 1      }    ],    "uploadId": "2~abc123",    "secure": false  }'
{  "success": true,  "status_code": 0,  "data": null,  "relogin": true}