API reference
Everything the dashboard does is backed by this API: authenticate with an API key, submit a job, check its status, and list the live models and prices.
Authentication
Create an API key at Dashboard → API Keys (the full key is shown once — store it securely) and send it as a Bearer token on every request:
curl https://getmecompute.com/api/v1/jobs \ -H "Authorization: Bearer gmc_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
Sandbox keys
Create a sandbox test key (gmc_test_…) from the same dashboard page to test your integration: the API surface is identical and requests are validated and priced for real, but sandbox jobs are simulated — no real video is generated. They auto-complete with a sample video within about a minute of submission, cost is 0 (the would-be price is returned as estimated_cost), and webhooks fire exactly like production.
Identify the key
GET https://getmecompute.com/api/v1/me
Authorization: Bearer gmc_live_…
// → { "user_id": "…", "email": "you@example.com", "key": { "kind": "personal", "name": "n8n production", "prefix": "gmc_live_a1B2c3" } }Cheap, side-effect-free credential check — use it as the connection test in n8n, Zapier, or your own tooling.
Upload an input image
Each job animates a source image. If it's already hosted on a public HTTPS URL you can skip this step and pass that URL directly as image_url. Otherwise request an upload slot and PUT the file:
POST https://getmecompute.com/api/v1/uploads
Authorization: Bearer gmc_live_…
Content-Type: application/json
{ "filename": "frame.jpg", "content_type": "image/jpeg" }
// → { "upload_url": "https://…presigned…", "s3_url": "https://…/uploads/…", "expires_in": 300 }
// Then upload the raw bytes (within 5 minutes):
curl -X PUT "<upload_url>" -H "Content-Type: image/jpeg" --data-binary @frame.jpgcontent_type must be image/jpeg, image/png, or image/webp. Use the returned s3_url as the job's image_url.
Submit a job
POST https://getmecompute.com/api/v1/jobs
Authorization: Bearer gmc_live_…
Content-Type: application/json
{
"model": "ltx-2-3",
"prompt": "A calm ocean at golden hour, gentle waves",
"image_url": "https://your-bucket.s3.amazonaws.com/frame.jpg",
"duration": "10s",
"aspect_ratio": "16:9",
"resolution": "1080p",
"quality": "standard",
"webhook_url": "https://your-app.com/hooks/video-done"
}| Field | Description |
|---|---|
| model | Required. Model id — wan-2-2 or ltx-2-3 or ltx-2-3-t2v. List the live set with GET /api/v1/models. |
| prompt | Required. Describes the motion you want. See Getting great results. |
| image_url | Required. Publicly fetchable URL of the source image (the video's first frame), or the s3_url from /api/v1/uploads. |
| duration | Required. Clip length as a string, e.g. "5s" or "10s". Must be one of the selected model's offered durations. |
| aspect_ratio | Required. e.g. "16:9", "9:16", "1:1" — from the model's offered ratios. |
| resolution | Required. e.g. "720p" or "1080p" — from the model's offered resolutions. |
| quality | Optional, default standard. One of fast, standard, high, highest (the dashboard labels fast as “Faster”). Affects the per-second rate. |
| style | Optional. A curated style id from GET /api/v1/styles (e.g. anime-v1, cinematic-v1) — the tile picker on the dashboard. Applies the style template on top of your prompt at generation time; a style's price_multiplier scales the per-second rate (1.0 for the launch styles). Unknown ids are rejected with 400; styles with a non-null model only work on that model. |
| webhook_url | Optional. If set, we POST to this URL when the job finishes — see Webhooks & automation. |
All option values are validated against the model's live configuration, and the price is computed server-side from the official rate card — a client can never set its own price.
Retries & idempotency
Send an Idempotency-Key header (any string ≤ 200 chars) to make retries safe: a repeated request with the same key within 24 hours returns the original job (with idempotent_replay: true in the body and an Idempotent-Replay: true response header) instead of creating — and billing — a second one. If the original request is still in flight you get a 409 with code: "conflict"; retry shortly.
curl -X POST https://getmecompute.com/api/v1/jobs -H "Authorization: Bearer $GMC_API_KEY" -H "Idempotency-Key: order-8412-video-1" -H "Content-Type: application/json" -d '{…}'Advanced parameters
Optional per-job overrides of the inference pipeline (the dashboard's Advanced section). Omitted fields use the model defaults. Out-of-range values are rejected with a 400 naming the field.
| Field | Description |
|---|---|
| sample_steps | Integer 4–60. Denoising step count; overrides the quality tier's step mapping (pricing still follows the tier). Both models. |
| seed | Integer 0–2147483647 (values outside 0..2³¹−1 are rejected), default 42. Same seed + same settings reproduces the same clip. Both models. |
| negative_prompt | String, ≤ 2000 chars. What the model should steer away from. LTX-2.3 only. |
| video_cfg_scale | Number 1–15, default 3.0. Prompt-guidance strength for video. LTX-2.3 only. |
| audio_cfg_scale | Number 1–15, default 7.0. Prompt-guidance strength for audio. LTX-2.3 only. |
| stg_scale | Number 0–5, default 1.0. Spatiotemporal guidance (video). LTX-2.3 only. |
| rescale_scale | Number 0–1, default 0.7. CFG rescale; tames over-saturation. LTX-2.3 only. |
| fps | Number 16–50, default 24. Output frame rate; duration is unchanged, the frame count scales. LTX-2.3 only. |
| generate_audio | Boolean, default true. false ships a silent MP4. LTX-2.3 only. |
Response
{
"message": "Job submitted successfully",
"jobId": "385df601-fafb-4549-b8a8-…",
"job_id": "385df601-fafb-4549-b8a8-…",
"cost": 0.36
}Errors
Every error is {"error": "human message", "code": "machine_code"} — branch on code, show error to humans.
| Status | Meaning |
|---|---|
| 400 invalid_request | A required field is missing, or a value isn't offered by the selected model (the error message names the field). |
| 400 limit_reached | A per-account resource cap was hit — e.g. 10 active webhook endpoints. Remove one and retry. |
| 401 unauthorized | Missing, invalid, revoked, or expired API key. |
| 409 conflict | A request with the same Idempotency-Key is still in flight — retry shortly. |
| 429 rate_limited | Over the request-rate limit — honor the Retry-After header. |
| 500 / 502 upstream_error | The job couldn't be dispatched for processing (502 = upstream rejection, 500 = network-level failure); it is marked failed and you are not billed. |
Check a job
GET https://getmecompute.com/api/v1/jobs/385df601-… Authorization: Bearer gmc_live_…
Returns the job's status, its settings and cost, and — once completed — output_url: a presigned download link for the MP4, valid for 1 hour (re-fetch the job for a fresh link). Failed jobs include an error_message. A key can only read its owner's jobs (404 otherwise). Prefer webhooks over polling when you can — but if you poll, every 15–30 seconds is plenty (jobs take minutes).
| Status value | Meaning |
|---|---|
| pending | Queued and waiting for capacity. |
| running | Rendering now. |
| completed | Done — output_url holds the MP4 download link. |
| failed / failed_oom | Generation failed (failed_oom = the resolution/duration was too demanding — try lower settings). Never billed. |
List your jobs
GET https://getmecompute.com/api/v1/jobs?limit=20&status=completed Authorization: Bearer gmc_live_…
Most-recent first. limit is 1–100 (default 20); status optionally filters to one of the status values above; created_after / created_before take ISO timestamps (handy for polling integrations). The response includes next_cursor — pass it back as ?cursor= for the next page (null when you've reached the end).
List models & prices
GET https://getmecompute.com/api/v1/models
No auth required. Returns the active models with their offered durations, aspect_ratios, resolutions, and the full prices matrix (prices[resolution][quality] = $/second). This is the same data that drives the submit form and the public rate card — use it to build pickers or estimate costs in your own tools.
Webhook endpoints
Beyond the per-job webhook_url, you can subscribe endpoints to every job event on your account — designed for automation platforms like Zapier and n8n. Manage them at Dashboard → Webhooks or via POST/GET /api/v1/webhook-endpoints and DELETE /api/v1/webhook-endpoints/{id}. Payloads, event types, and signature verification are covered in Webhooks & automation.
Rate limits
Per account: 300 reads/min, 30 job creations/min (the full allowance is available as a burst, so a 30-scene story submits in one go), and 60 writes/min (uploads + webhook-endpoint changes). There are no spend caps and no cap on queued jobs — every job is priced server-side at submission and tracked on your dashboard, and deep queues are what the platform is for. Over-limit requests get a 429 with Retry-After and X-RateLimit-* headers; back off and retry. Need more? Contact us.
Use it from Claude or an agent
The whole API is also exposed over the Model Context Protocol — connect Claude Code, Cursor, or any MCP client and let the agent submit and track jobs for you. See MCP — use from Claude & agents.
OpenAPI spec
The full machine-readable contract lives at GET /api/v1/openapi.json — feed it to SDK generators, GPT Actions, or your agent framework of choice.
End-to-end example
# 1. Upload the source image
SLOT=$(curl -s -X POST https://getmecompute.com/api/v1/uploads \
-H "Authorization: Bearer $GMC_API_KEY" -H "Content-Type: application/json" \
-d '{"filename":"frame.jpg","content_type":"image/jpeg"}')
curl -s -X PUT "$(echo $SLOT | jq -r .upload_url)" \
-H "Content-Type: image/jpeg" --data-binary @frame.jpg
# 2. Submit the job
JOB=$(curl -s -X POST https://getmecompute.com/api/v1/jobs \
-H "Authorization: Bearer $GMC_API_KEY" -H "Content-Type: application/json" \
-d "{\"model\":\"ltx-2-3\",\"prompt\":\"A calm ocean at golden hour\",
\"image_url\":\"$(echo $SLOT | jq -r .s3_url)\",
\"duration\":\"10s\",\"aspect_ratio\":\"16:9\",\"resolution\":\"720p\"}")
# 3. Poll until completed (or use webhook_url instead)
curl -s https://getmecompute.com/api/v1/jobs/$(echo $JOB | jq -r .job_id) \
-H "Authorization: Bearer $GMC_API_KEY" | jq '{status, output_url}'