OriginShorts MCP Server REST API Get a key

OriginShorts MCP Server

Connect Claude, ChatGPT, Cursor or any MCP client to OriginShorts and make, edit and post faceless short-form videos from a conversation. Script, visuals, narration, captions and music, rendered to a finished MP4.

Endpoint
originshorts.com/mcp
Transport
Streamable HTTP
Auth
OAuth 2.1, or Bearer API key

Connecting

Two ways in. Marketplace clients use OAuth and need nothing from you but a login; everything else can carry an API key directly.

With OAuth

In ChatGPT, Claude or any client that supports remote MCP servers, add https://originshorts.com/mcp as a connector and approve the consent screen. The server registers clients dynamically, so there is no key to paste and nothing to configure.

Discovery and endpoints, if your client asks for them explicitly:

PurposeURL
Authorization server metadata/.well-known/oauth-authorization-server
Protected resource metadata/.well-known/oauth-protected-resource
Authorize/oauth/authorize
Token/oauth/token
Dynamic client registration/oauth/register
Scopevideos

With an API key

Create a key on your account page and send it as a bearer token. Keys start with os_live_ and carry the permissions of the account that made them.

Authorization: Bearer os_live_YOUR_KEY

Treat a key like a password: it can spend your credits. Keep it out of shared configs and source control.

Client configuration

Copy the block for your client. Replace os_live_YOUR_KEY with your own key, or drop the header entirely if you are connecting over OAuth.

Claude Code

claude mcp add originshorts --transport http https://originshorts.com/mcp \
  --header "Authorization: Bearer os_live_YOUR_KEY"

Claude (web and desktop app)

Customize → Connectors → + Add → Add custom connector. Name it OriginShorts, paste https://originshorts.com/mcp, and sign in when asked (OAuth). No key required. On Team and Enterprise plans, an owner adds it first under Organization settings → Connectors.

Cursor

In ~/.cursor/mcp.json, or .cursor/mcp.json in a project:

{
  "mcpServers": {
    "originshorts": {
      "url": "https://originshorts.com/mcp",
      "headers": {
        "Authorization": "Bearer os_live_YOUR_KEY"
      }
    }
  }
}

ChatGPT

Turn on Developer mode (Settings → Apps & Connectors → Advanced settings), then create a connector pointing at https://originshorts.com/mcp with OAuth and approve the sign-in screen. No key required. Needs a paid ChatGPT plan; on Business and Enterprise workspaces, an admin enables custom connectors first.

Workflow

Generation is asynchronous. One call starts it, then you poll. A video usually takes one to three minutes, a few more when animated.

  1. Create

    Call create_video with a topic (we write the script) or a script of your own. It returns a video id straight away.

  2. Wait

    Call get_video_status. It waits on our side for up to about 40 seconds and returns the moment the video is done, so an assistant just calls it again until it is. No pauses between calls. Status moves queued → processing → rendering → completed, with a plain-language stage and percent along the way.

  3. Download

    On completion the response carries a download_url for the MP4. It is valid for one hour. Poll again for a fresh link.

If generation fails, the status becomes failed and its credits are refunded automatically. If only the MP4 render fails, the status is also failed, with failed_at: render: renders are free, so there is nothing to refund, and render_video tries again.

Free accounts: videos carry a small "Made with OriginShorts" mark and end with a 3.5-second OriginShorts outro.

Tools

Twenty-eight tools: six to make and track videos, seventeen to look at and edit them, five to post them. Every response is JSON except view_video, which returns the image itself; errors come back as readable text with the reason and what to do about it.

create_videowrites100+ credits

Starts a video. Provide exactly one of topic or script. Returns an id immediately. An identical retry a few seconds or minutes later normally returns the same video without a second charge (identical requests are matched within five-minute clock windows, so a retry that crosses one can make a second video). The parameters below are the complete list: videos render 9:16 with the default captions.

