Skip to main content
Upload an image or submit a link for community voting.

Upload Types

TypeDescription
imageUpload an image file
image_urlSubmit a URL to an image
linkSubmit a link to external content

Image Upload

curl -X POST https://fucksornot.com/api/upload \
  -H "Cookie: auth-token=YOUR_JWT_TOKEN" \
  -F "upload_type=image" \
  -F "description=Check out this cool gadget" \
  -F "tags=gadget,tech" \
  -F "file=@/path/to/image.jpg"

Image URL Upload

The image_url upload type is only available on the cookie-authenticated /api/upload endpoint (not /api/v1/upload). FoN will download and process the image from the given URL.
curl -X POST https://fucksornot.com/api/upload \
  -H "Cookie: auth-token=YOUR_JWT_TOKEN" \
  -F "upload_type=image_url" \
  -F "description=Found this online" \
  -F "image_url=https://example.com/image.jpg"
curl -X POST https://fucksornot.com/api/upload \
  -H "Cookie: auth-token=YOUR_JWT_TOKEN" \
  -F "upload_type=link" \
  -F "description=Great video" \
  -F "external_url=https://youtube.com/watch?v=..."

Supported Platforms

Links from these platforms get rich embeds:
  • Bluesky
  • Instagram
  • Threads
  • YouTube
  • Tumblr
  • Spotify

Parameters

ParameterTypeRequiredDescription
upload_typestringYesimage, image_url, or link
descriptionstringYesDescription (max 500 characters)
filefileFor imageImage file (JPEG, PNG, GIF, WebP, max 10MB)
image_urlstringFor image_urlURL to image
external_urlstringFor linkURL to embed
tagsstringNoComma-separated tags (max 10)
is_privatestringNo"true" or "false"

Response

{
  "upload": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "userId": "user-uuid",
    "filename": "abc123.webp",
    "originalName": "myimage.jpg",
    "description": "Check out this cool gadget",
    "uploadType": "image",
    "externalUrl": null,
    "isPrivate": false
  }
}
This is the immediate creation response and only includes a subset of fields. To get the full upload object (including tags, username, vote counts, and stats), fetch it afterwards with GET /api/upload/{id}.

Duplicate Detection

If the image has already been uploaded:
{
  "duplicate": true,
  "existingUploadId": "existing-upload-uuid",
  "message": "This image has already been uploaded"
}

API Token Upload

For programmatic access, use the /api/v1/upload endpoint with an API token:
curl -X POST https://fucksornot.com/api/v1/upload \
  -H "Authorization: Bearer 7f3a9c2e1b6d4f8a0c5e7b9d2f4a6c8e1b3d5f7a9c0e2b4d6f8a1c3e5b7d9f0a" \
  -F "upload_type=image" \
  -F "description=Automated upload" \
  -F "file=@image.jpg"
/api/v1/upload only accepts image or link for upload_typeimage_url is not supported on this endpoint and will return a 400 Invalid upload type error. To submit an image by URL, use the cookie-authenticated /api/upload endpoint shown above.

Rate Limiting

Uploads are limited to 20 per hour per user.