Developers / API
Two halves. Start a design from Claude, ChatGPT, a link or the REST API, no account needed, and open it in the designer already populated. Act on your account with an API key: upload artwork, put it on the panels, save designs to your dashboard and, as a member, export the print file without opening a browser.
These are live compose links. Each one builds the design on the server and drops you into the editor with it loaded:
The connector is one URL. Add it to an AI app and ask for a cover in plain words; the app searches the title, builds the design and hands you a link that opens in the designer:
https://vhs.texs.org/mcpClaude (claude.ai, Desktop, mobile): Customize → Connectors → Add custom connector → paste the URL. Works on every plan, Free included (Free allows one custom connector).
ChatGPT: turn on Developer mode in Settings (web, on Plus, Pro, Business, Enterprise and Edu plans), then add a connector with the URL above and OAuth authentication.
Claude Code:
claude mcp add --transport http tapercraft https://vhs.texs.org/mcpCursor, Codex and other MCP clients: same URL, Streamable HTTP transport.
Signed out, the connector builds designs with no account. The first time you ask for more (saving to your dashboard, your own artwork, previews, print files) the app sends you to a page here to sign in and approve it, once. Disconnect any time under Account Settings → Connected apps. Scripts and other clients can use an API key instead.
list_formatsthe composable formats with their printed dimensionsdescribe_formatone format’s panels as pixel sizes at export DPI, plus the coordinate and size units decals and text uselist_decalsevery sticker, shape and retro distributor mark by id, with pixel sizes and previewsget_contenta title’s own posters, wordmark logos and stills as decal idssearch_contentlook up a movie, show, or album and confirm the matchcompose_designbuild the design and return the URL the user opensget_accountwho the key belongs to: plan, today’s remaining quotas, design and upload countsupload_imageput an image in the Uploads library, get an upload:<id> ref backlist_uploadsthe library, newest first, with preview linksdelete_uploadfree a library slot (saved designs keep their own copies)save_designcompose and save to the dashboard in one call; images go on the panelslist_designsthe account’s saved designs with their open URLsget_designone design with its stored parametersdelete_designremove a design and its filesexport_designqueue a print-file render (PNG or PDF) of a saved design — membersget_exportpoll the job; when done, an hour-long download linkEvery tool reports what it applied and what it did not (applied / unsupported), so an agent can tell you the truth about the design it hands you.
The simplest integration is a URL. GET https://vhs.texs.org/api/compose with query parameters redirects to the designer with the design built:
https://vhs.texs.org/api/compose?format=slipcover&q=Predator+1987&finish=clean| Parameter | Meaning |
|---|---|
format | Required. A format slug from the grid below, e.g. slipcover, dvd-cover, jcard. |
q | Title to search. Include the year for precision ("Bumblebee 2018", "Nirvana Nevermind"). |
type | movie, tv, or album. Defaults to album on audio formats, movie otherwise. |
title, tagline, year, … | Text overrides for the fetched metadata (video formats). |
color / bg | Label / background color as 6-digit hex. |
font | Font family name. On audio formats it applies to every text section. |
finish | worn (default), clean, or plain: how finished the design lands (video formats and jcard). |
logo | 1 renders the provider's logo artwork for the title; 0 renders your title as text (video formats). |
hide | Comma-separated fields to hide, e.g. hide=budget,revenue (video formats). |
A link degrades gracefully: one invalid optional field is dropped rather than failing the design, and an unmatched search still lands in the right designer.
Create a key under Account Settings → API Keys. Keys start with tc_live_, are shown once, carry the scopes read, design:write and export, and can be revoked any time. Send one as a Bearer token on the MCP request or any /api/v1 call:
claude mcp add --transport http tapercraft https://vhs.texs.org/mcp \
--header "Authorization: Bearer tc_live_…"
# REST twin of the get_account tool
curl https://vhs.texs.org/api/v1/account -H "Authorization: Bearer tc_live_…"Ask describe_format for the panel sizes, generate or pick the images, upload each one, then compose or save with the refs. A whole-sheet background, one image per panel, and a custom studio logo are all fields of the same intent:
# 1. upload (multipart, ≤ 4 MB; JPEG at quality 80–85 is plenty)
curl -X POST https://vhs.texs.org/api/v1/uploads \
-H "Authorization: Bearer tc_live_…" \
-F "file=@front.jpg" -F "name=cereal-front"
→ { "ref": "upload:2d8d3355-…", "width": 1536, "height": 2752, … }
# 2. compose and save in one call
POST https://vhs.texs.org/api/v1/designs
{ "name": "Predator Crunch", "format": "slipcover",
"content": { "type": "movie", "query": "Predator 1987" },
"images": { "panels": {
"front": { "ref": "upload:2d8d3355-…", "fit": "fill" },
"back": { "ref": "upload:e41f26e0-…", "fit": "fill" } } } }
→ { "designId": "…", "url": "…", "applied": [ "content", "images.panels.front", … ] }Uploads land in Your Uploads, the same library every picker in the designer shows. Saved designs keep their own copies of the images they use, so deleting an upload later never breaks a design. The library holds a per-plan number of images; at the limit, list_uploads and delete_upload make room.
The same intent places decals and free text at percent-of-sheet positions, so an agent can rebuild a cover the user shows it. list_decals gives the ids and pixel sizes, describe_format the panel rectangles and the size units. An RCA/Columbia-style black slipcover with a red frame, in one call:
POST https://vhs.texs.org/api/compose
{ "format": "slipcover", "content": { "type": "movie", "query": "Ghostbusters 1984" },
"style": { "finish": "plain", "background": { "color": "#0b0b0b" }, "labelColor": "#e8dcc0" },
"layout": { "hide": ["poster", "title", "tagline", "productionLogos"] },
"decals": [
{ "id": "04-rounded-rectangle", "x": 28.6, "y": 59.7, "scale": 541, "stretch": 32,
"layer": "under", "colorize": "solid", "color": "#d3232a" },
{ "id": "04-rounded-rectangle", "x": 28.6, "y": 59.7, "scale": 523, "stretch": 31,
"layer": "under", "colorize": "solid", "color": "#0b0b0b" },
{ "id": "rcacolumbia!", "x": 28.6, "y": 25.2, "width": 5.2 },
{ "id": "tmdb-logo-hzZaNFDIURV51vMsNYGKc7Uguymj.png", "x": 28.6, "y": 79.9, "width": 33 },
{ "ref": "upload:fbc0b77f-…", "x": 28.6, "y": 52, "width": 30, "layer": "under" } ],
"texts": [
{ "text": "COLUMBIA PICTURES PRESENTS", "x": 28.6, "y": 30.2, "width": 30, "size": 1.05,
"weight": 700, "color": "#e8dcc0", "letterSpacing": 1 },
{ "text": "BILL MURRAY DAN AYKROYD\nSIGOURNEY WEAVER", "x": 28.6, "y": 74.2, "width": 34,
"size": 1.7, "weight": 700, "color": "#e8dcc0" } ] }The tmdb-logo-… id is the film's real wordmark from get_content, which lists a title's posters, logos and stills the same way. A decal or text block is placed by its center; width is percent of the sheet width, a text size percent of the sheet height. Two stacked solid-colour rounded rectangles make a frame. An upload placed as a decal needs the key that owns it; a catalog id that does not exist is an error, never a blank.
Renders run headlessly and take 15 to 60 seconds. A preview is a downscaled image of the whole sheet, open to every plan, and on MCP get_export returns it inline so the agent can look at its own work. Preview after each save, fix, then queue the print file:
POST https://vhs.texs.org/api/v1/designs/<designId>/export { "output": "preview" }
→ 202 { "jobId": "0c1d2e3f-…", "status": "queued" }
GET https://vhs.texs.org/api/v1/exports/0c1d2e3f-…
→ { "status": "done", "file": { "url": "https://…", "mimeType": "image/webp",
"widthPx": 1568, "heightPx": 1340, "bytes": 212844 } }
POST https://vhs.texs.org/api/v1/designs/<designId>/export { "output": "png" }
→ 202 { "jobId": "f945a6c4-…", "status": "queued" }
GET https://vhs.texs.org/api/v1/exports/f945a6c4-…
→ { "status": "done", "file": { "url": "https://…", "mimeType": "image/png",
"widthPx": 6440, "heightPx": 5504, "bytes": 19166146,
"expiresInSeconds": 3600 } }pngis the format's full-resolution Original PNG at 600 DPI, pdf its design-size PDF. A free account gets TIER_REQUIRED for those two: designing, uploading, saving and previews work on every plan, the print file needs a membership. The download link lasts an hour and the file a day; after that the job reads expired.
Errors are application/problem+json with a stable code: API_KEY_REQUIRED, API_KEY_INVALID, FORBIDDEN_SCOPE, QUOTA_REACHED, TIER_REQUIRED, LIBRARY_IMAGE_LIMIT. Quotas are per account and per day, shared with your browser use; a key never widens what your plan allows. Request bodies over 4.5 MB are refused before the API sees them, so keep uploads at or under 4 MB.
Every MCP tool has an HTTP twin. Keyed routes take Authorization: Bearer tc_live_… and answer with CORS open, so they work from a browser extension as well as a script. GET https://vhs.texs.org/api/compose (no params) returns the full intent schema: formats, text fields, style options, hideable fields, image fields.
| Route | Does | Scope |
|---|---|---|
GET /api/v1/formats | the composable formats | none |
GET /api/v1/formats/<slug> | panel geometry in pixels at export DPI | none |
GET /api/v1/decals | the decal catalog: ids, pixel sizes, previews, Classic Logo ids | none |
GET /api/v1/content/<type>/<id> | a title’s posters, logos and backdrops as decal ids | none |
POST /api/compose | intent in, designer URL out | none |
GET /api/v1/account | plan, quotas, counts | read |
GET /api/v1/uploads | the Uploads library | read |
POST /api/v1/uploads | multipart file (≤ 4 MB) or JSON base64 | design:write |
DELETE /api/v1/uploads/<id> | remove one upload | design:write |
GET /api/v1/designs | saved designs | read |
POST /api/v1/designs | compose + save (intent plus a name) | design:write |
GET /api/v1/designs/<id> | one design with its parameters | read |
DELETE /api/v1/designs/<id> | delete a design | design:write |
POST /api/v1/designs/<id>/export | queue a render; 202 with a jobId | export |
GET /api/v1/exports/<jobId> | job status; file.url when done | export |
POST https://vhs.texs.org/api/compose
{ "v": 1, "format": "slipcover",
"content": { "type": "movie", "query": "Predator 1987" } }
→ { "url": "…", "applied": [...], "unsupported": [...] }Video formats compose from a movie or show and take the full text, style, layout and image surface; audio formats build the complete design (cover art, tracklist, QR code) from the album alone and take font and colors. Every format links to its own free designer: