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" );
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
});
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.
Permission Needed 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.