Reelspan posts to a forum in your Whop company through the Whop API, with a company API key. Videos and photos are uploaded to Whop and attached to the post.
What you can post
| Post | How it appears |
|---|---|
| Text | A forum post |
| Photos | A forum post with up to 10 photos attached. photos[] can mix photos and videos |
| Video | A forum post with the video attached |
The post's text is whop_title, else title, the same as the caption on every network. A separate post title is optional: send it as whop_post_title.
Whop's API doesn't return a link to the post, so url is null; post_id is the post's id.
Connect a forum
You need a company API key and the forum. Setup takes about two minutes.
- In your Whop dashboard, open Developer and create a Company API key with the
forum:read,forum:post:createand file permissions. - Open the forum and copy its experience id (
exp_…) from the address bar. - For the company's public forum instead, leave the forum empty and use the company id (
biz_…). - In the Reelspan dashboard, open Accounts → Connect account, choose the profile and Whop, and enter the key with the forum or the company id.
Reelspan checks the key against the forum before saving it, encrypted.
With the API
curl -X POST https://api.reelspan.com/v1/accounts/whop \
-H "Authorization: Bearer $REELSPAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{"profile_username": "my-brand", "api_key": "...", "forum": "exp_XXXXXXXX"}'import { Reelspan } from 'reelspan';
const reelspan = new Reelspan();
await reelspan.accounts.connect('my-brand', 'whop', {
api_key: process.env.WHOP_API_KEY,
forum: 'exp_XXXXXXXX',
});import os
from reelspan import Reelspan
reelspan = Reelspan()
reelspan.accounts.connect("my-brand", "whop", api_key=os.environ["WHOP_API_KEY"], forum="exp_XXXXXXXX")For the company's public forum, send company_id instead of forum:
{ "profile_username": "my-brand", "api_key": "...", "company_id": "biz_XXXXXXXX" }{ "success": true, "platform": "whop", "account": "Announcements", "reconnected": false }account is the forum's name, or "Public forum".
| Field | Required | Also accepted (Upload-Post) |
|---|---|---|
api_key |
Yes | The same name |
forum |
For a forum: its experience id (exp_…) |
experience_id |
company_id |
For the public forum: the company id (biz_…) |
Connecting again replaces the Whop account on that profile. See Connect with credentials.
Example post
A pinned post with a title and a video:
curl -X POST https://api.reelspan.com/v1/posts/video \
-H "Authorization: Bearer $REELSPAN_API_KEY" \
-F "user=my-brand" \
-F "platform[]=whop" \
-F "title=This week's lesson: pricing your first offer. Watch it, then post your price below." \
-F "whop_post_title=Lesson 4: pricing" \
-F "whop_pinned=true" \
-F "[email protected]"import { Reelspan } from 'reelspan';
import { readFile } from 'node:fs/promises';
const reelspan = new Reelspan();
const post = await reelspan.posts.video({
user: 'my-brand',
platforms: ['whop'],
title: "This week's lesson: pricing your first offer. Watch it, then post your price below.",
video: { data: await readFile('lesson.mp4'), name: 'lesson.mp4', type: 'video/mp4' },
extra: { whop_post_title: 'Lesson 4: pricing', whop_pinned: 'true' },
});from reelspan import Reelspan
reelspan = Reelspan()
post = reelspan.posts.video(
"my-brand", ["whop"], "lesson.mp4",
"This week's lesson: pricing your first offer. Watch it, then post your price below.",
extra={"whop_post_title": "Lesson 4: pricing", "whop_pinned": "true"},
)Fields
| Field | Meaning |
|---|---|
whop_title |
The post's text on Whop. Falls back to title. |
title |
The caption every network uses, when whop_title isn't sent. |
whop_post_title |
The post's title, shown above the text. Optional. |
whop_pinned |
true pins the post to the top of the forum. Default false. |
On Upload-Post,
whop_titleis the post's title. On Reelspan it is the post's text, as{network}_titleis on every network; the title iswhop_post_title.
In the dashboard composer, the Whop tab has Title and Pin to the top of the forum. A first_comment isn't posted on Whop; the result says "first_comment": "unsupported" with a warning.
Limits and behaviour
- Files: up to 2 GB each, uploaded to Whop as public files. Reelspan waits up to about a minute for Whop to process each one, then fails with
processing_timeout, which is retried. - Attachments: up to 10 photos per post; any more are dropped.
- No link: the result has no
url; find the post in the forum.
Common errors
| Code | When | Fix |
|---|---|---|
INVALID_COMPANY |
Connecting: the company id doesn't start with biz_ |
Copy it from the Whop dashboard → Settings → Developer. |
INVALID_FORUM |
Connecting: the forum isn't an exp_… id, or it's empty with no company id |
Send the forum's exp_… id, or a company_id for the public forum. |
INVALID_TOKEN |
Connecting: Whop didn't accept the key for that forum or company | Give the key forum:read and forum:post:create, and check it belongs to that company. |
reauth_required |
Whop answered 401 or 403: the key was revoked or lost a permission | Fix the key and connect again. |
processing_timeout |
Whop took too long to process a file | Reelspan retries; if it keeps failing, try a smaller file. |
file_too_large |
A file is over 2 GB | Send a smaller file. |
whop_error |
Whop refused the post or a file. Retried automatically on 429 and 5xx | Read error for Whop's reason. |
MISSING_FIELD |
Connecting without api_key |
Send it. |
Errors when connecting come back as a 400 with the code in error_code. Errors when posting are in that network's result. See Errors.