Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.whop.com/llms.txt

Use this file to discover all available pages before exploring further.

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

Build a chat bot

Pair forum posts with live chat messages in the same community.

Listen to events with webhooks

React to forum posts and comments in realtime on your server.

Send notifications

Push users back to your forum when there’s something new.

Upload files

Attach images and videos to posts.