The API that also writes the content
Publish to the major social networks, sync analytics and receive real-time events with the same API our dashboard uses. And when you don't bring the content, it generates it: copy and images, a whole week per plan.
npm i planvortexThe official Node client: typed, with retries and webhook verification. Reference →pip install planvortexThe official Python client: sync and async, typed, the same API. Reference →npx -y planvortex-mcpThe official MCP server: your AI assistant posts, reads the comments and answers the messages. Reference →The API is on all four plans, free included: 1 app on Free, 2 on Basic, 5 on Pro and 10 on Custom, with a per-minute request limit that follows the plan.
Other APIs deliver the post.
This one writes it
Send a topic (or your own photos, an article or the real catalogue of a connected store or account) and PlanVortex returns the week split by network: the copy written, the images generated and every post in its slot, as drafts your product edits with the usual publication endpoints.
// 1. Encola el plan: devuelve el presupuesto, todavia no el contenido const { ai_plan } = await pv.aiPlans.create(client, org, { prompt: "Pan de masa madre, horno de leña, barrio", accounts: [instagram, linkedin], template: "from_images", // tus fotos: no gasta creditos de imagen source: { images }, }); // 2. Genera un job aparte: se sondea mientras siga pending o generating let plan = await pv.aiPlans.get(client, org, ai_plan._id); // 3. Validar pasa los borradores a listos, y ya publica el flujo de siempre await pv.aiPlans.validate(client, org, plan._id);
Mind the cycle: creating does not generate. It returns the plan as pending with its estimate, a separate job does the generation and it can take minutes, so you poll until generated. Validating is what turns the drafts into ready posts.
Five sources, not just a prompt
A plan can come from a topic, from photos your user uploads, from a pasted article or its URL, from a countdown to a date, or from the real catalogue of a connected WooCommerce store or account. The two that don't invent the image cost 91 % less: the same week is 519 credits with generated images and 48 with the user's own photos.
You know the price before generating
The cost is computed by the server, never by the model, and creating the plan returns it in the estimate. If the unavoidable part doesn't fit in the available credits, the whole plan is rejected with error 941 rather than half generated.
Or bring your own key
Configure your provider and model per scope (orchestrator, text, image) and that scope stops consuming credits. The key travels encrypted and is write-only: the API returns the provider and the model, never the key.
AI credits start on the Basic plan. The free one has zero, so these routes answer 941 until credits are contracted.
Client credentials, no user session
Every app you create has its own client identifier and secret. You request a token through the client credentials flow against our own endpoint (the same domain as the rest of the API) and start calling: no cookies, no user in the middle and no renewing OAuth network by network.
curl -X POST "https://api.planvortex.com/v1.0.0/oauth/token" \ -d grant_type=client_credentials \ -d client_id=$APP_CLIENT_ID \ -d client_secret=$APP_SECRET
Tokens expire. Careful: expiry does NOT arrive as a 401, it arrives as a 400 with code 501 or 522 in the body. Request a new one with the same call.
With the Node library you never write this call: it makes it for you, caches the token and renews it before it expires.
Publish in a handful of lines
Pick the account and the target network, send the text and any files you uploaded beforehand, and PlanVortex takes care of the rest. Add a publish date and it gets scheduled instead of going out right away. From Node, the official library brings the types and handles the token, the retries and the multipart.
import { PlanVortex } from "planvortex"; const pv = new PlanVortex({ clientId, clientSecret }); const upload = await pv.uploads.create(org, { file: "./hogaza.jpg" }); const post = await pv.publications.create(org, account, { social_network: "instagram", text: "Nuevo horno, nuevas hogazas", files: [upload._id], publish_date: new Date("2026-09-01T10:00:00Z"), });
Your AI assistant, connected to your accounts
The official MCP server puts the whole API within reach of Claude Desktop, Claude Code, Cursor or VS Code: twenty-eight tools to schedule posts, read the comment inbox, answer the direct messages of the networks that have them and ask our AI to write the week. It starts with your credentials, on your machine, and whoever uses it writes no code at all.
claude mcp add planvortex \ --env PLANVORTEX_CLIENT_ID=... \ --env PLANVORTEX_CLIENT_SECRET=... \ -- npx -y planvortex-mcp
Claude Desktop, Cursor and VS Code take the same block in their MCP server file. And if you have no Node, every version ships an .mcpb bundle that installs with a double click.
Guide: posting from your AI assistant with MCP →Twenty-eight tools
Nineteen that read and nine that write, plus three prompts and four resources carrying each network's limits and capabilities. The differences between networks travel as data, so the model never has to guess what a given one allows.
And the AI, with the switch in your hand
The planner is here too: your assistant reads the templates with what each one costs and proposes the week. Generating it spends credits, so that tool (and only that one) is switched on by you with a line in the configuration; with it off it is not even in the list. What comes out are drafts: scheduling them is still yours.
It deletes nothing
No tool deletes a post, an account or a comment, and it is not a switch you can turn on: the code is not there. The server reads text written by strangers while the model can publish under your name, so the worst possible case has to be something you can see and undo.
It runs on your machine
The client_secret lives in the process your AI client starts, never on a server of ours. And if you would rather host it yourself, --http mode ships its Dockerfile, listens on localhost only and demands a token to bind anywhere else.
Who it's for
Built for anyone already building their own product who wants social media to live inside it.
Agencies
Centralize client management in your own internal dashboard, without them ever logging into PlanVortex.
Platforms & SaaS
Add social media publishing and analytics to your product without building them from scratch.
Product teams
Connect PlanVortex to your internal stack: BI, CRM, automations.
Use cases
What you can already automate today with the API. The first one is not done by any other publishing API we have profiled.
Generate the content
Ask for a week of posts from a topic, some photos or a catalogue, and get it back as drafts your product edits before publishing.
Publish and schedule
Create, schedule and publish content to connected accounts, by code.
Sync analytics
Bring every account's and post's metrics into your own dashboard.
Comments and messages
Read the comment inbox and the conversations of the connected accounts, and reply from inside your own product.
Real-time webhooks
Get notified instantly when accounts, messages or posts change, no polling needed.
Embedded connection
Let your users connect their social accounts without leaving your product.
How to get started
From zero to your first authenticated call.
Create an app
From your client dashboard, give your app a name and activate it. On every plan, the free one included.
Get your credentials
A client identifier and a secret, which you can rotate whenever you want from the dashboard.
Authenticate
Request your access token with the client-credentials flow. With the Node library you do not even have to.
Explore the API
Browse the interactive documentation and check every available endpoint.
The endpoints you'll use on day one
They all hang off the same base URL and authenticate with the Authorization: Bearer header. The full reference, with every parameter and sample responses, lives in the documentation.
Base URLhttps://api.planvortex.com/v1.0.0
| Method | Endpoint | What for |
|---|---|---|
| POST | /clients/{id_client}/apps | Create an app inside your client account. |
| GET | /clients/{id_client}/apps/{id_app}/secret | Retrieve the app secret so you can authenticate. |
| GET | /organizations/{id_organization}/accounts | List an organization's connected accounts and their status. |
| GET | /organizations/{id_organization}/connect_links | Generate the links your users follow to connect their networks without leaving your product. |
| POST | /organizations/{id_organization}/uploads | Upload the image or video before publishing it. |
| POST | /organizations/{id_organization}/accounts/{id_account}/publish | Publish or schedule on a specific account. |
| GET | /organizations/{id_organization}/publish | Check the organization's publications and what state they are in. |
| GET | /organizations/{id_organization}/publish/{id_publication}/metrics | Metrics for one specific publication. |
| GET | /organizations/{id_organization}/accounts/{id_account}/metrics | Account metrics. |
| GET | /organizations/{id_organization}/limits | Plan usage and limits at that moment. |
Events we send you
You set a URL on your app and PlanVortex POSTs to it whenever something happens on the connected accounts. Every delivery is signed with the app secret so you can check it really came from us.
A user has just connected a new account.
An account changed state: it was reconnected, its token expired or it is no longer available.
A direct message came into a connected account.
Someone commented on one of your posts, or left a review on your Google listing.
Versioning
The version is part of the path. While it stays there, whatever works for you today keeps working the same way.
Webhook signature
Every POST carries the x-hub-signature and x-hub-signature-256 headers, computed with your app secret. Verify them before processing the body.
Interactive documentation
OpenAPI reference by area (accounts, publications, uploads, organizations, roles and AI plans) with every parameter and its sample response.
Invoiced in euros, Spanish company
Prices are in euros and the invoice comes from a Spanish company with Spanish VAT; with a valid EU VAT number, the reverse charge applies. The service runs on our own servers in the EU and the data processing agreement downloads with no form.
See trust and data protectionThe whole API, documented
Every endpoint with its parameters, its example responses and the request ready to copy in cURL, JavaScript and Python. Readable in full without an account.