По-русски

What the API can do

Anything you do in the studio by hand, an agent can do with a key. Create one in the studio: «⋮» → API → Create key. The key’s rights cut the list itself: a read-only key never even sees the writing tools.

The list below is printed from the studio registry — it cannot fall behind it.

claude mcp add --transport http vini https://vinistudio.app/mcp \
  --header "Authorization: Bearer $VINI_API_KEY"
ToolWhat it doesPrice
reads
describe_studioThe studio catalogue: which nodes exist, what each one is for, their inputs, outputs and parameters.—
model_adviceHow the models actually differ, when to pick which, and what we verified ourselves.—
list_skillsStudio and user techniques: what each one does, which nodes it fits and which model it was written for.—
read_project_graphWhat is on the project canvas right now: nodes (card title, parameters, result status) and the wires between them.—
read_run_historyRun history of the project: which nodes ran, when, with what outcome and at what price.—
traceThe causal chain behind a result: why this node or this material came out the way it did.—
describe_sceneContents of a scene container: what is inside it, what carries it and who changed it along the way.—
list_my_elementsThe user's element library (characters, objects, locations) — id, name, role, start of the description.—
describe_elementThe full description of ONE library element by id, when the list shows it truncated.—
list_my_promptsThe user's saved prompts (id + title).—
list_my_designsThe user's design systems (id + title).—
list_generatorsReady-made setups for a node — model, format and prompt in one piece: the studio built-ins and this account’s own, marked mine (a recipe drops the author’s solutions there).—
billing_statusHow much money is on the account right now, and whether it is being metered at all.—
billing_historyWhere the money went: total for a period, broken down by kind of work, model, project and day.—
list_projectsProjects on this account: name, when they were last edited, and the address that opens them.—
list_artifactsAccount materials: images, clips, audio and uploaded documents.—
get_artifactOne material and a link to download it.—
list_jobsGeneration jobs: what is running right now and how the recent ones ended.—
get_jobThe state of a single job by its job_id.—
lore_standardThe standard of a workspace's shared lore and what is not filled in yet.—
list_workspacesWorkspaces on this account: id, name and how many projects each holds.—
get_workspace_loreA workspace's shared lore: documents the studio puts into the request of the text nodes of its projects.—
get_runThe state of a node run by run_id: status, the nodes of the run and the amount spent.—
price_quoteWhat a run will cost — before it happens.—
list_social_accountsConnected social accounts of the key owner: id, platform, nickname and state.—
get_copilot_taskFollow a Vini task: status, question, event feed, spend and report.—
builds
create_projectCreate a new empty studio project and get its address.—
apply_graph_opsBuild or change the project graph: add nodes, set their fields, connect them with wires.—
expand_scenesExpand the written scenes of a Prompt Scriptwriter into nodes, like the Expand all button in the studio.—
set_project_formatSet or clear the video format for the whole project.—
create_workspaceCreate a new empty workspace and get its id.—
move_projectMove a project to another workspace on this account.—
put_workspace_loreWrite a shared lore document of a workspace: without doc_id a new one, with doc_id replace the text and title of an existing one.—
write_loreWrite a workspace's shared lore by the lore wizard standard from the person's answers step by step.—
upload_artifactUpload a file to your materials: an image, video, audio, PDF, TXT or another document.—
start_uploadStart uploading a large file to your materials.—
upload_chunkSend the next chunk of a file upload.—
finish_uploadFinish a file upload and receive the material in your library.—
cancel_uploadCancel an unfinished file upload and remove its temporary chunks.—
assemble_videoStitch clips into one video.—
edit_videoTrim a video at the ends.—
extract_audioTake the audio track out of a video.—
import_clipFetch a video by link so you can work with it.—
inspect_importFind the available YouTube video qualities before importing.—
put_publish_draftPrepare a video or image post (an image goes to Instagram only): caption, cover frame and account — a person publishes it.—
save_elementSave an Element — a character, object or place — to your studio library or update a saved one.—
generates
run_nodeRun a project node like the ▶ button in the studio: it and everything above it that is not fresh yet.metered
stop_runStop a running node run by run_id: no new requests start, those already sent to the model finish and are paid.metered
generate_textWrite text with a model — a short piece to a brief.metered
generate_imageDraw a frame from a description and references.metered
generate_musicCompose a music bed from a description of the mood (model and vocals are optional).metered
generate_voiceRead text aloud in the chosen voice.metered
clone_voiceMake a voice from a recording, to narrate with it later.metered
isolate_audioIsolate speech from audio/video (voice_url); bg_url is an optional, best-effort music/SFX/ambience residual, not a guaranteed clean stem.metered
analyze_audioBreak down a sound — a track, song, speech or a video soundtrack — by answering your question.metered
dub_videoRe-voice a finished clip in another language.metered
upscale_imageEnlarge a frame without losing sharpness.metered
write_scriptBreak an idea into scenes: what happens, what is in frame, who speaks.metered
write_scene_promptsWrite scene prompts using the selected video model’s skill automatically. Supply its ID in params.video_model. For a saved graph node, prefer run_node: it reads the node’s video model itself.metered
rewrite_sceneRewrite one scene without touching the others.metered
direct_sceneBreak a scene down as a director would: camera movement, action, rhythm.metered
make_subtitlesMake subtitles for a clip from its audio.metered
normalize_subtitlesTidy subtitles: line breaks, timings, punctuation.metered
decorate_videoDress a clip up — captions, plates, accents over the picture.metered
generate_videoShoot a clip.metered
lipsync_videoMatch speech to the character's lips in a finished clip.metered
analyze_videoBreak down someone else's reference clip in the language of a director and a cinematographer — breakdown, frame style, motion style and shots.metered
start_copilot_taskHand a task to Vini, the studio copilot: it builds the graph, runs nodes and returns a report within a spending ceiling.metered
answer_copilot_taskAnswer Vini's question on a task, optionally raising the spending ceiling.metered
stop_copilot_taskStop a Vini task: no new rounds start and the work done stays in the report.metered

