Developers / API

Design and print with an agent

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.

Try it right now, no setup

no account

These are live compose links. Each one builds the design on the server and drops you into the editor with it loaded:

Connect Claude, ChatGPT or your own agent

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/mcp

Claude (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/mcp

Cursor, 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.

Compose tools no account

list_formatsthe composable formats with their printed dimensions
describe_formatone format’s panels as pixel sizes at export DPI, plus the coordinate and size units decals and text use
list_decalsevery sticker, shape and retro distributor mark by id, with pixel sizes and previews
get_contenta title’s own posters, wordmark logos and stills as decal ids
search_contentlook up a movie, show, or album and confirm the match
compose_designbuild the design and return the URL the user opens

Account tools API key

get_accountwho the key belongs to: plan, today’s remaining quotas, design and upload counts
upload_imageput an image in the Uploads library, get an upload:<id> ref back
list_uploadsthe library, newest first, with preview links
delete_uploadfree a library slot (saved designs keep their own copies)
save_designcompose and save to the dashboard in one call; images go on the panels
list_designsthe account’s saved designs with their open URLs
get_designone design with its stored parameters
delete_designremove a design and its files
export_designqueue a print-file render (PNG or PDF) of a saved design — members
get_exportpoll the job; when done, an hour-long download link

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

Compose by link

no account

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
ParameterMeaning
formatRequired. A format slug from the grid below, e.g. slipcover, dvd-cover, jcard.
qTitle to search. Include the year for precision ("Bumblebee 2018", "Nirvana Nevermind").
typemovie, tv, or album. Defaults to album on audio formats, movie otherwise.
title, tagline, year, …Text overrides for the fetched metadata (video formats).
color / bgLabel / background color as 6-digit hex.
fontFont family name. On audio formats it applies to every text section.
finishworn (default), clean, or plain: how finished the design lands (video formats and jcard).
logo1 renders the provider's logo artwork for the title; 0 renders your title as text (video formats).
hideComma-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.

Act on your account

API key

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_…"

Your own artwork on the panels

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.

Stickers, shapes and text — rebuilding a specific cover

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.

See it, then export it

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 and limits

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.

REST reference

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.

RouteDoesScope
GET /api/v1/formatsthe composable formatsnone
GET /api/v1/formats/<slug>panel geometry in pixels at export DPInone
GET /api/v1/decalsthe decal catalog: ids, pixel sizes, previews, Classic Logo idsnone
GET /api/v1/content/<type>/<id>a title’s posters, logos and backdrops as decal idsnone
POST /api/composeintent in, designer URL outnone
GET /api/v1/accountplan, quotas, countsread
GET /api/v1/uploadsthe Uploads libraryread
POST /api/v1/uploadsmultipart file (≤ 4 MB) or JSON base64design:write
DELETE /api/v1/uploads/<id>remove one uploaddesign:write
GET /api/v1/designssaved designsread
POST /api/v1/designscompose + save (intent plus a name)design:write
GET /api/v1/designs/<id>one design with its parametersread
DELETE /api/v1/designs/<id>delete a designdesign:write
POST /api/v1/designs/<id>/exportqueue a render; 202 with a jobIdexport
GET /api/v1/exports/<jobId>job status; file.url when doneexport
POST https://vhs.texs.org/api/compose
{ "v": 1, "format": "slipcover",
  "content": { "type": "movie", "query": "Predator 1987" } }

→ { "url": "…", "applied": [...], "unsupported": [...] }

27 composable formats

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: