Build with Reshaper

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.

Three ways in, one name

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@latest

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

Quick start

Create a key on your API keys page, then send it as a bearer token. Every endpoint below uses the same header.

Request
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"
  }'
Response
{
  "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.

Inside Claude and Codex

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 easy way

The CLI writes the config for whichever client you pick.

npx reshaper-ai@latest login rai_live_...
npx reshaper-ai@latest install-mcp

Claude Code

Talks to the hosted server directly. No local process.

claude mcp add --transport http reshaper https://reshaper.ai/api/mcp \
  --header "Authorization: Bearer rai_live_..."

Claude Desktop, Codex, or any stdio client

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

From your terminal

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.

Sending files

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.

In Claude and Codex, just name the file

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.

Video never uploads whole

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 analyze

Endpoints

Base URL https://reshaper.ai. Costs are in credits.

GET/api/v1/meWho the key belongs to, plan and balanceFree
GET/api/v1/creditsCredit balanceFree
GET/api/v1/metaEvery valid type, template, cover style and priceFree
POST/api/v1/reshapeWrite one post from your source material1 to 5
POST/api/v1/batchWrite every format from one source10
POST/api/v1/carouselPlan, render and upload a full carousel4
POST/api/v1/linkedin-imagePut a hook line over a photo2
POST/api/v1/reelWrite from a reel or talking-head video1 to 3
POST/api/v1/read-carouselWrite from an existing carousel PDF or slides1 to 3
POST/api/v1/carousel/slideRe-render one edited slideFree
POST/api/v1/youtube/optimizeTitles, description, tags, thumbnail4 (+5)
POST/api/v1/youtube/thumbnailAnother thumbnail for the same video5
GET/api/v1/youtube/transcriptFetch a video transcriptFree
POST/api/v1/packaging-researchHow an idea is already packaged on YouTube3
GET/api/v1/saved-postsYour saved content libraryFree
POST/api/v1/saved-postsSave content to your libraryFree
DELETE/api/v1/saved-posts/{id}Delete a saved postFree
GET/api/v1/ideasYour idea inboxFree
POST/api/v1/ideasAdd an ideaFree
DELETE/api/v1/ideas/{id}Delete an ideaFree
GET/api/v1/clientsYour client workspacesFree
POST/api/v1/clientsCreate a client workspaceFree
PATCH/api/v1/clients/{id}Rename, recolour or set its brand voiceFree
DELETE/api/v1/clients/{id}Delete a workspace and its postsFree
POST/api/v1/clients/{id}/documentsTeach a workspace from a brand document0 or 2
GET/api/v1/clients/{id}/documentsList a workspace's brand documentsFree
POST/api/v1/clients/{id}/logoSet the logo on its carousel slidesFree
GET/api/v1/voiceYour personal brand voiceFree
PATCH/api/v1/voiceSet your personal brand voiceFree
GET/api/v1/voice/samplesWriting samples the analyzer learns fromFree
POST/api/v1/voice/samplesAdd a writing sample (text or document)Free
POST/api/v1/voice/analyzeWrite your brand voice from those samples0 then 2
GET/api/v1/character-mockupsSaved photos of the on-camera subjectFree
POST/api/v1/character-mockupsSave a subject photo for thumbnailsFree
GET/api/v1/bufferIs Buffer connected, and which channelsFree
DELETE/api/v1/bufferDisconnect BufferFree
GET/api/v1/scheduled-postsYour posting calendarFree
POST/api/v1/scheduled-postsQueue a post on BufferFree
DELETE/api/v1/scheduled-posts/{id}Unschedule (cancels on Buffer too)Free
GET/api/v1/posting-preferencesDefault posting time per platformFree
PUT/api/v1/posting-preferencesSet a default posting timeFree
GET/api/v1/packaging-research/savesResearch runs you keptFree
POST/api/v1/packaging-research/savesKeep a research runFree

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.

Scheduling

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.

Connect Buffer once, in the browser

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.

Schedule a post
# 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:00Z

Times need a zone

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

In your own product

JavaScript
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 and errors

Failed calls are refunded

Credits are charged before generation and returned automatically if it fails. In a batch, only the formats that worked are charged.

Errors look the same everywhere

Every error is JSON with an error message, and often a code you can branch on.

401 — missing, invalid or revoked key
402 — out of credits (code OUT_OF_CREDITS)
403 — your plan does not include this (code PLAN_LIMIT)
400 — something in the request body is wrong; the message says what

Generation takes time

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.

Keep your key private

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.

Ready to build

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