Project links

create_project, list_projects and read_project_graph return url — the project’s address in the browser. Pass that url (or just its 12-character tail, or the id) as project_id to any tool; the studio resolves it to a project of your account. The link opens in the browser only for a person signed in to the key owner’s account (holding the link grants no access), and it survives moving and renaming the project. A foreign or missing project is refused exactly like a wrong id; the exception is list_jobs and list_artifacts: for a foreign or missing project, or a typo in the link, they return an empty list, and empty does not mean “nothing is running”. A link cannot be verified by a request: the site answers with the app shell for any well-formed address, whether the project exists or not; verify it with a tool (read_project_graph). Pass project_aspect to create_project: 9:16 for Reels/Shorts/TikTok, 16:9 for horizontal video, 1:1 for square posts, or 3:4 when the brief calls for it. An explicit user choice takes priority; ask if the intended output is unclear. Later use set_project_format with the current based_on_revision; project_aspect: null clears the default. Node and Scriptwriter overrides take priority. A change can make results stale, but generates nothing; an active run returns busy.

Upload files

Upload images, videos, audio, PDFs, TXT files and other documents with upload_artifact: send the original name as filename and the bytes as data_url (data:<MIME>;base64,…). A project is optional. The key needs permission to build.

For large files, use start_upload → upload_chunk → finish_upload. Start with the MIME type and original size in bytes; send chunks in order from index 0, using chunk_bytes from the response (4 MiB). Whole files allow up to 24 MiB; chunked files up to 2048 MiB. Use chunks near the 32 MiB JSON request limit. Use cancel_upload to cancel an unfinished upload.

The response includes artifact_id, the URL and file details. Attach media to a node with pin_file. Documents are preserved in full without automatic text extraction; use get_artifact to download them.

REST accepts the same JSON and Bearer key: POST to /api/artifacts/upload, or use /api/artifacts/upload/start, /chunk, /finish, /cancel for chunks. These five routes accept a key with permission to build. Example TXT upload:

curl 'https://vinistudio.app/api/artifacts/upload' \
  -H "Authorization: Bearer $VINI_API_KEY" \
  -H 'Content-Type: application/json' \
  --data '{"filename":"brief.txt","data_url":"data:text/plain;base64,SGVsbG8="}'

Machine-readable version for your agent — /mcp/llms.txt, no authentication required.
Not there yet: running a whole project with one call, and managing keys with a key — keys are created in the browser only.