Media Upload
Create Signed Upload
Requests a single-part or multipart S3 PUT URL set for uploading a file to the OnlyFans CDN. After this call, the client PUTs file bytes directly to the returned S3 URLs — no further calls through this API until Finish Multipart Upload (for multipart) or the final convert.onlyfans.com step (for both). Requires permission api_media_upload_signed_create.
https://public-api.fansmetric.comAuthorization
defaultAuthorizationBearer <token>Send your FansMetric API key as a Bearer token in the Authorization header.
In: header
Path Parameters
account_id*integerOnlyFans numeric account ID.
Request Body
application/jsonkey*stringS3 object key. Format:
upload/{uuid}/{12-digit-number}/{url-encoded-filename}.parts*stringNumber of S3 parts.
1for a single-part upload,> 1for multipart (one part per chunk of ≥ 5 MB except the last).contentType*stringMIME type of the file (
image/jpeg,video/mp4, …).securestringDefault
false. Settruefor protected/DRM uploads.
Response Fields
data.putUrlstringSingle-part only. Signed S3 PUT URL — upload the entire file here.
data.getUrlstringThe eventual
GETURL where the uploaded object will be readable. Keep for the conversion step.data.uploadIdstringMultipart only. S3 multipart upload ID — pass back to Finish Multipart Upload.
data.keys[]arrayMultipart only. One entry per part:
{ part, putUrl }. PUT each chunk to itsputUrl.dataobject | arrayEndpoint-specific payload. See the fields below for this route.
_meta._credits.usedintegerCredits consumed by this request (currently always
1)._meta._rate_limits.limit_minuteintegerMaximum requests per minute for the organization.
_meta._rate_limits.remaining_minuteintegerRemaining requests in the current minute window.
_meta._rate_limits.limit_dayintegerMaximum requests per day for the organization.
_meta._rate_limits.remaining_dayintegerRemaining requests in the current day window.
| Field | Type | Description |
|---|---|---|
| data.putUrl | string | Single-part only. Signed S3 PUT URL — upload the entire file here. |
| data.getUrl | string | The eventual GET URL where the uploaded object will be readable. Keep for the conversion step. |
| data.uploadId | string | Multipart only. S3 multipart upload ID — pass back to Finish Multipart Upload. |
| data.keys[] | array | Multipart only. One entry per part: { part, putUrl }. PUT each chunk to its putUrl. |
| data | object | array | Endpoint-specific payload. See the fields below for this route. |
| _meta._credits.used | integer | Credits consumed by this request (currently always 1). |
| _meta._rate_limits.limit_minute | integer | Maximum requests per minute for the organization. |
| _meta._rate_limits.remaining_minute | integer | Remaining requests in the current minute window. |
| _meta._rate_limits.limit_day | integer | Maximum requests per day for the organization. |
| _meta._rate_limits.remaining_day | integer | Remaining requests in the current day window. |
curl --request POST "https://public-api.fansmetric.com/v1/100000001/upload/signed/create" \
--header "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
--data '{
"key": "upload/8a3d.../529838163914/photo.jpg",
"parts": 1,
"contentType": "image/jpeg",
"secure": false
}'Response
200