campaign Create an Account NOW to get a special badge on your profile! Available until May 1st! Learn more →
code REST API v1

API Documentation

Full REST API for integrating Weggle into your apps. Authentication, file hosting, memes, social, and more.

Base URL: https://api.weggle.xyz/v1
bolt Rate limit: 100 req/15min

info Overview

The Weggle REST API provides programmatic access to all platform features. All responses are JSON. All requests must be made over HTTPS in production.

dns Base URLs
Production: https://api.weggle.xyz/v1
Development: http://localhost:3000/api/v1
check_circle Response Format
// Success
{ "success": true, "data": { ... } }

// Error
{ "success": false, "error": "message" }

key Authentication

The API supports two authentication methods. Most programmatic access should use an API Key.

API Key (recommended)

Generate a key at /settings/api-keys. Pass it in the X-API-Key header on every request.

X-API-Key: wk_your_key_here
Session Cookie

Log in via POST /v1/auth/login — a session cookie is set automatically. Best for browser-based integrations.

Cookie: weggle.session_token=...
API Key limits: Free: 3 keys · Pro: 10 keys · Enterprise: 25 keys. Keys are prefixed wk_. Manage at /settings/api-keys.

error_outline Errors

CodeMeaning
200OK — request succeeded
201Created — resource created successfully
400Bad Request — missing or invalid parameters
401Unauthorized — authentication required or token invalid
403Forbidden — authenticated but lacks permission
404Not Found — resource does not exist
422Unprocessable — validation error (see details array)
429Too Many Requests — rate limit exceeded
500Internal Server Error — something went wrong on our end

bolt Rate Limiting

Rate limits are enforced per IP address. Responses include rate limit headers:

RateLimit-Limit:     100
RateLimit-Remaining: 87
RateLimit-Reset:     1748192400
Standard endpoints
100 req
per 15 minutes
Upload endpoints
30 uploads
per 1 hour
Auth endpoints
20 req
per 15 minutes

login Auth

POST /v1/auth/login

Authenticate with email and password. Sets a session cookie.

Request Body
{ "email": "user@example.com", "password": "secret" }
Response
{ "success": true, "user": { "id": "...", "username": "alice", "role": "user" } }
POST /v1/auth/register

Create a new account.

Request Body
{ "username": "alice", "email": "user@example.com", "password": "secret" }
Response
{ "success": true, "user": { "id": "...", "username": "alice" } }
POST /v1/auth/logout

Invalidate the current session.

Response
{ "success": true }

person Users

GET /v1/users/me

Returns the authenticated user's full profile. Requires authentication.

Response
{ "success": true, "user": { "id": "...", "username": "alice", "email": "...", "role": "user", "plan": "free", "storage_used": 0 } }
GET /v1/users/profile

Get a user's public profile by username or ID.

Parameters
username optional — username to look up
userId optional — user ID to look up
Response
{ "success": true, "profile": { "username": "alice", "bio": "...", "avatar_url": "..." } }
PUT /v1/users/profile

Update the authenticated user's profile fields.

Request Body
{ "bio": "My new bio", "display_username": "Alice" }
Response
{ "success": true, "user": { ... } }
POST /v1/users/avatar

Upload a new profile avatar. Multipart form-data.

Request Body
Content-Type: multipart/form-data
field: avatar (image file, max 5MB)
Response
{ "success": true, "avatarUrl": "https://cdn.weggle.xyz/..." }
GET /v1/users/search

Search users by username.

Parameters
q required — search query (min 2 chars)
limit optional — max results (default 10)
Response
{ "success": true, "users": [{ "username": "alice", "avatar_url": "..." }] }

folder Files

GET /v1/files

Returns the authenticated user's uploaded files. Requires X-API-Key.

Parameters
limit optional — max results (default 25, max 100)
offset optional — pagination offset (default 0)
search optional — filename search
type optional — mime type prefix e.g. image/
publicStatus optional — true / false
Response
{ "success": true, "data": { "files": [{ "id": 1, "filename": "photo.jpg", "originalName": "photo.jpg", "mimeType": "image/jpeg", "size": 102400, "humanReadableSize": "100 KB", "isPublic": false, "downloadCount": 0, "createdAt": "...", "url": "/file/1" }], "pagination": { "total": 42, "limit": 25, "offset": 0, "hasMore": true } } }
GET /v1/files/:fileId

