Introduction
OmniPost is one API to publish content to Instagram, TikTok, X, and Threads. Send a single request with a caption, media, and a list of target platforms — OmniPost handles the platform-specific OAuth, media containers, upload chunking, and polling for you.
Who it's for
OmniPost is built for teams shipping a product that needs to publish content to social platforms on behalf of their own end users: social media management tools, creator platforms, e-commerce apps with a "share to Instagram" button, marketing automation products, and internal content pipelines. Instead of building and maintaining four separate platform integrations — each with its own OAuth server, upload flow, media constraints, and rate limits — you integrate with OmniPost once.
You still need your own developer app registered with each platform you want to publish to in production (a Meta app for Instagram and Threads, a TikTok developer app, an X developer app), because OmniPost publishes using yourapp's credentials and your end users' connected accounts. See Connecting Accounts for how that works, and Sandbox Mode for how to build and test your integration before any of those app reviews are approved.
Core concepts
A workspace owns your API keys, connected social accounts, posts, and webhook endpoints. Everything in this API is scoped to the workspace that owns the API key used to authenticate the request.
Every key is prefixed op_live_ or op_sandbox_. Live keys publish to real platforms. Sandbox keys return deterministic mock responses — no real platform calls are made.
Sandbox mode lets you integrate the full publish → status → webhook lifecycle without any real Meta, TikTok, or X developer credentials, so app review turnaround time never blocks your own launch.
A post is the caption and media you submitted. It fans out into one target per platform, each with its own status, published URL, and error state.
The posts / targets model
A single call to POST /v1/upload can publish to multiple platforms at once. OmniPost creates one post record and one targetper requested platform. Each target progresses through its own state independently — a post to Instagram and X can succeed while a target to TikTok fails, and the parent post's status reflects that (partial).
pending— accepted, queued for processing.processing— OmniPost is uploading media and/or calling the platform's publish endpoint.published— live on the platform;external_urlis set.failed— seeerror_code/error_messageon the target.
Base URL
All examples in these docs use the hosted API. If you're running OmniPost self-hosted, the same routes are mounted under {APP_URL}/api/v1.
https://api.omnipost.dev/v1A first request
Every request is authenticated with a bearer token and returns JSON. Here's GET /v1/accounts against a sandbox key — it returns instantly, with no platform credentials required.
curl https://api.omnipost.dev/v1/accounts \
-H "Authorization: Bearer op_sandbox_51H8x9K2mZqP7vNtR3wYbL6cJdXsAeUf"Start in sandbox
You don't need a Meta, TikTok, or X developer app to start building. Generate a sandbox key and follow the Quickstart to publish your first mock post in under five minutes.