ParameterTypeNotes
topicstringIdea to write the script from. 3 to 1200 characters. one of topic | script
scriptstringYour narration, used verbatim. At least 10 and at most 1,200 characters. one of topic | script
duration_rangeenumTarget length in seconds. required
voicestringVoice id from list_voices. Voices marked premium add 30 credits. Free accounts use the voices with requires_plan false.
voice_instructionsstringHow the voice reads it: tone, accent, emotion, pace. Voices with supports_direction only. Max 300 characters.
art_styleenumA preset look for the images. Presets are preferred: they keep the style consistent from scene to scene.
custom_art_stylestringYour own look in up to 60 characters, instead of art_style. Best kept for when a specific look is asked for.
image_qualityenumbasic or pro. Pro adds 30 credits.
animatedbooleanAnimate the scenes as part of generation: every scene, up to 25 scenes or 150 seconds (a few minutes longer). Charged upfront; the animation part is refunded if most scenes fail.
animation_qualityenumWith animated: basic (default) or pro, 3 or 12 credits per estimated second of animation: the narration estimate plus about half a second per scene, plus 15%, capped at 450 / 1,800 credits. The reply's credits_charged is exact.
stylestringContent style preset id from get_video_options.
background_musicstringauto (default) matches music to the script; none leaves it silent; or a track id from list_music.
music_volumenumber0.05 to 1 (default 0.1).
get_video_statusread only

Waits for one video by id, and for any queued edits or render: returns as soon as there is nothing left to wait for, or after about 40 seconds with its current stage and percent (call again right away). Once complete, it includes view_url (watch in a browser) and download_url (save the MP4). Sends MCP progress notifications while it waits, and never starts a render itself.

ParameterTypeNotes
video_idstringId returned by create_video. required
list_videosread only

The account's videos, 25 per page, newest first.

ParameterTypeNotes
statusenumOnly videos in this status: queued processing ready_to_render rendering completed failed.
cursorstringnext_cursor from the previous page.
list_voicesread only

Every narration voice with its language, gender and premium surcharge (premium voices add 30 credits; voices with requires_plan need a paid plan; supports_direction voices take voice direction). Takes no parameters.

get_video_optionsread only

Every valid value for create_video (duration ranges, style presets, art styles, image quality, animation, background music), the editing choices and current credit pricing. Call this rather than hard-coding values. Takes no parameters.

get_credit_balanceread only

Current balance and plan. Worth checking before a batch. Takes no parameters.

Editing

An assistant edits a video the way a person does in the editor, pays the same credits, and renders once at the end. Edits never re-render on their own: a finished video that has been edited reports unrendered_changes: true until render_video. Slow edits and renders queue and run in order, and get_video_status waits for them. Images, animations, voiceovers and portraits an edit replaces stay in the video's History in the OriginShorts app, where you can switch back.

ToolWhat it doesCredits
get_videoThe script, settings, characters, and every scene with its narration, image prompt, image, duration, effects and animation. render_blockers lists anything to fix before rendering.Free
view_videoThe images themselves, so the assistant can see them (and show you): a numbered sheet of every scene with the character portraits, or one scene or character up close.Free
update_scenesChange narration or image prompts, add, delete or move scenes. Immediate. Each scene's narration is at most 500 characters, and a video has at most 30 scenes. Any change to the narration (including adding, deleting or moving a scene) needs change_voice before rendering.Free
regenerate_scene_imageA new image for one scene, from a new prompt or the current one, optionally naming which characters appear in it. An animated scene loses its animation (it animated the old image).2 basic, 5 pro (3 on an older video unless a quality is given)
change_voiceRe-records the narration and captions, in a new voice or the current one, with optional direction (tone, accent, emotion) for voices that support it. Needed after narration edits.10–40, by voice (60 for a retired premium voice)
change_musicSwaps the background track (list_music), or removes it.Free
animate_sceneTurns a scene's still image into a video clip, from its animation prompt or a new one.3 or 12 per second of the scene
remove_animationBack to the still image with its Ken Burns move.Free
set_scene_effectsKen Burns camera moves and overlay textures, per scene or all scenes.Free
change_captionsCaption style, font, position, entrance, uppercase, bold and colours.Free
add_characterAdds a character with a reference portrait, to any video. Put them in the scenes you choose with regenerate_scene_image (characters).2 basic, 5 pro
update_characterRename (free), turn a character off or back on (free), or give them a new look, which redraws their portrait.Free; new look 2 basic, 5 pro
remove_characterDeletes a character you added (scenes already drawn with them keep them until each image is redone); one found in the script is turned off instead, as in the app.Free
update_character_scenesRedraws the scenes still showing a character's old look.The image price per scene
rename_videoA new title (and download filename). No render needed.Free
list_musicThe music catalog, by genre.Free
render_videoMakes the new MP4 with every change, after any queued edits.Free

Posting

An assistant can post a finished video to the user's YouTube, TikTok and Instagram, now or at a set time, as the app does: public unless it sets the YouTube or TikTok privacy (Instagram posts are always public), with the titles and captions written for the video unless it writes its own. Connecting an account takes a link the user opens and approves; they don't need to sign in to OriginShorts.

ToolWhat it doesCredits
list_social_accountsThe connected accounts (one per platform), and which platforms aren't connected yet.Free
connect_social_accountA link for the user: they sign in to the platform, approve, and the account is connected.Free
disconnect_social_accountDisconnects one, for example to connect a different account. A scheduled post goes to whichever account is connected for that platform when it posts, or skips it.Free
post_videoPosts now or at schedule_at, with per-platform title, caption, tags and (YouTube, TikTok) privacy. Renders first if needed. A video posts once.Free
cancel_postCancels a scheduled post before it goes out.Free

Allowed values

The authoritative list is whatever get_video_options returns. These are the fixed enums.

FieldValues
duration_range15-30 15-45 30-45 30-60 45-60 45-75 60-90
art_stylephotorealistic comic-book anime 3d-animation film-noir
image_qualitybasic pro
background_musicauto none, or a track id from list_music
statusqueued processing ready_to_render rendering completed failed
ready_to_render: no current MP4 (a video made in the OriginShorts app, or after a voice change). render_video makes it.

Credits

ItemCredits
Standard video100
Pro image quality+30
Premium voice (premium: true in list_voices)+30
Animated (animated: true)+3 basic / +12 pro per estimated second of animation (see create_video)
EditsAs in the app (see Editing); each reply says what it cost
RenderFree
Failed generationRefunded automatically

Plans are on the pricing page.

Errors

Failures return readable text rather than a bare code, so an agent can usually recover without help.

ErrorMeaningWhat to do
invalid_api_keyThe key was rejected.Check it, or make a new one on your account page.
insufficient_creditsBalance is below the cost.The message carries what was needed and what you have. Top up on the pricing page.
invalid_requestA parameter was wrong or missing.Call get_video_options for the valid values.
idempotency_conflictAn identical create from moments ago is still being set up.Wait ~10 seconds and call list_videos; don't create again.
not_foundNo video with that id on this account.Check the id from create_video.
video_busy · video_rendering · edits_in_progressThe video is still generating, rendering, or running queued edits.get_video_status waits for it; then try again.
not_readySomething must be fixed before a render.The message lists it (for example, re-record the voice).
video_failedThe video's generation failed (its credits were refunded), so it can't be edited, rendered or posted.Make a new video. A failed render is different: render_video tries again.
not_editableA skit or blank-canvas project.Edit it in the OriginShorts app.
already_posted · not_connected · reconnect_neededPosting can't go ahead.The message says why: connect or reconnect the account, or post a different video.
voice_not_allowed or HTTP 403The voice needs a paid plan.Free accounts can use the voices with requires_plan false.
HTTP 429A rate limit (per key: 10 new videos and 120 edits an hour, 300 reads a minute), 3 videos already generating, or 20 edits queued on one video.The message says which: wait for a video or its edits to finish, or for the limit to reset.