Public API · with AI built in

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.

It generates the content

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.

ai plans · node
// 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);
generated· draft publications, ready to edit

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.

Authentication

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.

get token
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
200 OK· access_token · expires_in

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.

First call

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.

node
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"),
});
MCP server

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 Code
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

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

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.

Getting started

How to get started

From zero to your first authenticated call.

  1. Create an app

    From your client dashboard, give your app a name and activate it. On every plan, the free one included.

  2. Get your credentials

    A client identifier and a secret, which you can rotate whenever you want from the dashboard.

  3. Authenticate

    Request your access token with the client-credentials flow. With the Node library you do not even have to.

  4. Explore the API

    Browse the interactive documentation and check every available endpoint.

Reference

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

The complete OpenAPI, to generate your own client →
MethodEndpointWhat for
POST/clients/{id_client}/appsCreate an app inside your client account.
GET/clients/{id_client}/apps/{id_app}/secretRetrieve the app secret so you can authenticate.
GET/organizations/{id_organization}/accountsList an organization's connected accounts and their status.
GET/organizations/{id_organization}/connect_linksGenerate the links your users follow to connect their networks without leaving your product.
POST/organizations/{id_organization}/uploadsUpload the image or video before publishing it.
POST/organizations/{id_organization}/accounts/{id_account}/publishPublish or schedule on a specific account.
GET/organizations/{id_organization}/publishCheck the organization's publications and what state they are in.
GET/organizations/{id_organization}/publish/{id_publication}/metricsMetrics for one specific publication.
GET/organizations/{id_organization}/accounts/{id_account}/metricsAccount metrics.
GET/organizations/{id_organization}/limitsPlan usage and limits at that moment.
Webhooks

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.

new_account

A user has just connected a new account.

change_state_account

An account changed state: it was reconnected, its token expired or it is no longer available.

messages

A direct message came into a connected account.

comments

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 protection
Documentation

The 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.