Everything the app can do, your code can do too. Use the REST API in your own product, the command line tool in your terminal, or the MCP server to give Claude and Codex your brand voice.
One key works for all three. Calls draw from the same credits as the app, so nothing is billed twice.
Whichever you pick, the name is always reshaper-ai.
# use it inside Claude or Codex
npx reshaper-ai@latest install-mcp
# use it from your terminal
npm install -g reshaper-ai
# start a project built on the API
npm create reshaper-ai@latestMost people want the first one. The second is for scripts and your terminal. The third scaffolds a small app wired to the API, for building a product on Reshaper.
Create a key on your API keys page, then send it as a bearer token. Every endpoint below uses the same header.
curl https://reshaper.ai/api/v1/reshape \
-H "Authorization: Bearer rai_live_..." \
-H "Content-Type: application/json" \
-d '{
"text": "we shipped dark mode today",
"inputType": "Raw Thoughts",
"outputType": "LinkedIn Post"
}'{
"outputType": "LinkedIn Post",
"notes": ["Dark mode shipped today. Here is what it taught us..."],
"creditsSpent": 1,
"creditsRemaining": 47
}Text output always comes back in notes, an array. Some formats return more than one piece from a single call, so treat it as a list.
The MCP server gives an AI assistant 47 Reshaper tools: write a post, generate every format, render a carousel, turn a reel into writing, optimize a YouTube video, read and save to your library, schedule what it writes, and teach it a brand voice from your own documents. It works with your voice and your credits, and it can read files off your machine.
The CLI writes the config for whichever client you pick.
npx reshaper-ai@latest login rai_live_...
npx reshaper-ai@latest install-mcpTalks to the hosted server directly. No local process.
claude mcp add --transport http reshaper https://reshaper.ai/api/mcp \
--header "Authorization: Bearer rai_live_..."Point it at reshaper-ai mcp, which pipes to the same server.
{
"mcpServers": {
"reshaper": {
"command": "npx",
"args": ["-y", "reshaper-ai", "mcp"],
"env": { "RESHAPER_API_KEY": "rai_live_..." }
}
}
}Once it is connected you can just ask: "turn my last YouTube video into a LinkedIn post and a carousel, in my brand voice."
npm install -g reshaper-ai
reshaper-ai login rai_live_...
reshaper-ai reshape "we shipped dark mode today" --out "LinkedIn Post"
reshaper-ai all @notes.md --save
reshaper-ai carousel "5 lessons from 2 years of building" --template black
reshaper-ai youtube https://youtube.com/watch?v=... --thumbnail
reshaper-ai reel ~/Downloads/talk.mp4 --out "LinkedIn Post"Every command that takes text also accepts - for stdin and @file.txt for a file, so it pipes like any other Unix tool. Run reshaper-ai help for the full list.
Anywhere the API wants a photo, video, PDF or document, you can send it three ways, whichever is easiest: an https URL, a data: URI, or raw base64. Generated images always come back as URLs.
The hosted server cannot see your disk, but the local bridge can. Point a tool at a path on your machine and it is read, prepared and sent for you.
You: make a carousel from ~/Downloads/talk.mp4
Claude calls create_carousel with
audio: "/Users/you/Downloads/talk.mp4"
The bridge strips the video, sends the audio,
and you get the finished slide URLs back.A reel is mostly pixels you do not need. The CLI and the MCP bridge strip the video track with ffmpeg and send only the audio, which is all the transcript needs, exactly as the app does in your browser. A long reel becomes a couple of MB.
That needs ffmpeg on your PATH. If you would rather not install it, put the video in Google Drive and send the link as videoUrl instead, and the server fetches it.
# a local video: audio is extracted first
reshaper-ai reel ~/Downloads/talk.mp4 --out "LinkedIn Post"
# no ffmpeg? hand it a Drive link instead
reshaper-ai reel https://drive.google.com/file/d/.../view
# teach a workspace its voice from a brand deck
reshaper-ai clients docs <id> ./brand-guide.pdf
# teach Reshaper YOUR voice from your own writing
reshaper-ai voice add ./post-1.txt
reshaper-ai voice add ./post-2.txt
reshaper-ai voice add ./post-3.txt
reshaper-ai voice analyzeBase URL https://reshaper.ai. Costs are in credits.
| GET | /api/v1/me | Who the key belongs to, plan and balance | Free |
| GET | /api/v1/credits | Credit balance | Free |
| GET | /api/v1/meta | Every valid type, template, cover style and price | Free |
| POST | /api/v1/reshape | Write one post from your source material | 1 to 5 |
| POST | /api/v1/batch | Write every format from one source | 10 |
| POST | /api/v1/carousel | Plan, render and upload a full carousel | 4 |
| POST | /api/v1/linkedin-image | Put a hook line over a photo | 2 |
| POST | /api/v1/reel | Write from a reel or talking-head video | 1 to 3 |
| POST | /api/v1/read-carousel | Write from an existing carousel PDF or slides | 1 to 3 |
| POST | /api/v1/carousel/slide | Re-render one edited slide | Free |
| POST | /api/v1/youtube/optimize | Titles, description, tags, thumbnail | 4 (+5) |
| POST | /api/v1/youtube/thumbnail | Another thumbnail for the same video | 5 |
| GET | /api/v1/youtube/transcript | Fetch a video transcript | Free |
| POST | /api/v1/packaging-research | How an idea is already packaged on YouTube | 3 |
| GET | /api/v1/saved-posts | Your saved content library | Free |
| POST | /api/v1/saved-posts | Save content to your library | Free |
| DELETE | /api/v1/saved-posts/{id} | Delete a saved post | Free |
| GET | /api/v1/ideas | Your idea inbox | Free |
| POST | /api/v1/ideas | Add an idea | Free |
| DELETE | /api/v1/ideas/{id} | Delete an idea | Free |
| GET | /api/v1/clients | Your client workspaces | Free |
| POST | /api/v1/clients | Create a client workspace | Free |
| PATCH | /api/v1/clients/{id} | Rename, recolour or set its brand voice | Free |
| DELETE | /api/v1/clients/{id} | Delete a workspace and its posts | Free |
| POST | /api/v1/clients/{id}/documents | Teach a workspace from a brand document | 0 or 2 |
| GET | /api/v1/clients/{id}/documents | List a workspace's brand documents | Free |
| POST | /api/v1/clients/{id}/logo | Set the logo on its carousel slides | Free |
| GET | /api/v1/voice | Your personal brand voice | Free |
| PATCH | /api/v1/voice | Set your personal brand voice | Free |
| GET | /api/v1/voice/samples | Writing samples the analyzer learns from | Free |
| POST | /api/v1/voice/samples | Add a writing sample (text or document) | Free |
| POST | /api/v1/voice/analyze | Write your brand voice from those samples | 0 then 2 |
| GET | /api/v1/character-mockups | Saved photos of the on-camera subject | Free |
| POST | /api/v1/character-mockups | Save a subject photo for thumbnails | Free |
| GET | /api/v1/buffer | Is Buffer connected, and which channels | Free |
| DELETE | /api/v1/buffer | Disconnect Buffer | Free |
| GET | /api/v1/scheduled-posts | Your posting calendar | Free |
| POST | /api/v1/scheduled-posts | Queue a post on Buffer | Free |
| DELETE | /api/v1/scheduled-posts/{id} | Unschedule (cancels on Buffer too) | Free |
| GET | /api/v1/posting-preferences | Default posting time per platform | Free |
| PUT | /api/v1/posting-preferences | Set a default posting time | Free |
| GET | /api/v1/packaging-research/saves | Research runs you kept | Free |
| POST | /api/v1/packaging-research/saves | Keep a research run | Free |
Call GET /api/v1/meta for the live list of valid input types, output types, carousel templates, cover style ids and prices. It needs no key, so you can load it at build time.
Write a post and queue it, in one go. Scheduling runs through Buffer and costs no credits — you are only placing text you already generated.
Buffer's sign-in is an OAuth redirect that needs a person to approve it, so an API key cannot stand in for that one step. Connect it at reshaper.ai/app. Everything after that works from here.
GET /api/v1/buffer tells you whether it is connected and lists the channels you can post to. Always take channelId from there rather than guessing one.
# 1. find a channel
curl https://reshaper.ai/api/v1/buffer \
-H "Authorization: Bearer rai_live_..."
# 2. queue the post
curl https://reshaper.ai/api/v1/scheduled-posts \
-H "Authorization: Bearer rai_live_..." \
-H "Content-Type: application/json" \
-d '{
"text": "Dark mode shipped today...",
"channelId": "5f2b...",
"dueAt": "2026-09-20T09:00:00Z"
}'
# or from the CLI
reshaper-ai schedule channels
reshaper-ai schedule add @post.txt --channel 5f2b... --at 2026-09-20T09:00:00ZdueAt is an ISO timestamp. Send it in UTC or with an offset, like 2026-09-20T09:00:00Z. A bare local time is ambiguous and gets read as UTC, which is rarely what anyone meant.
In Claude this becomes one sentence: "turn this into a LinkedIn post and schedule it for Tuesday at 9am." It checks your channels, resolves the time, writes the post and queues it.
const res = await fetch("https://reshaper.ai/api/v1/reshape", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.RESHAPER_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
text: transcript,
inputType: "YouTube Video",
outputType: "LinkedIn Post",
clientId: acmeWorkspaceId, // optional: use that client's voice
}),
});
const { notes, creditsRemaining } = await res.json();Pass a clientId from GET /api/v1/clients to write in that workspace's brand voice. Leave it out and your own personal voice is used instead.
Credits are charged before generation and returned automatically if it fails. In a batch, only the formats that worked are charged.
Every error is JSON with an error message, and often a code you can branch on.
OUT_OF_CREDITS)PLAN_LIMIT)A single post usually lands in under 20 seconds. Carousels, batches and thumbnails involve image work and can take up to a minute, so set a generous timeout.
A key can spend your credits and read your library, so keep it server side. If one leaks, revoke it on the API keys page and create another. Revoking takes effect immediately.
Create a key, then pick your path: REST for your product, the CLI for your terminal, MCP for Claude and Codex.
Get your API key