reelport.io talks to other tools in five ways: webhooks that tell your tools what happened, media sources that bring files in, RSS feeds that turn articles into posts, the API and MCP server for scripts and AI agents, and ready-made apps for Zapier, Make, n8n and a browser extension. Everything here is per team, under Integrations in the app.
Webhooks
A webhook sends a signed JSON POST to your https endpoint whenever something happens in the team.
Add one under Integrations › Webhooks › Add webhook (owners and admins), or through the API
(POST /v1/webhooks, see API and MCP).
| Event | When |
|---|---|
post.scheduled |
A post was scheduled, or moved to another time |
post.published |
A post went out on every channel |
post.failed |
A post failed on at least one channel (data.post.status is failed or partial) |
post.pending_approval |
A post was sent for approval (team workflow; data.post.approval has the state and history) |
post.approved |
A post waiting for approval was approved (team workflow; data.post.approval has the state and history) |
post.changes_requested |
An approver asked for changes to a post (team workflow; data.post.approval has the state and history) |
post.rejected |
A post waiting for approval was rejected (team workflow; data.post.approval has the state and history) |
target.published |
A post went live on one channel (with its link) |
account.reconnect_required |
A channel has to be connected again |
media.uploaded |
A video or photo was added to the library |
target.reminded |
A channel set to “remind me” is due: someone has to post it by hand now |
comment.received |
A new comment from someone else arrived in Community (not the backlog of a first sync) |
Every request looks like this:
POST /your/endpoint
Content-Type: application/json
X-Reelport-Event: post.published
X-Reelport-Delivery: 019a6a1e-… (unique per delivery: use it to ignore duplicates)
X-Reelport-Signature: sha256=5d41402abc… (HMAC-SHA256 of the raw body, keyed with the secret)
{"id": "019a6a1d-…", "event": "post.published", "created_at": "2026-11-14T18:00:04+00:00",
"team_id": "019a5f2e-…", "data": {"post": { …the same shape as GET /v1/posts/{id}, plus "media": [ …each media item in posting order… ] }}}
- Check the signature on the raw body before you parse it. In PHP:
hash_equals('sha256='.hash_hmac('sha256', $body, $secret), $header). In Node:'sha256=' + crypto.createHmac('sha256', secret).update(body).digest('hex'). - The secret (
whsec_…) is shown once when the webhook is created. New signing secret replaces it; the old one stops working at once. - Answer with any 2xx within 15 seconds. Anything else is retried after 1 minute, 5 minutes, 30 minutes, 2 hours and 6 hours (six tries in all). Redirects are not followed.
- 410 Gone unsubscribes the webhook (how Zapier says a Zap was deleted).
- After 25 failed deliveries in a row the webhook is switched off and says why. Fix the endpoint, then switch it on again.
- Delivery log: open a webhook to see the last 100 deliveries with payload, response and error, send one again (Redeliver) or send a test event. Logs are kept for 30 days.
- Only public https addresses are called, never private networks.
Media sources
Under Videos, next to the upload area:
- Import from link: any public https link to an MP4, MOV, JPEG, PNG or WebP. A link to a web
page imports the page's main video or image (its
og:videoorog:image). The same limits as an upload apply (1 GB, 10 minutes, your plan's storage). - Google Drive, Dropbox and Canva appear once reelport.io has their credentials (below). Google Drive and Dropbox open their own file pickers; Canva lists your designs and exports the one you pick (video designs as 1080p MP4, others as a PNG of the first page). Connect Canva once per team under Integrations › Media sources.
RSS feeds
Feeds is a reader for blogs and sites. Add a feed by its RSS or Atom address, import many at once from an OPML file (the export of any feed reader), or pick from Explore feeds. Group feeds into collections.
- Create post makes a draft with the item's image, its title and its link as the caption, and opens it. Items without an image need a video or photo from you.
- Save as idea puts the item on the ideas board (Create › Ideas, Unassigned) with its title, excerpt and link, and keeps it under Saved.
- Automation (a feed's ··· menu): new items can become drafts by themselves, or go into the queue at the next free slot for the Instagram and Facebook channels you choose (feeds bring photos, which TikTok and YouTube don't take). Feeds are checked about every 30 minutes; adding a feed never turns its existing items into posts.
Zapier, Make and n8n
All three sign in with an API token (Settings › API tokens) and use the same REST hooks:
they subscribe with POST /v1/webhooks when a Zap or scenario is switched on and unsubscribe with
DELETE /v1/webhooks/{id} when it is switched off.
- Triggers: post published, post failed, post scheduled, post live on a channel, channel needs reconnecting, new media.
- Actions: create a post (draft, scheduled or next free slot), upload media from a URL, find posts.
- The apps live in the repository under
integrations/zapier,integrations/makeandintegrations/n8n, each with a README on how to publish it.
Without the apps: Webhooks by Zapier (Catch Hook), Make's Custom webhook or n8n's Webhook node can receive reelport.io webhooks directly, and their HTTP modules can call the API.
AI agents (MCP)
reelport.io runs an MCP server at https://reelport.io/mcp (Streamable HTTP, Authorization: Bearer rp_…). Settings › Connect your agent has copyable setups for Claude Code, Claude
Desktop, the OpenAI Responses API, Cursor, n8n and Raycast. Tools: list channels and media, next
slots, schedule, list, update, cancel and delete posts, import media from a link.
Browser extension
Share to reelport for Chrome: on any page, the toolbar button (or right-click on an image or
video) imports the page's main image or video, or the one you clicked, and saves a draft with the
page title and link. It signs in with a code, like the Reelport plugin. Source and build steps:
integrations/browser-extension.
Setup for the owner: credentials
Nothing below is required; each source stays hidden until its keys are set in .env.
| Source | Where | .env |
|---|---|---|
| Google Drive | Google Cloud Console, the project of the existing web OAuth client: enable the Google Picker API and Google Drive API; create an API key restricted to the Picker API and the app.reelport.io referrer; add https://app.reelport.io to the OAuth client's JavaScript origins; add the drive.file scope to the consent screen (non-sensitive). The project number is the App ID. |
GOOGLE_PICKER_API_KEY, GOOGLE_PICKER_APP_ID, optionally GOOGLE_PICKER_CLIENT_ID (defaults to GOOGLE_CLIENT_ID) |
| Dropbox | dropbox.com/developers › Create app (Scoped access, App folder is enough); under Chooser / Saver / Embedder domains add app.reelport.io. |
DROPBOX_APP_KEY |
| Canva | canva.dev › Your integrations › Create (Public integration; Canva reviews it before other Canva users can connect). Scopes design:meta:read, design:content:read, profile:read; redirect URL https://app.reelport.io/integrations/canva/callback. |
CANVA_CLIENT_ID, CANVA_CLIENT_SECRET |
Also make sure the Horizon supervisor integrations runs (it is in config/horizon.php; imports
and feeds use the integrations queue) and the scheduler runs feeds:poll.