Skip to navigation

Forums

Use the Forums API to publish posts, comment on existing threads, and react to posts inside a Whop community’s forum experience. Forum content is scoped by experience_id, so each forum tile in a community sidebar is a separate experience.

Initialize the SDK

import Whop from "@whop/sdk";
const client = new Whop({
appID: "app_xxxxxxxxxxxxx",
apiKey: process.env.WHOP_API_KEY,
});

Create a post

Posts support Markdown. Optional fields let you pin the post, paywall it, or mark it as a mention.

const post = await client.forumPosts.create({
experience_id: "exp_xxxxxxxxxxxxx",
content: "This is the post body in **Markdown**.",
title: "Optional title for paywalled posts",
pinned: false,
is_mention: false,
paywall_amount: 0, // cents; 500 = $5.00
});

Read posts

List operations auto-paginate.

for await (const page of client.forumPosts.list({
experience_id: "exp_xxxxxxxxxxxxx",
first: 10,
})) {
console.log(page);
}
const post = await client.forumPosts.retrieve("post_xxxxxxxxxxxxx");

Comment on a post

Comments are posts with a parent_id. Fetch them by passing the parent’s ID to list.

const comment = await client.forumPosts.create({
experience_id: "exp_xxxxxxxxxxxxx",
content: "Great post!",
parent_id: "post_xxxxxxxxxxxxx",
});
for await (const page of client.forumPosts.list({
experience_id: "exp_xxxxxxxxxxxxx",
parent_id: "post_xxxxxxxxxxxxx",
first: 10,
})) {
console.log(page);
}

Like a post

Forum reactions are always :heart:. Chat messages accept any emoji, but forum reactions ignore other values.

await client.reactions.create({
resource_id: "post_xxxxxxxxxxxxx",
emoji: ":heart:",
});

Advanced features

Pinned posts

Pinned posts appear above the feed. Set pinned: true on create.

await client.forumPosts.create({
experience_id: "exp_xxxxxxxxxxxxx",
content: "Important announcement!",
pinned: true,
});

Mention users

Use <@username> inline. Mentioned users get notified.

await client.forumPosts.create({
experience_id: "exp_xxxxxxxxxxxxx",
content: "Hey <@username> check this out!",
});

Paywalled posts

paywall_amount is in cents. Readers must pay to see the full content.

await client.forumPosts.create({
experience_id: "exp_xxxxxxxxxxxxx",
title: "Premium post",
content: "Exclusive content here",
paywall_amount: 500, // $5.00
});

Pagination with cursors

Beyond auto-pagination, you can step through pages manually using the cursor returned on each response.

const first = await client.forumPosts.list({
experience_id: "exp_xxxxxxxxxxxxx",
first: 10,
});
const next = await client.forumPosts.list({
experience_id: "exp_xxxxxxxxxxxxx",
first: 10,
before: first.cursor,
});

Required permissions

Add these to your app’s permission list from the Permissions guide before publishing.

PermissionNeeded for
forum:readReading posts and comments
forum:post:createCreating posts and comments
chat:readCreating and reading reactions
{
id: string;
comment_count: number;
content: string | null;
is_edited: boolean;
is_pinned: boolean;
is_poster_admin: boolean;
like_count: number | null;
parent_id: string | null; // null = top-level, set = comment
title: string | null;
view_count: number | null;
user: { id: string; name: string | null; username: string };
}

Full schema: see the Forum posts API reference.

Next steps