Upload an image or submit a link for community voting.
Upload Types
| Type | Description |
|---|
image | Upload an image file |
image_url | Submit a URL to an image |
link | Submit 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"
Link Upload
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=..."
Links from these platforms get rich embeds:
- Bluesky
- Instagram
- Threads
- YouTube
- Tumblr
- Spotify
Parameters
| Parameter | Type | Required | Description |
|---|
upload_type | string | Yes | image, image_url, or link |
description | string | Yes | Description (max 500 characters) |
file | file | For image | Image file (JPEG, PNG, GIF, WebP, max 10MB) |
image_url | string | For image_url | URL to image |
external_url | string | For link | URL to embed |
tags | string | No | Comma-separated tags (max 10) |
is_private | string | No | "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_type — image_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.