/pingCheck that the key is valid. No fields.
response
- ok: true
API v1
Version 1 (v1) — additive only: new endpoints and optional fields are added; nothing existing is removed or changed.
The shortest path: find a product, create an order, follow it to delivered and download the video.
Every call sends your API key in the Authorization header, Bearer style. No cookies, no CORS — the API is called from your backend, not the end user's browser. The key can ONLY reach your own account: every order, file and money movement is bound to your account, whatever you send. The key is shown once at creation — if it leaks, revoke it from the portal and make a new one.
Authorization: Bearer vapi_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
All endpoints live under https://mystage.film/api/v1. Responses are JSON. Every response carries an x-request-id header — quote it when contacting support.
https://mystage.film/api/v1
List endpoints return { data, has_more, next_cursor }. Pass next_cursor as the cursor query parameter on the next call. limit: 1–100 (default 20). Order is always newest first.
Every POST that creates something (orders, uploads, change requests, approvals, cancel) REQUIRES the Idempotency-Key header with a unique value per operation (e.g. one UUID per workflow). Same key + same body = the stored answer, never a second run; same key + different body = 422 idempotency_mismatch; a key still running = 409 idempotency_in_flight. Responses are kept for 48 hours. A network retry can therefore never create a duplicate order or a double charge.
Idempotency-Key: 8f3c1d2a-77b9-4c1e-9a01-5f6e8d9c0b1a
All errors follow RFC 9457 (application/problem+json) with type, title, status, code, request_id and, for field problems, an errors list. The codes you will meet:
Up to 120 calls per minute per key (reads and writes together) and up to 30 POST/PATCH/DELETE per minute per key. A 429 answer carries Retry-After. Refused calls are never charged.
All calls are relative to the base URL. Bodies are strict: unknown fields are refused.
/pingCheck that the key is valid. No fields.
/meYour key, your account, your wallet balance and a 30-day usage summary (calls, orders, charges in cents).
curl -H "Authorization: Bearer $KEY" https://mystage.film/api/v1/me
/usageThe key's request history: route, method, status, order_id when the call created an order, and credits_cents for what it debited. Cursor pagination.
curl -H "Authorization: Bearer $KEY" "https://mystage.film/api/v1/usage?limit=50"
/productsThe catalog with prices per duration, aspect ratios, add-ons and the intake schema. Cursor pagination.
curl -H "Authorization: Bearer $KEY" https://mystage.film/api/v1/products
/products/{productId}One product with all its details.
/products/{productId}/intake-formThe answer fields the product asks for: type, label, required, options, whether it takes an upload. Build your form from here.
/uploadsIdempotency-Key requiredRequests a presigned URL for one intake file. Body: purpose="intake", content_type (image/jpeg|png|webp, audio/mpeg|mp4), size_bytes (up to 50 MB, exact). Always PUT to url with the right Content-Type before it expires (10 minutes). Keep the upload_id for the order answers.
curl -X POST -H "Authorization: Bearer $KEY" -H "Idempotency-Key: $IDEM" \
-H "Content-Type: application/json" -d '{"customer_id":"…","purpose":"intake","content_type":"image/jpeg","size_bytes":48123}' \
https://mystage.film/api/v1/uploads/ordersIdempotency-Key requiredCreates the order and charges your wallet in one transaction. Body: customer_id, product_id, length_seconds (from the prices), aspect (optional, from aspect_ratios), add_ons { subtitles, extra_formats, resolution, duration_seconds } (optional, only what the product offers), answers (the intake form fields; files as upload_id), uploads (list of upload_id). complimentary is not available through the API. 402 when the balance is not enough — then nothing is created.
curl -X POST -H "Authorization: Bearer $KEY" -H "Idempotency-Key: $IDEM" \
-H "Content-Type: application/json" -d '{"customer_id":"…","product_id":"…","length_seconds":30,"answers":{}}' \
https://mystage.film/api/v1/orders/ordersYour orders, newest first. Filters: status, created_after (ISO), customer_id. Cursor pagination.
curl -H "Authorization: Bearer $KEY" "https://mystage.film/api/v1/orders?status=delivered"
/orders/{orderId}One order: status (received, awaiting_approval, changes_requested, in_production, delivered, failed, cancelled, awaiting_balance), details, add-ons, total_cents.
/orders/{orderId}/cancelIdempotency-Key requiredA cancellation request for an order in paid state. Body: reason (optional). The cancellation is completed by our team; if production has started, the charge is refunded to your wallet.
/orders/{orderId}/storyboardAn order's current storyboard: version, status, scenes with images (presigned URLs expiring in ~15 minutes).
/orders/{orderId}/storyboard/approveIdempotency-Key requiredApproves the storyboard and starts production. No body.
/orders/{orderId}/change-requestsIdempotency-Key requiredRequests changes on scenes. Body: requests array with scene_index and comment (the same shape as the site).
/orders/{orderId}/videoOnly when delivered: a secure download URL for the finished video (MP4), expiring.
Cookies
We use analytics cookies to understand how this site is used. They are not needed for the site to work, and your choice changes nothing about the service you receive. Read our Privacy Policy