Returns metadata for a specific file. Private files require authentication as the owner.

Parameters
fileId required — integer file ID in path
Response
{ "success": true, "data": { "file": { "id": 1, "filename": "photo.jpg", "mimeType": "image/jpeg", "size": 102400, "humanReadableSize": "100 KB", "isPublic": false, "downloadCount": 0, "createdAt": "...", "url": "/file/1" } } }
POST /v1/files/upload

Upload a file. Multipart form-data. Max 50MB on Free plan.

Request Body
Content-Type: multipart/form-data
field: file     (required, binary)
field: isPublic (optional, boolean, default false)
Response
{ "success": true, "file": { "id": 1, "url": "/file/1" } }
PUT /v1/files/:fileId

Update file metadata (filename, visibility).

Parameters
fileId required — path parameter
Request Body
{ "filename": "new-name.jpg", "isPublic": true }
Response
{ "success": true, "file": { ... } }
DELETE /v1/files/:fileId

Permanently delete a file.

Parameters
fileId required — path parameter
Response
{ "success": true, "message": "File deleted" }

image Memes

GET /v1/memes

Returns the authenticated user's memes. Requires X-API-Key.

Parameters
limit optional — max results (default 25, max 100)
offset optional
templateId optional — filter by template
Response
{ "success": true, "data": { "memes": [{ "id": 1, "title": "My Meme", "templateId": "drake", "templateName": "Drake", "topText": "Writing docs", "bottomText": "Shipping bugs", "isPublic": true, "viewCount": 42, "createdAt": "...", "imageUrl": "/meme/1/view" }], "pagination": { "total": 5, "limit": 25, "offset": 0, "hasMore": false } } }
POST /v1/memes

Create a new meme from a template. Requires X-API-Key with write:memes permission (or full-access key).

Request Body
{ "templateId": "drake", "title": "My Meme", "textFields": ["top text", "bottom text"], "isPublic": true }
Response
{ "success": true, "meme": { "id": 1, "imageUrl": "/meme/1/view" } }
DELETE /v1/memes/:memeId

Delete a meme you own.

Parameters
memeId required
Response
{ "success": true }

people Social

GET /v1/friends

Returns all accepted friendships for the current user.

Response
{ "success": true, "friends": [{ "id": "...", "username": "bob" }] }
POST /v1/friends

Send a friend request to another user.

Request Body
{ "addresseeId": 123 }
Response
{ "success": true, "friendship": { "status": "pending" } }
PUT /v1/friends/respond

Accept or decline a friend request.

Request Body
{ "friendshipId": "...", "action": "accept" }
Response
{ "success": true }
GET /v1/followers

Returns followers of the current user.

Response
{ "success": true, "followers": [{ "username": "..." }], "total": 42 }
POST /v1/follow

Follow another user.

Request Body
{ "followingId": 123 }
Response
{ "success": true }

chat Messages

GET /v1/messages/conversations

Get all conversations for the current user.

Response
{ "success": true, "conversations": [{ "id": "...", "participant": { "username": "bob" }, "lastMessage": "Hey!" }] }
GET /v1/messages/friend/:friendId

Get messages with a specific friend.

Parameters
friendId required
Response
{ "success": true, "messages": [{ "id": "...", "content": "Hello!", "sender_id": "..." }] }
POST /v1/messages/friend/:friendId

Send a direct message to a friend.

Parameters
friendId required
Request Body
{ "content": "Hello!" }
Response
{ "success": true, "message": { "id": "..." } }

workspace_premium Plans

GET /v1/plans

Returns all available subscription plans.

Response
{ "success": true, "plans": [{ "id": "free", "name": "Free", "storage": 5368709120 }] }
GET /v1/subscriptions/current

Returns the authenticated user's active subscription.

Response
{ "success": true, "subscription": { "plan": "free", "storage_used": 0, "storage_limit": 5368709120 } }

forum Wall

GET /wall

Fetch public wall posts.

Parameters
page optional
Response
{ "success": true, "posts": [{ "id": "...", "content": "Hello world", "username": "alice" }] }
POST /wall

Post a public message to the wall. Requires authentication.

Request Body
{ "content": "Hello, world!" }
Response
{ "success": true, "post": { "id": "..." } }