# Quickstart # Quickstart ## 1. Get your keys **[Request access](/#access)**. Every account is approved by a person. Once yours is, you receive two API keys and a starting credit balance: - **Agent key** — give this to your agents. It can do everything except release posts. - **Admin key** — keep this with the person who approves posts. Store both somewhere safe, like a password manager. Only a hash of each key is stored, so a lost key cannot be recovered — ask for a new one and the old one is revoked. ## 2. Connect your agent The fastest way is the remote MCP server — no install. In Claude Code: ```bash claude mcp add --transport http second-studio https://frugal-anteater-681.convex.site/mcp --header "Authorization: Bearer YOUR_AGENT_KEY" ``` Other clients: see [Connect an agent](mcp.html). Then just ask your agent, for example: > Analyze the editing style of reference.mp4, then cut my clips in ./footage to that style with > track.mp3 as the music, and show me the result. ## 3. Or do it yourself with curl Every step below is what the agent does for you. ```bash export SS=https://frugal-anteater-681.convex.site export KEY=ss_live_... # your agent key # Upload a file: get a one-time URL, send the bytes, register the result. upload() { url=$(curl -s -X POST "$SS/v1/assets/upload-url" -H "Authorization: Bearer $KEY" | jq -r .uploadUrl) sid=$(curl -s -X POST "$url" -H "Content-Type: $2" --data-binary @"$1" | jq -r .storageId) curl -s -X POST "$SS/v1/assets" -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \ -d "{\"storageId\":\"$sid\",\"filename\":\"$(basename "$1")\"}" | jq -r .id } REF=$(upload reference.mp4 video/mp4) CLIP1=$(upload clip1.mp4 video/mp4) CLIP2=$(upload clip2.mov video/quicktime) MUSIC=$(upload track.mp3 audio/mpeg) # Analyze the reference's style (2 credits). Jobs are asynchronous: poll until done. JOB=$(curl -s -X POST "$SS/v1/styles" -H "Authorization: Bearer $KEY" \ -H "Content-Type: application/json" -d "{\"assetId\":\"$REF\"}" | jq -r .id) until [ "$(curl -s "$SS/v1/jobs/$JOB" -H "Authorization: Bearer $KEY" | jq -r .status)" = succeeded ]; do sleep 3; done STYLE=$(curl -s "$SS/v1/jobs/$JOB" -H "Authorization: Bearer $KEY" | jq -r .result.styleId) # Cut your clips to that style (5 credits). JOB=$(curl -s -X POST "$SS/v1/edits" -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" -d "{ \"styleId\": \"$STYLE\", \"clipAssetIds\": [\"$CLIP1\", \"$CLIP2\"], \"musicAssetId\": \"$MUSIC\", \"captions\": [\"The hook goes first\", \"Then the proof\", \"Then the payoff\"] }" | jq -r .id) until [ "$(curl -s "$SS/v1/jobs/$JOB" -H "Authorization: Bearer $KEY" | jq -r .status)" = succeeded ]; do sleep 5; done curl -s "$SS/v1/jobs/$JOB" -H "Authorization: Bearer $KEY" | jq -r '.outputs[] | select(.role=="edit") | .url' ``` A failed job reports `status: "failed"` with an `error`, and its credits are refunded automatically. ## Next - [Styles and edits](styles.html) — what a style contains and every edit option. - [Posting](social.html) — connect social accounts and publish with approval. - [Credits](billing.html) — what things cost.