{"openapi":"3.1.0","info":{"title":"Lotgen API","version":"1","description":"Lotgen renders AI video and stills on your own provider keys. Every route is under `/v1`, takes and returns JSON, and answers errors as `{ error: { code, message, ... } }`.\n\n**Authentication.** `Authorization: Bearer <key>`. A key starts `lgk_` and is minted under Settings, API keys. It carries scopes; each operation names the one it needs as `x-lotgen-scope`:\n\n- `read`: See lots, takes, products, usage and prices.\n- `write`: Create and edit lots, shots and products. Spends nothing.\n- `render`: Render, run post passes and voice. Spends on your provider keys.\n- `admin`: The workspace itself: settings, caps, provider keys, members, billing.\n\n`admin` satisfies everything; `read` is satisfied by any scope. A key that lacks a scope answers `403 insufficient_scope` naming it.\n\n**Brands.** A key may be bound to one brand kit (Partner add-on). Every lot it creates carries that brand and the kit's name as its client tag; it sees only that brand's lots, products and kits, and nothing unbranded; asking for another brand answers `403 brand_scope`. The binding is a wall: another brand's shot, take, asset, pack, collection, link or export answers `404` by id, the same as another workspace's, and a face the key casts or a collection it gathers is the brand's own.\n\n**Rate limits.** Per key, per minute, per replica: 600 requests, and 30 calls to routes that render (`x-lotgen-scope: render`, and `render-pending` without `dry_run`). Every keyed response carries `X-RateLimit-Limit`, `X-RateLimit-Remaining` and `X-RateLimit-Reset` (seconds until a slot frees); a render call carries `X-RateLimit-Render-*` as well. Over the limit is `429 rate_limited` with `retry_after` seconds and a `Retry-After` header. A dry run in the body or as `?dry_run=true` is a quote and counts as a read.\n\n**Money.** Only routes marked `render` spend, and they spend on the workspace's own provider keys. Every render door accepts `dry_run` and answers the estimate instead."},"servers":[{"url":"https://api.lotgen.ai"}],"security":[{"bearer":[]}],"tags":[{"name":"Workspace","description":"The workspace, the caller, and what things cost."},{"name":"Lots","description":"A lot is a project: a set of shots rendered under one brief."},{"name":"Shots","description":"A shot is a scene: one prompt, one set of references, many takes."},{"name":"Takes","description":"Takes are jobs: a render, its status and its output."},{"name":"Assets","description":"Rendered media, references and post passes on them."},{"name":"Studios","description":"The studio doors: plan a lot from a brief, then build it. Building spends nothing; rendering is a separate call."},{"name":"Products","description":"Products and brand kits, the library a lot is built from."},{"name":"Collections","description":"Curated sets of takes and the review links that share them."},{"name":"Drive","description":"Google Drive in and out."},{"name":"Webhooks","description":"Signed POSTs to your server when a take lands, a reviewer decides or a Drive delivery finishes. Partner add-on."},{"name":"Admin","description":"Provider keys, members, billing and the workspace's own keys. A session's business; an API key needs admin."}],"paths":{"/v1/me":{"get":{"operationId":"get_workspace","summary":"The workspace this credential opens, and the credential itself.","description":"For an API key, `key` names it and carries its scopes, its preset and the brand it is bound to, when it is. `role` is null for a key.","tags":["Workspace"],"x-lotgen-scope":"read","responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"update_workspace","summary":"Change the workspace's name, region, spend cap or unpriced policy.","tags":["Workspace"],"x-lotgen-scope":"admin","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWorkspace"}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/usage":{"get":{"operationId":"get_usage","summary":"Spend this month, by provider, by member, by brand and by key.","description":"Every figure and every row covers the same set: all time, or one month, narrowed to one key or one brand when asked. `key` and `brand` need the Partner add-on (`402 addon_required` without it); a brand-bound key's figures are its brand's whether or not it asks, and another brand answers `403 brand_scope`. The answer echoes `key` and `brand` in force. `month_to_date_committed_usd` and `spend_cap_usd` are never narrowed: a cap is the workspace's. `delivery` is the one block that is not money: episodes assembled, files handed over and their bytes, counted and charged to nobody (`files` counts each file once, `issued` counts every time its link was signed, and a signed link is not a download). It is null when the figures are narrowed, because the rows behind it carry neither a key nor a brand.","tags":["Workspace"],"x-lotgen-scope":"read","parameters":[{"name":"month","in":"query","required":false,"schema":{"type":"string"},"description":"A month as YYYY-MM. Defaults to the current one."},{"name":"key","in":"query","required":false,"schema":{"type":"string"},"description":"A workspace API key id. Only takes that key asked for."},{"name":"brand","in":"query","required":false,"schema":{"type":"string"},"description":"A brand kit id. Only takes on lots filed under that brand. A brand-bound key may name its own brand and no other."}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/providers":{"get":{"operationId":"list_providers","summary":"The providers this workspace holds a key for, and what each can do.","tags":["Workspace"],"x-lotgen-scope":"read","responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/providers/health":{"get":{"operationId":"get_provider_health","summary":"Whether each provider's key still works, as last checked.","tags":["Workspace"],"x-lotgen-scope":"read","responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/providers/{id}/estimate":{"get":{"operationId":"estimate_render","summary":"What one take would cost on a provider, priced by its adapter.","tags":["Workspace"],"x-lotgen-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"model","in":"query","required":false,"schema":{"type":"string"},"description":"The model slug."},{"name":"duration_sec","in":"query","required":false,"schema":{"type":"string"},"description":"Seconds of video, for a video model."},{"name":"resolution","in":"query","required":false,"schema":{"type":"string"},"description":"The resolution tier."},{"name":"with_audio","in":"query","required":false,"schema":{"type":"string"},"description":"`true` when the take carries audio."},{"name":"text","in":"query","required":false,"schema":{"type":"string"},"description":"The script, for a speech provider, which prices by character."},{"name":"seconds","in":"query","required":false,"schema":{"type":"string"},"description":"Seconds of source audio, for a voice change."},{"name":"mode","in":"query","required":false,"schema":{"type":"string"},"description":"What the shot is made FROM: `t2v`, `i2v`, `ref2v` (reference pictures) or `v2v` (a reference clip). Each is a different endpoint on the models that offer more than one, and `resolved_model` names the one that would run."},{"name":"refs","in":"query","required":false,"schema":{"type":"string"},"description":"How many reference pictures the shot would mount. It decides the route as well as the incompatibility list — on a model with a reference-to-video endpoint, pictures are what sends a request there — so a quote without it prices text-to-video for a shot that will not be one."}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/providers/{id}/models":{"get":{"operationId":"list_provider_models","summary":"The models a provider's key can reach, as discovered from it.","tags":["Workspace"],"x-lotgen-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/providers/{id}/voices":{"get":{"operationId":"list_voices","summary":"The voices a speech provider offers this workspace.","tags":["Workspace"],"x-lotgen-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/providers/{id}/voices/refresh":{"post":{"operationId":"refresh_voices","summary":"Ask the worker to re-read the provider's voice list.","tags":["Workspace"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/models":{"get":{"operationId":"list_models","summary":"Every model across providers, with the workspace's stars and tags.","tags":["Workspace"],"x-lotgen-scope":"read","responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"update_model","summary":"Switch a model on or off for this workspace.","tags":["Workspace"],"x-lotgen-scope":"write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"provider":{"type":"string","minLength":1},"model_id":{"type":"string","minLength":1},"active":{"type":"boolean"}},"required":["provider","model_id","active"],"additionalProperties":false}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"forget_model","summary":"Forget a model this workspace discovered.","tags":["Workspace"],"x-lotgen-scope":"write","requestBody":{"required":false,"description":"This route reads its body by hand; the fields are named, not typed. See the SDK for their types.","content":{"application/json":{"schema":{"type":"object","properties":{"provider":{},"slug":{}}}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/models/star":{"put":{"operationId":"star_model","summary":"Star or unstar a model. Changes its order in pickers, nothing else.","tags":["Workspace"],"x-lotgen-scope":"write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"provider":{"type":"string","minLength":1},"model_id":{"type":"string","minLength":1},"starred":{"type":"boolean"}},"required":["provider","model_id","starred"],"additionalProperties":false}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/models/tags":{"post":{"operationId":"tag_model","summary":"Give a model a name this workspace calls it by.","tags":["Workspace"],"x-lotgen-scope":"write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"provider":{"type":"string","minLength":1},"model_id":{"type":"string","minLength":1,"maxLength":200},"tag":{"type":"string","minLength":1,"maxLength":40}},"required":["provider","model_id","tag"],"additionalProperties":false}}}},"responses":{"201":{"description":"Created."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"untag_model","summary":"Remove a model's workspace name.","tags":["Workspace"],"x-lotgen-scope":"write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"provider":{"type":"string","minLength":1},"model_id":{"type":"string","minLength":1,"maxLength":200},"tag":{"type":"string","minLength":1,"maxLength":40}},"required":["provider","model_id","tag"],"additionalProperties":false}}}},"responses":{"204":{"description":"Done."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/cinema/vocabulary":{"get":{"operationId":"cinema_vocabulary","summary":"The camera, lens and light words a shot's look is built from.","tags":["Workspace"],"x-lotgen-scope":"read","responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/shorts/presets":{"get":{"operationId":"list_short_presets","summary":"The vertical short formats a lot can be reframed into.","tags":["Workspace"],"x-lotgen-scope":"read","responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/upscale/tiers":{"get":{"operationId":"list_upscale_tiers","summary":"The upscale tiers, priced, for stills or video.","tags":["Workspace"],"x-lotgen-scope":"read","parameters":[{"name":"kind","in":"query","required":false,"schema":{"type":"string"},"description":"`still` or `video`."}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/video-edit/tiers":{"get":{"operationId":"list_video_edit_tiers","summary":"The video edit tiers, priced.","tags":["Workspace"],"x-lotgen-scope":"read","responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/video-region/tiers":{"get":{"operationId":"list_video_region_tiers","summary":"The video region edit tiers, priced.","tags":["Workspace"],"x-lotgen-scope":"read","responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/search":{"get":{"operationId":"search","summary":"Search takes across every lot by prompt, tag and provider.","tags":["Takes"],"x-lotgen-scope":"read","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":200}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/takes":{"get":{"operationId":"search_takes","summary":"The library: kept takes across lots, filtered and banded. A brand-bound key sees only its brand's, and a key sees nothing unbranded.","tags":["Takes"],"x-lotgen-scope":"read","parameters":[{"name":"kept","in":"query","required":false,"schema":{"type":"string"},"description":"`false` widens from the curation to every take."},{"name":"lot","in":"query","required":false,"schema":{"type":"string"},"description":"A lot id."},{"name":"studio","in":"query","required":false,"schema":{"type":"string"},"description":"The studio that built the lot."},{"name":"provider","in":"query","required":false,"schema":{"type":"string"},"description":"A provider id."},{"name":"client","in":"query","required":false,"schema":{"type":"string"},"description":"A client tag."},{"name":"media","in":"query","required":false,"schema":{"type":"string"},"description":"`video` or `still`."},{"name":"aspect","in":"query","required":false,"schema":{"type":"string"},"description":"An aspect band."},{"name":"length","in":"query","required":false,"schema":{"type":"string"},"description":"A length band."},{"name":"cost","in":"query","required":false,"schema":{"type":"string"},"description":"A cost band."},{"name":"q","in":"query","required":false,"schema":{"type":"string"},"description":"Free text."},{"name":"sort","in":"query","required":false,"schema":{"type":"string"},"description":"`recent`, `oldest`, `cost` or `duration`."},{"name":"limit","in":"query","required":false,"schema":{"type":"string"},"description":"Page size, 1 to 200. Default 24."},{"name":"offset","in":"query","required":false,"schema":{"type":"string"},"description":"Page start."},{"name":"posters","in":"query","required":false,"schema":{"type":"string"},"description":"`true` to include signed poster URLs."}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects":{"get":{"operationId":"list_projects","summary":"List lots, newest first. A brand-bound key sees only its brand's, and a key sees nothing unbranded.","tags":["Lots"],"x-lotgen-scope":"read","parameters":[{"name":"archived","in":"query","required":false,"schema":{"type":"string"},"description":"`true` for archived only, `any` for both. Default live only."},{"name":"q","in":"query","required":false,"schema":{"type":"string"},"description":"Free text over names and client tags."},{"name":"client_tag","in":"query","required":false,"schema":{"type":"string"},"description":"One client tag."},{"name":"provider","in":"query","required":false,"schema":{"type":"string"},"description":"The lot's default provider."},{"name":"studio","in":"query","required":false,"schema":{"type":"string"},"description":"The studio that built it."},{"name":"series","in":"query","required":false,"schema":{"type":"string"},"description":"The series it is an episode of."},{"name":"sort","in":"query","required":false,"schema":{"type":"string"},"description":"`recent`, `created`, `name` or `scenes`."},{"name":"limit","in":"query","required":false,"schema":{"type":"string"},"description":"Page size."},{"name":"offset","in":"query","required":false,"schema":{"type":"string"},"description":"Page start."},{"name":"posters","in":"query","required":false,"schema":{"type":"string"},"description":"`true` to include a signed poster URL per lot."},{"name":"poster_grid","in":"query","required":false,"schema":{"type":"string"},"description":"`true` for a contact-sheet grid per lot, on top of posters."}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"create_project","summary":"Create an empty lot.","description":"A brand-bound key's lot carries the key's brand and the kit's name as its client tag; asking for another brand is refused.","tags":["Lots"],"x-lotgen-scope":"write","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProject"}}}},"responses":{"201":{"description":"Created."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/from-preset":{"post":{"operationId":"create_from_preset","summary":"Create a lot from a preset, shots included.","tags":["Lots"],"x-lotgen-scope":"write","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFromPreset"}}}},"responses":{"201":{"description":"Created."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{id}":{"get":{"operationId":"get_project","summary":"One lot with its shots, takes and brief.","tags":["Lots"],"x-lotgen-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"update_project","summary":"Rename, retag, recap, relook or archive a lot.","tags":["Lots"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProject"}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"delete_project","summary":"Delete a lot and everything under it.","tags":["Lots"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Done."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{id}/duplicate":{"post":{"operationId":"duplicate_project","summary":"Copy a lot's shots and brand into a new lot. Takes are not copied.","tags":["Lots"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"Created."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{id}/keep":{"post":{"operationId":"keep_project","summary":"Keep an archived lot fifteen days longer, never past thirty.","tags":["Lots"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{id}/scenes":{"get":{"operationId":"list_scenes","summary":"The shots of a lot, in order.","tags":["Shots"],"x-lotgen-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"add_scene","summary":"Add a shot to a lot.","tags":["Shots"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateScene"}}}},"responses":{"201":{"description":"Created."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{id}/scenes/reorder":{"post":{"operationId":"reorder_scenes","summary":"Put a lot's shots in a new order.","tags":["Shots"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReorderScenes"}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{id}/jobs":{"get":{"operationId":"list_project_jobs","summary":"Every take of a lot.","tags":["Takes"],"x-lotgen-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{id}/assets":{"get":{"operationId":"list_project_assets","summary":"Every asset of a lot: takes, references, start frames.","tags":["Assets"],"x-lotgen-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{id}/refs":{"post":{"operationId":"add_project_refs","summary":"Upload a reference picture or clip for a lot.","description":"Multipart, one `file`. A picture is boxed to 1920 on its long edge and kept under 12 MB. A clip (`video/mp4`, `video/quicktime`, `video/webm`) is stored as delivered and measured after the write; its `duration_sec`, `width`, `height` and `fps` land on the asset, and the workspace's `video_ref_max_bytes` and `video_ref_max_sec` refuse it by name when it is over. A clip too big for a form (about 12 MB) goes through `POST /uploads` in parts and finishes at `POST /projects/:id/refs/from-upload`.","tags":["Assets"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"array","items":{"type":"string","format":"binary"}}}}}}},"responses":{"201":{"description":"Created."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{id}/refs/from-upload":{"post":{"operationId":"finish_project_ref_upload","summary":"Finish a resumable clip upload as a lot reference.","description":"Assembles the parts sent to `PUT /uploads/{upload_id}/parts/{n}`, measures the clip with ffprobe and makes it a `ref` asset on the lot. Refused by name, and the parts deleted, when what arrived is over `video_ref_max_bytes` or the clip runs past `video_ref_max_sec`; `bytes`/`max_bytes` or `seconds`/`max_seconds` ride beside the sentence.","tags":["Assets"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FromUpload"}}}},"responses":{"201":{"description":"Created."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/uploads":{"post":{"operationId":"begin_upload","summary":"Begin a resumable clip upload.","description":"The first of three requests for a clip too big for a form. Say what the file is and how big it will be; `size` over the workspace's `video_ref_max_bytes` is refused here, before a byte moves. The answer carries `key`, `upload_id`, `part_bytes` (8 MiB) and `parts`, the count to send. Then `PUT /uploads/{upload_id}/parts/{n}?key=...` each part, then finish at `POST /projects/{id}/refs/from-upload` or `POST /scenes/{id}/refs/from-upload`. Every request stays under 32 MiB, so it works wherever this API is hosted; a failed part is re-sent on its own.","tags":["Assets"],"x-lotgen-scope":"write","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BeginUpload"}}}},"responses":{"201":{"description":"Created."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/uploads/{upload_id}/parts/{n}":{"put":{"operationId":"put_upload_part","summary":"Send one part of a resumable clip upload.","description":"The raw bytes of part `n` (1-based) as the body, exactly `part_bytes` long for every part but the last. Answers the part's `etag`; nothing else needs keeping, the finish reads the part list off the bucket.","tags":["Assets"],"x-lotgen-scope":"write","parameters":[{"name":"upload_id","in":"path","required":true,"schema":{"type":"string"}},{"name":"n","in":"path","required":true,"schema":{"type":"string"}},{"name":"key","in":"query","required":false,"schema":{"type":"string"},"description":"The key `POST /uploads` returned."}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/uploads/{upload_id}":{"delete":{"operationId":"abort_upload","summary":"Give up on a resumable clip upload; the parts go.","tags":["Assets"],"x-lotgen-scope":"write","parameters":[{"name":"upload_id","in":"path","required":true,"schema":{"type":"string"}},{"name":"key","in":"query","required":false,"schema":{"type":"string"},"description":"The key `POST /uploads` returned."}],"responses":{"204":{"description":"Done."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{id}/ref-packs":{"get":{"operationId":"list_ref_packs","summary":"The reference packs of a lot.","tags":["Assets"],"x-lotgen-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"create_ref_pack","summary":"Create a reference pack on a lot.","tags":["Assets"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRefPack"}}}},"responses":{"201":{"description":"Created."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{id}/render-pending":{"post":{"operationId":"render_project","summary":"Render every shot of a lot that has no finished take.","description":"With `dry_run` it is a quote and needs only `read`; without it every pending shot is queued, which needs `render` and counts as one render against the key's minute. Shots that continue from an unfinished shot are held back and named.","tags":["Takes"],"x-lotgen-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenderPending"}}}},"responses":{"202":{"description":"Accepted: the job is queued. Poll `GET /v1/jobs/{id}`."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{id}/reframe":{"post":{"operationId":"reframe_project","summary":"Reframe every finished shot of a lot to another aspect, in process.","tags":["Assets"],"x-lotgen-scope":"render","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"description":"This route reads its body by hand; the fields are named, not typed. See the SDK for their types.","content":{"application/json":{"schema":{"type":"object","properties":{"aspect":{},"focus":{}}}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{id}/assemble":{"post":{"operationId":"assemble_episode","summary":"Stitch a lot's beats into one finished video at the lot's own aspect, on our worker, for nothing.","description":"Every beat is held for its voice line (a still is animated, a clip padded or trimmed), the voice laid over it, word-synced captions burned from the voice's own timing, and one MP4 encoded for Shorts, Reels and TikTok. Answers 202 with an `assembly_id` to poll and the plan: `beats`, and `waiting` for any beat that will stop it (a narrated shot with no voice, a shot with no picture, a 16:9 clip that needs the free reframe first). `captions` is required and has no default; `none` is a plain stitch (no words, no voice needed, each clip its own length, a still held `still_hold_sec`). `aspect_ratio` is 9:16, 16:9 or 1:1, defaulting to the aspect the lot's video shots agree on. `transition` is `cut` (default) or `crossfade` over `sec` (0.2 to 1.5, default 0.5); a beat under twice the fade is refused by name. With `dry_run` it is the plan alone and needs only `read`. The finished file is `episode` on export.json, `episode.mp4` in the pack and in Drive, and first on a review link.","tags":["Lots"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"captions":{"type":"string","enum":["burned","sidecar","both","none"]},"aspect_ratio":{"type":"string","enum":["9:16","16:9","1:1"]},"caption_style":{"type":"string","minLength":1,"maxLength":40,"default":"heavy"},"caption_overrides":{"type":"object","properties":{"font":{"type":"string","minLength":1,"maxLength":60},"bold":{"type":"boolean"},"size_pct":{"type":"number","minimum":0.015,"maximum":0.12},"case":{"type":"string","enum":["upper","sentence"]},"fill":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"stroke":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"stroke_pct":{"type":"number","minimum":0,"maximum":0.02},"active":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"position_pct":{"type":"number","minimum":0.14,"maximum":0.65},"words_per_page":{"type":"integer","minimum":1,"maximum":8}},"additionalProperties":false,"default":{}},"loudness_target":{"type":"number","enum":[-14,-16],"default":-14},"preset":{"type":"string","enum":["medium","veryfast"],"default":"medium"},"bed_asset_id":{"type":"string","format":"uuid"},"end_card":{"type":"object","properties":{"series":{"type":"string","minLength":1,"maxLength":80},"episode":{"type":"integer","minimum":1,"maximum":9999},"cta":{"type":"string","minLength":1,"maxLength":120},"logo":{"type":"boolean","default":true}},"additionalProperties":false},"hook_card":{"type":"string","minLength":1,"maxLength":120},"breath_sec":{"type":"number","minimum":0,"maximum":1.5,"default":0.3},"still_hold_sec":{"type":"number","minimum":0.5,"maximum":15},"transition":{"type":"object","properties":{"kind":{"type":"string","enum":["cut","crossfade"]},"sec":{"type":"number","minimum":0.2,"maximum":1.5}},"required":["kind"],"additionalProperties":false},"dry_run":{"type":"boolean","default":false}},"required":["captions"],"additionalProperties":false}}}},"responses":{"202":{"description":"Accepted: the job is queued. Poll `GET /v1/jobs/{id}`."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{id}/finish":{"post":{"operationId":"finish_lot","summary":"Stitch the lot on the worker once every shot has a take, for nothing.","description":"Stores an assemble body on the lot (`assemble`: the same fields as `POST /projects/:id/assemble`, no `dry_run`). Rendering is not part of it: render the shots through the doors that quote first. On the tick after the last render or pass on the lot has settled, the worker plans the assembly exactly as the assemble door would; if every beat is ready it queues one assembly and writes `assembly_id` onto `finish`, and if a beat can never be ready on its own (a shot with no take and nothing in flight) it writes `error` naming the first reason and stops. One attempt per plan: POST again to retry, DELETE to forget. The lot's aspect and its standing caption overrides are resolved at stitch time. `GET /projects/:id` carries `finish`; the partner event is `assembly.done` or `assembly.failed` with `finish: true`.","tags":["Lots"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"assemble":{"type":"object","properties":{"captions":{"type":"string","enum":["burned","sidecar","both","none"]},"aspect_ratio":{"type":"string","enum":["9:16","16:9","1:1"]},"caption_style":{"type":"string","minLength":1,"maxLength":40,"default":"heavy"},"caption_overrides":{"type":"object","properties":{"font":{"type":"string","minLength":1,"maxLength":60},"bold":{"type":"boolean"},"size_pct":{"type":"number","minimum":0.015,"maximum":0.12},"case":{"type":"string","enum":["upper","sentence"]},"fill":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"stroke":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"stroke_pct":{"type":"number","minimum":0,"maximum":0.02},"active":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"position_pct":{"type":"number","minimum":0.14,"maximum":0.65},"words_per_page":{"type":"integer","minimum":1,"maximum":8}},"additionalProperties":false,"default":{}},"loudness_target":{"type":"number","enum":[-14,-16],"default":-14},"preset":{"type":"string","enum":["medium","veryfast"],"default":"medium"},"bed_asset_id":{"type":"string","format":"uuid"},"end_card":{"type":"object","properties":{"series":{"type":"string","minLength":1,"maxLength":80},"episode":{"type":"integer","minimum":1,"maximum":9999},"cta":{"type":"string","minLength":1,"maxLength":120},"logo":{"type":"boolean","default":true}},"additionalProperties":false},"hook_card":{"type":"string","minLength":1,"maxLength":120},"breath_sec":{"type":"number","minimum":0,"maximum":1.5,"default":0.3},"still_hold_sec":{"type":"number","minimum":0.5,"maximum":15},"transition":{"type":"object","properties":{"kind":{"type":"string","enum":["cut","crossfade"]},"sec":{"type":"number","minimum":0.2,"maximum":1.5}},"required":["kind"],"additionalProperties":false}},"required":["captions"],"additionalProperties":false}},"required":["assemble"],"additionalProperties":false}}}},"responses":{"202":{"description":"Accepted: the job is queued. Poll `GET /v1/jobs/{id}`."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"cancel_finish","summary":"Forget the lot's finish plan.","tags":["Lots"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{id}/assemblies":{"get":{"operationId":"list_assemblies","summary":"A lot's assemblies, newest first.","tags":["Lots"],"x-lotgen-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/assemblies/{assemblyId}":{"get":{"operationId":"get_assembly","summary":"One assembly: status, resolved params, result (beats, probe, platform rows, warnings) and the finished episode with a signed URL.","tags":["Lots"],"x-lotgen-scope":"read","parameters":[{"name":"assemblyId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/caption-styles":{"get":{"operationId":"list_caption_styles","summary":"The caption styles an assembly can burn, as data.","tags":["Lots"],"x-lotgen-scope":"read","responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/text-layer":{"get":{"operationId":"list_text_layer","summary":"The text layer's modes, the fonts the worker ships, and the default card's classes and CSS variables.","tags":["Shots"],"x-lotgen-scope":"read","responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/scenes/{id}/overlay":{"get":{"operationId":"get_text_overlay","summary":"A still's text overlay: html, css, tokens, render state, and the rendered PNG with a signed URL.","tags":["Shots"],"x-lotgen-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"set_text_overlay","summary":"Write or replace a still's words as an overlay, rendered on our worker for nothing.","description":"Stills only. Give `html` (and optional `css`) or `lines` for the default card; `tokens` set the face, weight, size, fill, stroke and position and default to the heavy caption look. Validated at the door: no scripts, no src=, href= or url(), 64 KB. The worker renders a transparent PNG at the still's own pixel size within a tick; the export ships `NN.composited.<ext>` beside the clean still and the assembly lays the PNG over the beat. `apply_to_captions` also writes the tokens onto the lot's caption overrides for the next assembly. Answers 202 with the overlay and any warnings (a font the worker does not ship, a baked still, no still yet).","tags":["Shots"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"html":{"type":"string","maxLength":65536},"css":{"type":"string","maxLength":65536,"default":""},"lines":{"type":"array","items":{"type":"string","minLength":1,"maxLength":200},"minItems":1,"maxItems":12},"tokens":{"type":"object","properties":{"font":{"type":"string","minLength":1,"maxLength":60,"default":"Montserrat"},"weight":{"type":"number","enum":[400,500,700,900],"default":900},"size_pct":{"type":"number","minimum":0.015,"maximum":0.2,"default":0.05},"fill":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","default":"#FFFFFF"},"stroke":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","default":"#000000"},"stroke_pct":{"type":"number","minimum":0,"maximum":0.02,"default":0.004},"position_pct":{"type":"number","minimum":0.05,"maximum":0.95,"default":0.6},"safe_zone":{"type":"string","enum":["reels","none"],"default":"reels"},"version":{"type":"number","const":1,"default":1}},"additionalProperties":false,"default":{}},"apply_to_captions":{"type":"boolean","default":false}},"additionalProperties":false}}}},"responses":{"202":{"description":"Accepted: the job is queued. Poll `GET /v1/jobs/{id}`."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"delete_text_overlay","summary":"Remove a still's text overlay and its rendered PNG.","tags":["Shots"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Done."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{id}/explainer/voice":{"post":{"operationId":"voice_explainer","summary":"Narrate an explainer lot's beats with a speech provider.","tags":["Studios"],"x-lotgen-scope":"render","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"description":"This route reads its body by hand; the fields are named, not typed. See the SDK for their types.","content":{"application/json":{"schema":{"type":"object","properties":{"voice_id":{},"provider":{},"dry_run":{}}}}}},"responses":{"202":{"description":"Accepted: the job is queued. Poll `GET /v1/jobs/{id}`."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{id}/explainer/mix":{"post":{"operationId":"mix_explainer","summary":"Mix an explainer lot's narration under its pictures.","tags":["Studios"],"x-lotgen-scope":"render","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{id}/faceless/voice":{"post":{"operationId":"voice_faceless","summary":"Narrate a faceless episode's beats; refused by name on an on-screen-text structure.","tags":["Studios"],"x-lotgen-scope":"render","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"description":"This route reads its body by hand; the fields are named, not typed. See the SDK for their types.","content":{"application/json":{"schema":{"type":"object","properties":{"voice_id":{},"provider":{}}}}}},"responses":{"202":{"description":"Accepted: the job is queued. Poll `GET /v1/jobs/{id}`."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{id}/faceless/mix":{"post":{"operationId":"mix_faceless","summary":"Mix a faceless episode's clips under their lines; stills are reported, the assembly animates them.","tags":["Studios"],"x-lotgen-scope":"render","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{id}/draft":{"post":{"operationId":"draft_lines","summary":"Ask a text model to draft the lot's lines; one job, the answer on its result, nothing applied.","description":"A text model (Claude, Gemini or GPT on the workspace's own key) drafts a line per beat from the lot's brief, the structure's reference map and each shot's picture. The draft lands on the job's `result` (`lines` by scene id and index, `notes`, `missing`, `usage`) and changes nothing on the lot: apply a line with `PATCH /scenes/:id` once a person or an agent approves it. Every result says `draft: true` and carries the note. `dry_run` prices the exact prompt and builds nothing.","tags":["Studios"],"x-lotgen-scope":"render","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"provider":{"type":"string","enum":["import","cut","kling","omni","veo","seedance","fake","gateway","fal","evolink","nano","seedream","openai","eleven","minimax","bfl","bfl_video","alibaba","xai","runway","runway_image","anthropic","openai_text","gemini"]},"model":{"type":"string","minLength":1,"maxLength":200},"scene_ids":{"type":"array","items":{"type":"string","format":"uuid"},"minItems":1,"maxItems":24},"topic":{"type":"string","maxLength":300},"audience":{"type":"string","maxLength":200},"notes":{"type":"string","maxLength":2000},"dry_run":{"type":"boolean","default":false}},"additionalProperties":false}}}},"responses":{"202":{"description":"Accepted: the job is queued. Poll `GET /v1/jobs/{id}`."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{id}/export":{"get":{"operationId":"export_project","summary":"A zip of the lot's kept takes, with a provenance file.","description":"`project.json` and `CONTENT_CREDENTIALS.json` name the lot's brand kit and the key that made the lot, and per shot the door (`via`) and the key that asked for the take that made the file.","tags":["Lots"],"x-lotgen-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"aspect","in":"query","required":false,"schema":{"type":"string"},"description":"Export the reframed takes of one aspect instead of the originals."},{"name":"narrated","in":"query","required":false,"schema":{"type":"string"},"description":"`true` to prefer narrated takes."}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{id}/export.json":{"get":{"operationId":"export_project_json","summary":"The export's manifest alone, as JSON.","description":"Signed URLs per shot, the timeline inline, and who made it: `brand` and `api_key` for the lot, `via` and `api_key` per shot.","tags":["Lots"],"x-lotgen-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{id}/export/timeline.xml":{"get":{"operationId":"export_timeline","summary":"The lot as an editing timeline, for somebody who has the media.","tags":["Lots"],"x-lotgen-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"aspect","in":"query","required":false,"schema":{"type":"string"},"description":"Which reframed aspect the timeline cuts."},{"name":"narrated","in":"query","required":false,"schema":{"type":"string"},"description":"`true` to cut narrated takes."}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{id}/export/drive":{"get":{"operationId":"list_drive_exports","summary":"The Drive deliveries of a lot.","tags":["Drive"],"x-lotgen-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"export_to_drive","summary":"Deliver a lot's kept takes to the connected Drive.","tags":["Drive"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"mode":{"type":"string","enum":["mounted","all_takes"],"default":"mounted"},"folder_id":{"type":"string","minLength":1,"maxLength":200}},"additionalProperties":false}}}},"responses":{"202":{"description":"Accepted: the job is queued. Poll `GET /v1/jobs/{id}`."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{id}/review-links":{"get":{"operationId":"list_review_links","summary":"The review links open on a lot.","tags":["Collections"],"x-lotgen-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"create_review_link","summary":"Open a review link on a lot. The URL a person opens is returned.","tags":["Collections"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateReviewLink"}}}},"responses":{"201":{"description":"Created."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{id}/review-decisions":{"get":{"operationId":"list_review_decisions","summary":"What reviewers decided about a lot's takes.","tags":["Collections"],"x-lotgen-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{id}/key-bindings":{"get":{"operationId":"list_key_bindings","summary":"Which provider key a lot renders on, per platform.","tags":["Admin"],"x-lotgen-scope":"admin","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{id}/key-bindings/{platform}":{"put":{"operationId":"bind_project_key","summary":"Choose the provider key a lot renders on for one platform.","tags":["Admin"],"x-lotgen-scope":"admin","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"platform","in":"path","required":true,"schema":{"type":"string"},"description":"A platform id."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindProjectKey"}}}},"responses":{"204":{"description":"Done."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/scenes/{id}":{"get":{"operationId":"get_scene","summary":"One shot, with the prompt exactly as it will be sent.","tags":["Shots"],"x-lotgen-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"update_scene","summary":"Change a shot's prompt, model, duration, look or references.","tags":["Shots"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateScene"}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"delete_scene","summary":"Delete a shot and its takes.","tags":["Shots"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Done."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/scenes/{id}/duplicate":{"post":{"operationId":"duplicate_scene","summary":"Copy a shot within its lot.","tags":["Shots"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"Created."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/scenes/{id}/winner":{"post":{"operationId":"select_variant","summary":"Pick which take of a shot is the one.","tags":["Takes"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SelectWinner"}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/scenes/{id}/jobs":{"get":{"operationId":"list_scene_jobs","summary":"The takes of one shot.","tags":["Takes"],"x-lotgen-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/scenes/{id}/assets":{"get":{"operationId":"list_scene_assets","summary":"The assets of one shot.","tags":["Assets"],"x-lotgen-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/scenes/{id}/refs":{"post":{"operationId":"add_scene_refs","summary":"Upload a reference picture or clip for a shot.","description":"Multipart, one `file`; the same rules as `POST /projects/:id/refs`. A clip's measured `duration_sec` is what a reference-to-video quote bills and what a model's source window is checked against.","tags":["Assets"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"array","items":{"type":"string","format":"binary"}}}}}}},"responses":{"201":{"description":"Created."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/scenes/{id}/refs/from-url":{"post":{"operationId":"set_scene_refs","summary":"Attach a reference to a shot by URL.","description":"A picture is fetched, boxed and kept under 12 MB. A clip streams from the far host into storage under the workspace's `video_ref_max_bytes` and is measured after the write against `video_ref_max_sec`; it is never held whole. Private and link-local hosts are refused.","tags":["Assets"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttachRefUrl"}}}},"responses":{"201":{"description":"Created."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/scenes/{id}/refs/from-upload":{"post":{"operationId":"finish_scene_ref_upload","summary":"Finish a resumable clip upload as a shot reference.","description":"As `POST /projects/:id/refs/from-upload`, on one shot.","tags":["Assets"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FromUpload"}}}},"responses":{"201":{"description":"Created."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/scenes/{id}/import-take":{"post":{"operationId":"import_take","summary":"Make a clip you own this shot's take, at $0.","description":"Names a video reference this workspace holds (`ref_asset_id`: attached with `POST /scenes/:id/refs`, the resumable put, or a Drive import) and enqueues a job under the `import` provider. The worker copies the clip under the job (an h264 mp4 as it is; anything else re-encoded to h264 mp4, capped at 1920 on the long edge, so the take plays everywhere a take is shown), measures it, and the job succeeds with `actual_usd` 0 and provenance `synthetic: false`. Review, export, the mix and the assembly then find it exactly as they find a render, and the pack's `CONTENT_CREDENTIALS.json` marks it as the brand's own footage. Only a video shot takes one. The clip's aspect is not refused here: `aspect_note` says when it differs from the shot's, and the assembly asks for `POST /projects/:id/reframe` before it will place a 16:9 clip in a 9:16 episode.","tags":["Shots"],"x-lotgen-scope":"render","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportTake"}}}},"responses":{"202":{"description":"Accepted: the job is queued. Poll `GET /v1/jobs/{id}`."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/assets/{id}/trim":{"post":{"operationId":"trim_take","summary":"Keep a range of a take as a new take of the same shot, at $0.","description":"`start_sec` and an optional `end_sec` (the take's end when left out), in seconds from the take's start, checked against the take's measured length; a range under one second is refused, and only a rendered clip can be cut. Enqueues a job under the `cut` provider: the worker cuts it with ffmpeg inside a tick, frame-accurate and re-encoded to the h264 mp4 every take is, measures it, and the job succeeds with `actual_usd` 0. The cut is mounted; the original take stays beside it. Provenance inherits the source take's `synthetic` flag, because a cut of a generated clip is still generated.","tags":["Shots"],"x-lotgen-scope":"render","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrimTake"}}}},"responses":{"202":{"description":"Accepted: the job is queued. Poll `GET /v1/jobs/{id}`."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/scenes/{id}/split":{"post":{"operationId":"split_shot","summary":"Split a shot at a second: keep the head at $0, add a shot for the rest.","description":"One bad second in a long take without paying for the whole clip again. `at_sec` names the second (at least one second from either end). The head of the take (the mounted one, or `take_asset_id`) is kept as a new take of THIS shot by a trim job under the `cut` provider, and a new shot is inserted right after this one that opens on the exact frame at the cut (stored as its opening frame), with the same prompt, model, settings and references, for the remaining seconds clamped to what the model sells. The new shot is NOT rendered here; render it once its prompt says what was wrong, then assemble the lot to stitch head and tail. Answers 202 with `trim_job`, `new_scene`, `tail_duration_sec` and `start_frame`.","tags":["Shots"],"x-lotgen-scope":"render","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SplitShot"}}}},"responses":{"202":{"description":"Accepted: the job is queued. Poll `GET /v1/jobs/{id}`."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/scenes/{id}/ref-pack":{"post":{"operationId":"apply_ref_pack","summary":"Apply a reference pack to a shot.","tags":["Assets"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyRefPack"}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/scenes/{id}/audio":{"post":{"operationId":"add_scene_audio","summary":"Upload the performance a voice-change shot re-voices, or a track for the episode's music bed.","description":"mp3, m4a, wav or ogg, up to 12 MB; the duration is measured and stored. The asset's id is what `bed_asset_id` on `POST /projects/:id/assemble` takes: the track is laid under the voice and ducked into `episode.music.mp4`. You warrant the rights to anything you upload here; LOTGEN records no licence for it.","tags":["Assets"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"array","items":{"type":"string","format":"binary"}}}}}}},"responses":{"201":{"description":"Created."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/scenes/{id}/start-frame":{"post":{"operationId":"upload_start_frame","summary":"Upload a shot's start frame.","tags":["Assets"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"array","items":{"type":"string","format":"binary"}}}}}}},"responses":{"201":{"description":"Created."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"clear_start_frame","summary":"Clear a shot's start frame.","tags":["Assets"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Done."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/scenes/{id}/start-frame/from-asset":{"post":{"operationId":"set_start_frame","summary":"Use an existing asset as a shot's start frame.","tags":["Assets"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"asset_id":{"type":"string","format":"uuid"}},"required":["asset_id"],"additionalProperties":false}}}},"responses":{"201":{"description":"Created."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/scenes/{id}/render":{"post":{"operationId":"render_scene","summary":"Render one shot. Spends on the workspace's provider key.","description":"`dry_run` in the body or as `?dry_run=true` returns the estimate instead and counts as a read.","tags":["Takes"],"x-lotgen-scope":"render","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenderScene"}}}},"responses":{"202":{"description":"Accepted: the job is queued. Poll `GET /v1/jobs/{id}`."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/scenes/{id}/recipe":{"post":{"operationId":"originate_runway_recipe","summary":"Run a Runway recipe from a shot's brief, as a new take.","tags":["Takes"],"x-lotgen-scope":"render","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"description":"This route reads its body by hand; the fields are named, not typed. See the SDK for their types.","content":{"application/json":{"schema":{"type":"object","properties":{"recipe":{},"resolution":{},"aspect_ratio":{},"duration_sec":{},"prompt":{},"product_asset_ids":{},"character_asset_id":{},"dry_run":{}}}}}},"responses":{"202":{"description":"Accepted: the job is queued. Poll `GET /v1/jobs/{id}`."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/jobs":{"get":{"operationId":"list_jobs","summary":"Recent takes across the workspace.","tags":["Takes"],"x-lotgen-scope":"read","parameters":[{"name":"within_ms","in":"query","required":false,"schema":{"type":"string"},"description":"Only takes created within this many milliseconds."}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/jobs/{id}":{"get":{"operationId":"get_job","summary":"One take: status, cost, output, and why it failed if it did.","tags":["Takes"],"x-lotgen-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"label_take","summary":"Label a take, or keep or retire it.","tags":["Takes"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateJob"}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"delete_job","summary":"Delete a take and its media.","tags":["Takes"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Done."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/jobs/{id}/cancel":{"post":{"operationId":"cancel_job","summary":"Cancel a take that has not finished.","tags":["Takes"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/jobs/{id}/recheck":{"post":{"operationId":"recheck_take","summary":"Ask the worker to poll a stuck take's provider once more.","tags":["Takes"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"202":{"description":"Accepted: the job is queued. Poll `GET /v1/jobs/{id}`."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/takes/export":{"post":{"operationId":"export_takes","summary":"A zip of chosen takes from any lots.","tags":["Takes"],"x-lotgen-scope":"write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"job_ids":{"type":"array","items":{"type":"string","format":"uuid"},"minItems":1,"maxItems":500},"name":{"type":"string","maxLength":120}},"required":["job_ids"],"additionalProperties":false}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/assets/{id}":{"get":{"operationId":"get_asset","summary":"One asset's record.","tags":["Assets"],"x-lotgen-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"delete_asset","summary":"Delete an asset.","tags":["Assets"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Done."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/assets/{id}/url":{"get":{"operationId":"get_asset_url","summary":"A signed URL for one asset's bytes, valid fifteen minutes.","tags":["Assets"],"x-lotgen-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"download","in":"query","required":false,"schema":{"type":"string"},"description":"`true` for an attachment disposition."}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/assets/{id}/creator":{"post":{"operationId":"cast_creator","summary":"Cast a rendered take as the workspace's creator.","tags":["Assets"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"Created."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/assets/{id}/upscale":{"post":{"operationId":"upscale_take","summary":"Upscale a take.","tags":["Assets"],"x-lotgen-scope":"render","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"description":"This route reads its body by hand; the fields are named, not typed. See the SDK for their types.","content":{"application/json":{"schema":{"type":"object","properties":{"factor":{},"tier":{},"resolution":{},"dry_run":{}}}}}},"responses":{"202":{"description":"Accepted: the job is queued. Poll `GET /v1/jobs/{id}`."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/assets/{id}/inpaint":{"post":{"operationId":"erase_from_take","summary":"Erase a masked region from a still.","tags":["Assets"],"x-lotgen-scope":"render","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"description":"This route reads its body by hand; the fields are named, not typed. See the SDK for their types.","content":{"application/json":{"schema":{"type":"object","properties":{"mask_asset_id":{},"tier":{},"prompt":{},"dry_run":{}}}}}},"responses":{"202":{"description":"Accepted: the job is queued. Poll `GET /v1/jobs/{id}`."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/assets/{id}/edit":{"post":{"operationId":"edit_still","summary":"Edit a still by instruction.","tags":["Assets"],"x-lotgen-scope":"render","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"description":"This route reads its body by hand; the fields are named, not typed. See the SDK for their types.","content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{},"tier":{},"dry_run":{}}}}}},"responses":{"202":{"description":"Accepted: the job is queued. Poll `GET /v1/jobs/{id}`."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/assets/{id}/lipsync":{"post":{"operationId":"lipsync_take","summary":"Sync a take's mouth to an audio asset.","tags":["Assets"],"x-lotgen-scope":"render","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"description":"This route reads its body by hand; the fields are named, not typed. See the SDK for their types.","content":{"application/json":{"schema":{"type":"object","properties":{"audio_asset_id":{},"tier":{},"dry_run":{}}}}}},"responses":{"202":{"description":"Accepted: the job is queued. Poll `GET /v1/jobs/{id}`."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/assets/{id}/narrate":{"post":{"operationId":"narrate_take","summary":"Mix an audio asset under a take, in process.","tags":["Assets"],"x-lotgen-scope":"render","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"description":"This route reads its body by hand; the fields are named, not typed. See the SDK for their types.","content":{"application/json":{"schema":{"type":"object","properties":{"audio_asset_id":{}}}}}},"responses":{"201":{"description":"Created."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/assets/{id}/region":{"post":{"operationId":"clean_plate_take","summary":"Replace a region of a video by prompt.","tags":["Assets"],"x-lotgen-scope":"render","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"description":"This route reads its body by hand; the fields are named, not typed. See the SDK for their types.","content":{"application/json":{"schema":{"type":"object","properties":{"tier":{},"aspect":{},"resolution":{},"mask_prompt":{},"background_prompt":{},"dry_run":{}}}}}},"responses":{"202":{"description":"Accepted: the job is queued. Poll `GET /v1/jobs/{id}`."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/assets/{id}/restyle":{"post":{"operationId":"restyle_take","summary":"Restyle a take by preset or instruction.","tags":["Assets"],"x-lotgen-scope":"render","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"description":"This route reads its body by hand; the fields are named, not typed. See the SDK for their types.","content":{"application/json":{"schema":{"type":"object","properties":{"preset":{},"note":{},"prompt":{},"instruction":{},"tier":{},"resolution":{},"dry_run":{}}}}}},"responses":{"202":{"description":"Accepted: the job is queued. Poll `GET /v1/jobs/{id}`."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/assets/{id}/recipe":{"post":{"operationId":"run_runway_recipe","summary":"Run a Runway recipe on a take.","tags":["Assets"],"x-lotgen-scope":"render","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"description":"This route reads its body by hand; the fields are named, not typed. See the SDK for their types.","content":{"application/json":{"schema":{"type":"object","properties":{"recipe":{},"resolution":{},"duration_sec":{},"prompt":{},"target_language":{},"product_asset_ids":{},"original_asset_id":{},"dry_run":{}}}}}},"responses":{"202":{"description":"Accepted: the job is queued. Poll `GET /v1/jobs/{id}`."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/creators":{"get":{"operationId":"list_creators","summary":"The workspace's cast creators.","tags":["Assets"],"x-lotgen-scope":"read","responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/creators/{id}":{"patch":{"operationId":"update_creator","summary":"Rename or retire a creator.","tags":["Assets"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}]},"retired":{"type":"boolean"}},"additionalProperties":false}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ref-packs/{id}":{"get":{"operationId":"get_ref_pack","summary":"One reference pack and its assets.","tags":["Assets"],"x-lotgen-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"delete_ref_pack","summary":"Delete a reference pack.","tags":["Assets"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Done."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ref-packs/{id}/assets":{"post":{"operationId":"add_ref_pack_asset","summary":"Add an asset to a reference pack.","tags":["Assets"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddRefPackAsset"}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ref-packs/{id}/assets/{assetId}":{"delete":{"operationId":"remove_ref_pack_asset","summary":"Remove an asset from a reference pack.","tags":["Assets"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"assetId","in":"path","required":true,"schema":{"type":"string"},"description":"An asset id."}],"responses":{"204":{"description":"Done."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/collections":{"get":{"operationId":"list_collections","summary":"The workspace's collections.","tags":["Collections"],"x-lotgen-scope":"read","parameters":[{"name":"posters","in":"query","required":false,"schema":{"type":"string"},"description":"`true` to include signed poster URLs."}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"create_collection","summary":"Create a collection.","tags":["Collections"],"x-lotgen-scope":"write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"note":{"type":"string","maxLength":2000},"job_ids":{"type":"array","items":{"type":"string","format":"uuid"},"maxItems":200}},"required":["name"],"additionalProperties":false}}}},"responses":{"201":{"description":"Created."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/collections/{id}":{"get":{"operationId":"get_collection","summary":"One collection and its takes, in order.","tags":["Collections"],"x-lotgen-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"posters","in":"query","required":false,"schema":{"type":"string"},"description":"`true` to include signed poster URLs."}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"update_collection","summary":"Rename or describe a collection.","tags":["Collections"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"note":{"type":"string","maxLength":2000}},"additionalProperties":false}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"delete_collection","summary":"Delete a collection. Its takes stay.","tags":["Collections"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Done."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/collections/{id}/items":{"post":{"operationId":"add_collection_items","summary":"Add takes to a collection.","tags":["Collections"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"job_ids":{"type":"array","items":{"type":"string","format":"uuid"},"minItems":1,"maxItems":200}},"required":["job_ids"],"additionalProperties":false}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/collections/{id}/items/{jobId}":{"delete":{"operationId":"remove_collection_item","summary":"Remove a take from a collection.","tags":["Collections"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"jobId","in":"path","required":true,"schema":{"type":"string"},"description":"A take's job id."}],"responses":{"204":{"description":"Done."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/collections/{id}/reorder":{"post":{"operationId":"reorder_collection","summary":"Put a collection's takes in a new order.","tags":["Collections"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"job_ids":{"type":"array","items":{"type":"string","format":"uuid"},"minItems":1,"maxItems":500}},"required":["job_ids"],"additionalProperties":false}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/collections/{id}/review-links":{"get":{"operationId":"list_collection_review_links","summary":"The review links open on a collection.","tags":["Collections"],"x-lotgen-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"create_collection_review_link","summary":"Open a review link on a collection.","tags":["Collections"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateReviewLink"}}}},"responses":{"201":{"description":"Created."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/review-decisions":{"get":{"operationId":"list_all_review_decisions","summary":"Recent review decisions across the workspace.","tags":["Collections"],"x-lotgen-scope":"read","parameters":[{"name":"within_ms","in":"query","required":false,"schema":{"type":"string"},"description":"Only decisions made within this many milliseconds."}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/review-links/{id}":{"delete":{"operationId":"revoke_review_link","summary":"Revoke a review link. The page it opened goes dark.","tags":["Collections"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Done."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/marketing/formats":{"get":{"operationId":"list_ad_formats","summary":"The ad formats the marketing studio plans.","tags":["Studios"],"x-lotgen-scope":"read","responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/marketing/verticals":{"get":{"operationId":"list_verticals","summary":"The verticals a product can be planned in.","tags":["Studios"],"x-lotgen-scope":"read","responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/marketing/capture-styles":{"get":{"operationId":"list_capture_styles","summary":"The capture styles an ad can be shot in.","tags":["Studios"],"x-lotgen-scope":"read","responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/marketing/extract":{"post":{"operationId":"extract_product","summary":"Read a product page into a brief. Fetches the URL; no model runs.","tags":["Studios"],"x-lotgen-scope":"write","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractProduct"}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/marketing/plan":{"post":{"operationId":"plan_ad","summary":"Plan an ad from a brief. Pure: nothing is written.","tags":["Studios"],"x-lotgen-scope":"read","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAdLot"}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/marketing/lots":{"post":{"operationId":"create_ad_lot","summary":"Build the planned ad as a lot. Spends nothing.","tags":["Studios"],"x-lotgen-scope":"write","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAdLot"}}}},"responses":{"201":{"description":"Created."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ugc/structures":{"get":{"operationId":"list_ugc_structures","summary":"The UGC structures.","tags":["Studios"],"x-lotgen-scope":"read","responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ugc/plan":{"post":{"operationId":"plan_ugc","summary":"Plan a UGC ad. Pure.","tags":["Studios"],"x-lotgen-scope":"read","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUgcLot"}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/ugc/lots":{"post":{"operationId":"create_ugc_lot","summary":"Build a UGC lot. Spends nothing.","tags":["Studios"],"x-lotgen-scope":"write","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUgcLot"}}}},"responses":{"201":{"description":"Created."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/explainer/structures":{"get":{"operationId":"list_explainer_structures","summary":"The explainer structures.","tags":["Studios"],"x-lotgen-scope":"read","responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/explainer/plan":{"post":{"operationId":"plan_explainer","summary":"Plan an explainer. Pure.","tags":["Studios"],"x-lotgen-scope":"read","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateExplainerLot"}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/explainer/lots":{"post":{"operationId":"create_explainer_lot","summary":"Build an explainer lot. Spends nothing.","tags":["Studios"],"x-lotgen-scope":"write","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateExplainerLot"}}}},"responses":{"201":{"description":"Created."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/faceless/structures":{"get":{"operationId":"list_faceless_structures","summary":"The nine faceless structures, ten looks, three presets and the tier defaults.","tags":["Studios"],"x-lotgen-scope":"read","responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/faceless/plan":{"post":{"operationId":"plan_faceless","summary":"Plan a faceless episode with its bill of materials. Pure.","tags":["Studios"],"x-lotgen-scope":"read","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFacelessLot"}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/faceless/lots":{"post":{"operationId":"create_faceless_lot","summary":"Build a faceless episode as a lot. Spends nothing.","tags":["Studios"],"x-lotgen-scope":"write","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFacelessLot"}}}},"responses":{"201":{"description":"Created."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/series":{"get":{"operationId":"list_series","summary":"Every series in the workspace, newest first.","description":"A series (faceless plan Phase 6) is the row behind a Faceless room: the recipe an episode is made from, the brand frame that never rotates (voice, look, caption style, brand), what rotates (`structure_rotation`, optionally `look_rotation`), the ledger of topics covered, and its own `cap_usd`. Each row carries `next`: the episode number, structure and look the next call would use. No scheduler and no posting: every episode is one `POST /series/:id/next`.","tags":["Studios"],"x-lotgen-scope":"read","responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"create_series","summary":"Make a series, empty or seeded from a Faceless lot.","description":"Name it and say what rotates. With `from_project_id`, a Faceless lot's structure, providers, voice, look, caption overrides and brand become the series and the lot becomes episode 1 with its topic on the ledger; what the body names explicitly wins over what the lot says. Every structure and look id is checked against `GET /faceless/structures`.","tags":["Studios"],"x-lotgen-scope":"write","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSeries"}}}},"responses":{"201":{"description":"Created."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/series/{id}":{"get":{"operationId":"get_series","summary":"One series, its ledger and what it has spent.","description":"`spent_usd` is `coalesce(actual, estimated)` over every job of every episode, all time, `fake` excluded (decision 42: where a provider reports no actual, the estimate is the answer).","tags":["Studios"],"x-lotgen-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"update_series","summary":"Change a series' recipe, frame, rotation, cadence, destination or cap.","tags":["Studios"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSeries"}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"delete_series","summary":"Remove a series. Its episodes stay as lots.","tags":["Studios"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Done."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/series/{id}/next":{"post":{"operationId":"next_episode","summary":"The next episode: rotate, check the ledger, build the lot. Spends nothing.","description":"Takes the rotation's next structure unless `structure` is named (the caller wins), refuses a topic the series has covered (exact or case-folded) by naming the earlier episode, merges the recipe under the call's `count`, `narration` and `sources`, holds the series' `cap_usd` against the quote, and builds the episode through the Faceless create with `client_tag` the series' name and the lot named `Series: topic, Structure`. The counter and the ledger move in one transaction, never on a dry run. `dry_run: true` answers the plan, `ledger_tail` (the newest twelve topics), `structure_repeats` (the newest five structures), `series_spent_usd` and `series_cap_usd`, and writes nothing. Nothing is rendered: the episode is a lot to review, and its renders are held to the same cap again.","tags":["Studios"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NextEpisode"}}}},"responses":{"201":{"description":"Created."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/photodump/catalog":{"get":{"operationId":"list_photodump_catalog","summary":"The photodump rolls and moods.","tags":["Studios"],"x-lotgen-scope":"read","responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/photodump/plan":{"post":{"operationId":"plan_photodump","summary":"Plan a photodump. Pure.","tags":["Studios"],"x-lotgen-scope":"read","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePhotodumpLot"}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/photodump/lots":{"post":{"operationId":"create_photodump_lot","summary":"Build a photodump lot. Spends nothing.","tags":["Studios"],"x-lotgen-scope":"write","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePhotodumpLot"}}}},"responses":{"201":{"description":"Created."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/influencer/options":{"get":{"operationId":"list_influencer_options","summary":"The influencer studio's creators, settings and formats.","tags":["Studios"],"x-lotgen-scope":"read","responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/influencer/plan":{"post":{"operationId":"plan_influencer","summary":"Plan an influencer lot. Pure.","tags":["Studios"],"x-lotgen-scope":"read","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateInfluencerLot"}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/influencer/lots":{"post":{"operationId":"create_influencer_lot","summary":"Build an influencer lot. Spends nothing.","tags":["Studios"],"x-lotgen-scope":"write","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateInfluencerLot"}}}},"responses":{"201":{"description":"Created."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/recipes/run":{"post":{"operationId":"run_recipe","summary":"Plan and build one lot through any studio in one call. Spends nothing.","tags":["Studios"],"x-lotgen-scope":"write","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunRecipe"}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/recipes/batch":{"post":{"operationId":"run_recipe_batch","summary":"Build up to twelve lots from one brief. Spends nothing.","tags":["Studios"],"x-lotgen-scope":"write","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunRecipeBatch"}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/products":{"get":{"operationId":"list_products","summary":"The product library. A brand-bound key sees only its brand's, and a key sees nothing unbranded.","tags":["Products"],"x-lotgen-scope":"read","parameters":[{"name":"archived","in":"query","required":false,"schema":{"type":"string"},"description":"`true` to include archived products."},{"name":"brand_kit_id","in":"query","required":false,"schema":{"type":"string"},"description":"Only products of one brand."}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"save_product","summary":"Add a product.","tags":["Products"],"x-lotgen-scope":"write","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveProduct"}}}},"responses":{"201":{"description":"Created."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/products/{id}":{"get":{"operationId":"get_product","summary":"One product with its images.","tags":["Products"],"x-lotgen-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"update_product","summary":"Change a product.","tags":["Products"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProduct"}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"archive_product","summary":"Archive a product.","tags":["Products"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/products/{id}/images":{"post":{"operationId":"upload_product_images","summary":"Upload product images.","tags":["Products"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"array","items":{"type":"string","format":"binary"}}}}}}},"responses":{"201":{"description":"Created."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/products/{id}/images/from-url":{"post":{"operationId":"add_product_images","summary":"Attach product images by URL.","tags":["Products"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"description":"This route reads its body by hand; the fields are named, not typed. See the SDK for their types.","content":{"application/json":{"schema":{"type":"object","properties":{"urls":{},"role":{}}}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/products/{id}/images/{assetId}":{"patch":{"operationId":"update_product_image","summary":"Change a product image's role.","tags":["Products"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"assetId","in":"path","required":true,"schema":{"type":"string"},"description":"An asset id."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProductAsset"}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"remove_product_image","summary":"Remove a product image.","tags":["Products"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"assetId","in":"path","required":true,"schema":{"type":"string"},"description":"An asset id."}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/brand-kits":{"get":{"operationId":"list_brand_kits","summary":"The brand kits. A brand-bound key sees only its own.","tags":["Products"],"x-lotgen-scope":"read","parameters":[{"name":"archived","in":"query","required":false,"schema":{"type":"string"},"description":"`true` to include archived kits."}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"save_brand_kit","summary":"Create a brand kit. Not for a brand-bound key.","tags":["Products"],"x-lotgen-scope":"write","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveBrandKit"}}}},"responses":{"201":{"description":"Created."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/brand-kits/from-url":{"post":{"operationId":"create_brand_kit_from_url","summary":"Read a brand's site into a kit. Not for a brand-bound key.","tags":["Products"],"x-lotgen-scope":"write","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandKitFromUrl"}}}},"responses":{"201":{"description":"Created."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/brand-kits/{id}":{"get":{"operationId":"get_brand_kit","summary":"One brand kit.","tags":["Products"],"x-lotgen-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"update_brand_kit","summary":"Change a brand kit.","tags":["Products"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBrandKit"}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"archive_brand_kit","summary":"Archive a brand kit. Refused while keys are bound to it.","tags":["Products"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/drive/import":{"post":{"operationId":"import_from_drive","summary":"Import picked Drive files into a lot, a shot or a product.","tags":["Drive"],"x-lotgen-scope":"write","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DriveImport"}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/drive/exports/{exportId}":{"get":{"operationId":"get_drive_export","summary":"One Drive delivery's progress.","tags":["Drive"],"x-lotgen-scope":"read","parameters":[{"name":"exportId","in":"path","required":true,"schema":{"type":"string"},"description":"A Drive export id."}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/drive/connection":{"get":{"operationId":"get_drive_connection","summary":"The caller's Drive connection, if any.","tags":["Drive"],"x-lotgen-scope":"admin","responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"disconnect_drive","summary":"Disconnect the caller's Drive.","tags":["Drive"],"x-lotgen-scope":"admin","responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/drive/picker":{"get":{"operationId":"get_drive_picker","summary":"What the Drive picker needs to open.","tags":["Drive"],"x-lotgen-scope":"admin","responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/drive/target":{"put":{"operationId":"set_drive_target","summary":"Choose the Drive folder deliveries land in.","tags":["Drive"],"x-lotgen-scope":"admin","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":200},"name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}]}},"required":["id"],"additionalProperties":false}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"clear_drive_target","summary":"Deliver to the connection's own LOTGEN folder again.","tags":["Drive"],"x-lotgen-scope":"admin","responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/webhooks":{"get":{"operationId":"list_webhooks","summary":"The workspace's webhook endpoints. A bound key sees its brand's.","tags":["Webhooks"],"x-lotgen-scope":"read","responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"create_webhook","summary":"Register a receiver. The signing secret is returned once.","description":"Needs the Partner add-on (`402 addon_required` without it). The URL must resolve to a public address. An endpoint registered by a brand-bound key receives only that brand's events.","tags":["Webhooks"],"x-lotgen-scope":"write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri","maxLength":2000},"events":{"type":"array","items":{"type":"string","enum":["job.succeeded","job.failed","review.decided","drive_export.done","assembly.done","assembly.failed"]},"minItems":1},"description":{"type":"string","maxLength":200}},"required":["url","events"],"additionalProperties":false}}}},"responses":{"201":{"description":"Created."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/webhooks/{id}":{"patch":{"operationId":"update_webhook","summary":"Change the URL, events or description, or switch it on or off.","tags":["Webhooks"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri","maxLength":2000},"events":{"type":"array","items":{"type":"string","enum":["job.succeeded","job.failed","review.decided","drive_export.done","assembly.done","assembly.failed"]},"minItems":1},"description":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}]},"enabled":{"type":"boolean"}},"additionalProperties":false}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"delete_webhook","summary":"Remove an endpoint and its delivery history.","tags":["Webhooks"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Done."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/webhooks/{id}/test":{"post":{"operationId":"test_webhook","summary":"Queue a signed `ping` at the endpoint.","tags":["Webhooks"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"202":{"description":"Accepted: the job is queued. Poll `GET /v1/jobs/{id}`."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/webhooks/{id}/rotate":{"post":{"operationId":"rotate_webhook_secret","summary":"A new signing secret, returned once. The old one stops at once.","tags":["Webhooks"],"x-lotgen-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/webhooks/{id}/deliveries":{"get":{"operationId":"list_webhook_deliveries","summary":"The last fifty deliveries: status, attempt, the receiver's answer.","tags":["Webhooks"],"x-lotgen-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/keys":{"get":{"operationId":"list_provider_keys","summary":"The provider keys the workspace holds, masked.","tags":["Admin"],"x-lotgen-scope":"admin","responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/keys/{id}":{"put":{"operationId":"put_provider_key","summary":"Store a provider key.","tags":["Admin"],"x-lotgen-scope":"admin","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"A provider id, such as `fal` or `runway`."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PutProviderKey"}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"update_provider_key","summary":"Rename or re-own a provider key.","tags":["Admin"],"x-lotgen-scope":"admin","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchKey"}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"delete_provider_key","summary":"Delete a provider key.","tags":["Admin"],"x-lotgen-scope":"admin","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Done."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/platforms/keys":{"get":{"operationId":"list_platform_keys","summary":"Every platform and the keys it holds.","tags":["Admin"],"x-lotgen-scope":"admin","responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/platforms/{platform}/keys":{"post":{"operationId":"add_platform_key","summary":"Add a key to a platform.","tags":["Admin"],"x-lotgen-scope":"admin","parameters":[{"name":"platform","in":"path","required":true,"schema":{"type":"string"},"description":"A platform id."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddPlatformKey"}}}},"responses":{"201":{"description":"Created."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/platforms/{platform}/models/refresh":{"post":{"operationId":"refresh_platform_models","summary":"Rediscover the models a platform's keys can reach.","tags":["Admin"],"x-lotgen-scope":"admin","parameters":[{"name":"platform","in":"path","required":true,"schema":{"type":"string"},"description":"A platform id."}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/members":{"get":{"operationId":"list_members","summary":"The workspace's members and open invites.","tags":["Admin"],"x-lotgen-scope":"admin","responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/members/{userId}":{"patch":{"operationId":"update_member","summary":"Change a member's role.","tags":["Admin"],"x-lotgen-scope":"admin","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string"},"description":"A member's user id."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"role":{"type":"string","enum":["admin","editor","viewer"]}},"required":["role"],"additionalProperties":false}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"remove_member","summary":"Remove a member.","tags":["Admin"],"x-lotgen-scope":"admin","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string"},"description":"A member's user id."}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/invites":{"post":{"operationId":"create_invite","summary":"Invite someone by email.","tags":["Admin"],"x-lotgen-scope":"admin","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email","maxLength":200},"role":{"type":"string","enum":["admin","editor","viewer"]}},"required":["email"],"additionalProperties":false}}}},"responses":{"201":{"description":"Created."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/invites/{id}":{"delete":{"operationId":"revoke_invite","summary":"Revoke an invite.","tags":["Admin"],"x-lotgen-scope":"admin","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/billing/seats":{"post":{"operationId":"set_seats","summary":"Change the Team plan's seat count.","tags":["Admin"],"x-lotgen-scope":"admin","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"seats":{"type":"integer","minimum":1,"maximum":50}},"required":["seats"],"additionalProperties":false}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/billing/portal":{"post":{"operationId":"billing_portal","summary":"A Stripe billing portal URL for the workspace.","tags":["Admin"],"x-lotgen-scope":"admin","responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/billing/partner":{"post":{"operationId":"set_partner_addon","summary":"Turn the Partner add-on on or off.","tags":["Admin"],"x-lotgen-scope":"admin","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"on":{"type":"boolean"}},"required":["on"],"additionalProperties":false}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/oauth/connections":{"get":{"operationId":"list_oauth_connections","summary":"The agents connected to this workspace by OAuth.","tags":["Admin"],"x-lotgen-scope":"admin","responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/oauth/connections/{id}":{"delete":{"operationId":"disconnect_oauth","summary":"Disconnect an agent.","tags":["Admin"],"x-lotgen-scope":"admin","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Done."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/workspace/deletion":{"get":{"operationId":"get_workspace_deletion","summary":"What deleting the workspace would take with it.","tags":["Admin"],"x-lotgen-scope":"admin","responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/workspace":{"delete":{"operationId":"delete_workspace","summary":"Delete the workspace. Unrecoverable.","tags":["Admin"],"x-lotgen-scope":"admin","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"confirm":{"type":"string","minLength":1,"maxLength":200}},"required":["confirm"],"additionalProperties":false}}}},"responses":{"204":{"description":"Done."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/workspace-keys":{"get":{"operationId":"list_api_keys","summary":"The workspace's API keys. A session's business: a key is refused.","description":"Each key carries `last_used_at` and, with the Partner add-on, `usage`: calls, jobs and dollars this UTC month, summed from the key's daily rows (null without the add-on). The dollar is the same rule `GET /usage` sums by key with.","tags":["Admin"],"x-lotgen-scope":"admin","responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"create_api_key","summary":"Mint an API key. Shown once. A key cannot mint keys.","tags":["Admin"],"x-lotgen-scope":"admin","requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKey"}}}},"responses":{"201":{"description":"Created."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/workspace-keys/{id}":{"patch":{"operationId":"update_api_key","summary":"Rename a key or change its scopes.","tags":["Admin"],"x-lotgen-scope":"admin","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateApiKey"}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"revoke_api_key","summary":"Revoke a key.","tags":["Admin"],"x-lotgen-scope":"admin","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/admin/trials":{"get":{"operationId":"list_trials","summary":"Owner only: trials.","tags":["Admin"],"x-lotgen-scope":"admin","responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"create_trial","summary":"Owner only: start a trial.","tags":["Admin"],"x-lotgen-scope":"admin","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email","maxLength":200},"days":{"type":"integer","minimum":1,"maximum":365},"also_invite":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string","format":"email","maxLength":200},"role":{"type":"string","enum":["admin","editor","viewer"]}},"required":["email"],"additionalProperties":false},"maxItems":5}},"required":["email","days"],"additionalProperties":false}}}},"responses":{"201":{"description":"Created."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/admin/trials/{workspaceId}":{"patch":{"operationId":"update_trial","summary":"Owner only: change a trial.","tags":["Admin"],"x-lotgen-scope":"admin","parameters":[{"name":"workspaceId","in":"path","required":true,"schema":{"type":"string"},"description":"A workspace id."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"days":{"type":"integer","minimum":0,"maximum":365}},"required":["days"],"additionalProperties":false}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/admin/discounts":{"get":{"operationId":"list_discounts","summary":"Owner only: discount codes.","tags":["Admin"],"x-lotgen-scope":"admin","responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"create_discount","summary":"Owner only: create a discount code.","tags":["Admin"],"x-lotgen-scope":"admin","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"percent_off":{"type":"number","minimum":1,"maximum":100},"code":{"type":"string","minLength":3,"maxLength":40,"pattern":"^[A-Za-z0-9_-]+$"},"max_redemptions":{"type":"integer","minimum":1,"maximum":1000},"note":{"type":"string","maxLength":120}},"required":["percent_off"],"additionalProperties":false}}}},"responses":{"201":{"description":"Created."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/admin/discounts/{couponId}/apply":{"post":{"operationId":"apply_discount","summary":"Owner only: apply a discount to a workspace.","tags":["Admin"],"x-lotgen-scope":"admin","parameters":[{"name":"couponId","in":"path","required":true,"schema":{"type":"string"},"description":"A Stripe coupon id."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"workspace_id":{"type":"string","format":"uuid"}},"required":["workspace_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/admin/discounts/{id}":{"delete":{"operationId":"delete_discount","summary":"Owner only: delete a discount code.","tags":["Admin"],"x-lotgen-scope":"admin","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/admin/partner":{"post":{"operationId":"set_partner_addon_by_hand","summary":"Owner only: set a workspace's Partner add-on by hand.","tags":["Admin"],"x-lotgen-scope":"admin","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"workspace_id":{"type":"string","format":"uuid"},"on":{"type":"boolean"}},"required":["workspace_id","on"],"additionalProperties":false}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/admin/oauth-clients":{"get":{"operationId":"list_oauth_clients","summary":"Owner only: registered OAuth clients, with live grants.","tags":["Admin"],"x-lotgen-scope":"admin","responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/admin/oauth-clients/{clientId}":{"patch":{"operationId":"update_oauth_client","summary":"Owner only: mark a registered client verified, set its mark, correct its name.","tags":["Admin"],"x-lotgen-scope":"admin","parameters":[{"name":"clientId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"verified":{"type":"boolean"},"logo_url":{"anyOf":[{"type":"string","format":"uri","maxLength":500},{"type":"null"}]},"client_name":{"type":"string","minLength":1,"maxLength":120}},"additionalProperties":false}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/admin/access-requests":{"get":{"operationId":"list_access_requests","summary":"Owner only: people who asked for an invitation.","tags":["Admin"],"x-lotgen-scope":"admin","responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/admin/access-requests/{id}":{"patch":{"operationId":"update_access_request","summary":"Owner only: dismiss a request, or reopen one.","tags":["Admin"],"x-lotgen-scope":"admin","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["new","invited","dismissed"]}},"required":["status"],"additionalProperties":false}}}},"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No credential, or one that does not open a workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`payment_required`: the workspace has no live plan; or `addon_required`: the key is bound to a brand and the workspace has no Partner add-on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"`insufficient_scope`: the key lacks the scope the route needs, named in `required`; or `brand_scope`: a brand-bound key asked for another brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: the key is over its 600 requests or 30 renders a minute. `retry_after` and `Retry-After` say how long to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/public/prices":{"get":{"operationId":"list_public_prices","summary":"What each model costs, without an account.","tags":["Workspace"],"security":[],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/access-requests":{"post":{"operationId":"request_access","summary":"Ask for an invitation, without an account. The answer never says whether the address was already known.","tags":["Workspace"],"security":[],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email","maxLength":200},"name":{"type":"string","maxLength":120},"segment":{"type":"string","enum":["brand","agency","creator","developer"]},"platforms":{"type":"array","items":{"type":"string","enum":["google","ark","fal","evolink","kling","openai","minimax","bfl","alibaba","eleven","anthropic","xai","runway"]},"maxItems":13},"utm_source":{"type":"string","maxLength":120},"utm_medium":{"type":"string","maxLength":120},"utm_campaign":{"type":"string","maxLength":120}},"required":["email","segment"],"additionalProperties":false}}}},"responses":{"201":{"description":"Created."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/openapi.json":{"get":{"operationId":"get_openapi","summary":"This document.","tags":["Workspace"],"security":[],"responses":{"200":{"description":"OK."},"400":{"description":"`invalid_input`: the body or query did not validate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no such thing in this workspace, or not this key's brand.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"A workspace API key, `lgk_…`, or an OAuth access token."}},"schemas":{"UpdateWorkspace":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"spend_cap_usd":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"unpriced_policy":{"type":"string","enum":["block","allow"]},"video_ref_max_bytes":{"type":"integer","minimum":1048576,"maximum":2147483648},"video_ref_max_sec":{"type":"integer","minimum":1,"maximum":3600}},"additionalProperties":false},"CreateProject":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"default_provider":{"type":"string","enum":["import","cut","kling","omni","veo","seedance","fake","gateway","fal","evolink","nano","seedream","openai","eleven","minimax","bfl","bfl_video","alibaba","xai","runway","runway_image","anthropic","openai_text","gemini"]},"default_model":{"type":"string","minLength":1,"maxLength":200},"client_tag":{"type":"string","maxLength":80},"spend_cap_usd":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"look":{"anyOf":[{"type":"object","properties":{"genre":{"type":"string","maxLength":40},"style":{"type":"string","maxLength":40},"lighting":{"type":"string","maxLength":40},"palette":{"type":"string","maxLength":40},"moveset":{"type":"string","maxLength":40},"note":{"type":"string","maxLength":400}},"additionalProperties":false},{"type":"null"}]},"product_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"origin_studio":{"type":"string","enum":["marketing","ugc","explainer","photodump","influencer","cinema","faceless","preset:hook_3","preset:product_ad_5"]},"vertical":{"type":"string","maxLength":40},"capture_style":{"type":"string","maxLength":40},"brand_kit_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"sources":{"type":"array","items":{"type":"string","format":"uri","maxLength":2000},"maxItems":12}},"required":["name"],"additionalProperties":false},"CreateFromPreset":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"preset":{"type":"string","enum":["product_ad_5","hook_3"]},"default_provider":{"type":"string","enum":["import","cut","kling","omni","veo","seedance","fake","gateway","fal","evolink","nano","seedream","openai","eleven","minimax","bfl","bfl_video","alibaba","xai","runway","runway_image","anthropic","openai_text","gemini"]},"client_tag":{"type":"string","maxLength":80},"brand_kit_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]}},"required":["name","preset"],"additionalProperties":false},"UpdateProject":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"default_provider":{"type":"string","enum":["import","cut","kling","omni","veo","seedance","fake","gateway","fal","evolink","nano","seedream","openai","eleven","minimax","bfl","bfl_video","alibaba","xai","runway","runway_image","anthropic","openai_text","gemini"]},"default_model":{"type":"string","minLength":1,"maxLength":200},"client_tag":{"type":"string","maxLength":80},"spend_cap_usd":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"look":{"anyOf":[{"type":"object","properties":{"genre":{"type":"string","maxLength":40},"style":{"type":"string","maxLength":40},"lighting":{"type":"string","maxLength":40},"palette":{"type":"string","maxLength":40},"moveset":{"type":"string","maxLength":40},"note":{"type":"string","maxLength":400}},"additionalProperties":false},{"type":"null"}]},"product_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"origin_studio":{"type":"string","enum":["marketing","ugc","explainer","photodump","influencer","cinema","faceless","preset:hook_3","preset:product_ad_5"]},"vertical":{"type":"string","maxLength":40},"capture_style":{"type":"string","maxLength":40},"brand_kit_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"sources":{"type":"array","items":{"type":"string","format":"uri","maxLength":2000},"maxItems":12},"archived":{"type":"boolean"},"if_unmodified_since":{"type":"string","format":"date-time"}},"additionalProperties":false},"CreateScene":{"type":"object","properties":{"prompt":{"type":"string","maxLength":8000,"default":""},"provider":{"type":"string","enum":["import","cut","kling","omni","veo","seedance","fake","gateway","fal","evolink","nano","seedream","openai","eleven","minimax","bfl","bfl_video","alibaba","xai","runway","runway_image","anthropic","openai_text","gemini"]},"model":{"type":"string","minLength":1,"maxLength":200},"duration_sec":{"type":"number","exclusiveMinimum":0,"maximum":120},"resolution":{"type":"string","enum":["360p","480p","720p","1080p","4k","1K","2K","4K"]},"aspect_ratio":{"type":"string","minLength":1,"maxLength":16},"with_audio":{"type":"boolean"},"seed":{"type":"integer"},"notes":{"type":"string","maxLength":4000},"title":{"type":"string","maxLength":80},"narration":{"type":"string","maxLength":3000},"watermark":{"type":"boolean"},"negative_prompt":{"type":"string","maxLength":2000},"kind":{"type":"string","enum":["video","image","audio"]},"text_mode":{"type":"string","enum":["editable","baked"]},"camera":{"anyOf":[{"type":"object","properties":{"lens":{"type":"string","maxLength":40},"aperture":{"type":"string","maxLength":40},"move":{"type":"string","maxLength":40}},"additionalProperties":false},{"type":"null"}]},"voice":{"anyOf":[{"type":"object","properties":{"voice_id":{"type":"string","maxLength":64},"source_asset_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"voice_name":{"type":"string","maxLength":120},"language":{"type":"string","maxLength":12},"stability":{"type":"number","minimum":0,"maximum":1},"similarity":{"type":"number","minimum":0,"maximum":1},"style":{"type":"number","minimum":0,"maximum":1},"speaker_boost":{"type":"boolean"},"speed":{"type":"number","minimum":0.5,"maximum":2}},"additionalProperties":false},{"type":"null"}]},"mode":{"type":"string","enum":["clip","native_multishot","edit"]},"continuity_mode":{"type":"string","enum":["none","last_frame_i2v","native_flf","native_extend","native_multishot"]},"continuity_source_scene_id":{"type":"string","format":"uuid"},"ref_pack_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]}},"additionalProperties":false},"ReorderScenes":{"type":"object","properties":{"scene_ids":{"type":"array","items":{"type":"string","format":"uuid"},"minItems":1},"from_order":{"type":"array","items":{"type":"string","format":"uuid"},"minItems":1}},"required":["scene_ids"],"additionalProperties":false},"FromUpload":{"type":"object","properties":{"key":{"type":"string","minLength":1,"maxLength":500},"upload_id":{"type":"string","minLength":1,"maxLength":2000}},"required":["key","upload_id"],"additionalProperties":false},"BeginUpload":{"type":"object","properties":{"filename":{"type":"string","minLength":1,"maxLength":200},"mime":{"type":"string","enum":["video/mp4","video/quicktime","video/webm"]},"size":{"type":"integer","exclusiveMinimum":0}},"required":["filename","mime","size"],"additionalProperties":false},"CreateRefPack":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"asset_ids":{"type":"array","items":{"type":"string","format":"uuid"}}},"required":["name"],"additionalProperties":false},"RenderPending":{"type":"object","properties":{"dry_run":{"type":"boolean"},"accept_degradations":{"type":"boolean"}},"additionalProperties":false},"CreateReviewLink":{"type":"object","properties":{"label":{"type":"string","maxLength":120},"expires_in_days":{"type":"integer","minimum":1,"maximum":365}},"additionalProperties":false},"BindProjectKey":{"type":"object","properties":{"key_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]}},"required":["key_id"],"additionalProperties":false},"UpdateScene":{"type":"object","properties":{"prompt":{"type":"string","maxLength":8000,"default":""},"provider":{"type":"string","enum":["import","cut","kling","omni","veo","seedance","fake","gateway","fal","evolink","nano","seedream","openai","eleven","minimax","bfl","bfl_video","alibaba","xai","runway","runway_image","anthropic","openai_text","gemini"]},"model":{"type":"string","minLength":1,"maxLength":200},"duration_sec":{"type":"number","exclusiveMinimum":0,"maximum":120},"resolution":{"type":"string","enum":["360p","480p","720p","1080p","4k","1K","2K","4K"]},"aspect_ratio":{"type":"string","minLength":1,"maxLength":16},"with_audio":{"type":"boolean"},"seed":{"type":"integer"},"notes":{"type":"string","maxLength":4000},"title":{"type":"string","maxLength":80},"narration":{"type":"string","maxLength":3000},"watermark":{"type":"boolean"},"negative_prompt":{"type":"string","maxLength":2000},"kind":{"type":"string","enum":["video","image","audio"]},"text_mode":{"type":"string","enum":["editable","baked"]},"camera":{"anyOf":[{"type":"object","properties":{"lens":{"type":"string","maxLength":40},"aperture":{"type":"string","maxLength":40},"move":{"type":"string","maxLength":40}},"additionalProperties":false},{"type":"null"}]},"voice":{"anyOf":[{"type":"object","properties":{"voice_id":{"type":"string","maxLength":64},"source_asset_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"voice_name":{"type":"string","maxLength":120},"language":{"type":"string","maxLength":12},"stability":{"type":"number","minimum":0,"maximum":1},"similarity":{"type":"number","minimum":0,"maximum":1},"style":{"type":"number","minimum":0,"maximum":1},"speaker_boost":{"type":"boolean"},"speed":{"type":"number","minimum":0.5,"maximum":2}},"additionalProperties":false},{"type":"null"}]},"mode":{"type":"string","enum":["clip","native_multishot","edit"]},"continuity_mode":{"type":"string","enum":["none","last_frame_i2v","native_flf","native_extend","native_multishot"]},"continuity_source_scene_id":{"type":"string","format":"uuid"},"ref_pack_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"if_unmodified_since":{"type":"string","format":"date-time"}},"additionalProperties":false},"SelectWinner":{"type":"object","properties":{"job_id":{"type":"string","format":"uuid"},"if_unmodified_since":{"type":"string","format":"date-time"}},"required":["job_id"],"additionalProperties":false},"AttachRefUrl":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"filename":{"type":"string","minLength":1,"maxLength":80}},"required":["url"],"additionalProperties":false},"ImportTake":{"type":"object","properties":{"ref_asset_id":{"type":"string","format":"uuid"}},"required":["ref_asset_id"],"additionalProperties":false},"TrimTake":{"type":"object","properties":{"start_sec":{"type":"number","minimum":0},"end_sec":{"type":"number","exclusiveMinimum":0}},"required":["start_sec"],"additionalProperties":false},"SplitShot":{"type":"object","properties":{"at_sec":{"type":"number","exclusiveMinimum":0},"take_asset_id":{"type":"string","format":"uuid"}},"required":["at_sec"],"additionalProperties":false},"ApplyRefPack":{"type":"object","properties":{"pack_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]}},"required":["pack_id"],"additionalProperties":false},"RenderScene":{"type":"object","properties":{"provider":{"type":"string","enum":["import","cut","kling","omni","veo","seedance","fake","gateway","fal","evolink","nano","seedream","openai","eleven","minimax","bfl","bfl_video","alibaba","xai","runway","runway_image","anthropic","openai_text","gemini"]},"model":{"type":"string","minLength":1,"maxLength":200},"variants":{"type":"integer","minimum":1,"maximum":6},"dry_run":{"type":"boolean"},"if_unmodified_since":{"type":"string","format":"date-time"},"accept_degradations":{"type":"boolean"}},"additionalProperties":false},"UpdateJob":{"type":"object","properties":{"label":{"type":"string","maxLength":80}},"required":["label"],"additionalProperties":false},"AddRefPackAsset":{"type":"object","properties":{"asset_id":{"type":"string","format":"uuid"}},"required":["asset_id"],"additionalProperties":false},"ExtractProduct":{"type":"object","properties":{"url":{"type":"string","format":"uri"}},"required":["url"],"additionalProperties":false},"CreateAdLot":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"brief":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"url":{"type":"string","format":"uri"},"summary":{"type":"string","maxLength":2000},"features":{"type":"array","items":{"type":"string","minLength":1,"maxLength":200},"maxItems":8},"price":{"type":"string","maxLength":40},"price_on_screen":{"type":"boolean","default":true},"brand_tone":{"type":"string","maxLength":200},"avatar":{"type":"string","maxLength":300}},"required":["name"],"additionalProperties":false},"format":{"type":"string","minLength":1,"maxLength":40},"brand_kit_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"vertical":{"type":"string","maxLength":40},"capture_style":{"type":"string","maxLength":40},"aspect_ratio":{"type":"string","enum":["9:16","16:9","1:1"]},"resolution":{"type":"string","enum":["360p","480p","720p","1080p","4k"],"default":"720p"},"target_duration_sec":{"type":"integer","minimum":4,"maximum":120,"default":15},"provider":{"type":"string","enum":["import","cut","kling","omni","veo","seedance","fake","gateway","fal","evolink","nano","seedream","openai","eleven","minimax","bfl","bfl_video","alibaba","xai","runway","runway_image","anthropic","openai_text","gemini"]},"model":{"type":"string","minLength":1,"maxLength":200},"client_tag":{"type":"string","maxLength":80},"image_urls":{"type":"array","items":{"type":"string","format":"uri"},"maxItems":6},"image_asset_ids":{"type":"array","items":{"type":"string","format":"uuid"},"maxItems":6},"product_asset_ids":{"type":"array","items":{"type":"string","format":"uuid"},"maxItems":24},"look":{"anyOf":[{"type":"object","properties":{"genre":{"type":"string","maxLength":40},"style":{"type":"string","maxLength":40},"lighting":{"type":"string","maxLength":40},"palette":{"type":"string","maxLength":40},"moveset":{"type":"string","maxLength":40},"note":{"type":"string","maxLength":400}},"additionalProperties":false},{"type":"null"}]},"product_id":{"type":"string","format":"uuid"},"text_mode":{"type":"string","enum":["editable","baked"]}},"additionalProperties":false},"CreateUgcLot":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"brief":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"summary":{"type":"string","maxLength":2000},"features":{"type":"array","items":{"type":"string","minLength":1,"maxLength":200},"maxItems":8},"benefit":{"type":"string","maxLength":300},"problem":{"type":"string","maxLength":300},"category":{"type":"string","maxLength":120},"audience":{"type":"string","maxLength":200},"price":{"type":"string","maxLength":40}},"required":["name"],"additionalProperties":false},"product_id":{"type":"string","format":"uuid"},"structure":{"type":"string","minLength":1,"maxLength":40},"vertical":{"type":"string","maxLength":40},"capture_style":{"type":"string","maxLength":40},"brand_kit_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"hook":{"type":"string","minLength":1,"maxLength":40},"platform":{"type":"string","minLength":1,"maxLength":40,"default":"tiktok"},"aspect_ratio":{"type":"string","enum":["9:16","16:9","1:1"]},"hook_variants":{"type":"integer","minimum":0,"maximum":5,"default":0},"resolution":{"type":"string","enum":["360p","480p","720p","1080p","4k"],"default":"720p"},"provider":{"type":"string","enum":["import","cut","kling","omni","veo","seedance","fake","gateway","fal","evolink","nano","seedream","openai","eleven","minimax","bfl","bfl_video","alibaba","xai","runway","runway_image","anthropic","openai_text","gemini"]},"model":{"type":"string","minLength":1,"maxLength":200},"client_tag":{"type":"string","maxLength":80},"creator_image_url":{"type":"string","format":"uri"},"creator_asset_id":{"type":"string","format":"uuid"},"image_urls":{"type":"array","items":{"type":"string","format":"uri"},"maxItems":6},"image_asset_ids":{"type":"array","items":{"type":"string","format":"uuid"},"maxItems":6},"product_asset_ids":{"type":"array","items":{"type":"string","format":"uuid"},"maxItems":24},"look":{"anyOf":[{"type":"object","properties":{"genre":{"type":"string","maxLength":40},"style":{"type":"string","maxLength":40},"lighting":{"type":"string","maxLength":40},"palette":{"type":"string","maxLength":40},"moveset":{"type":"string","maxLength":40},"note":{"type":"string","maxLength":400}},"additionalProperties":false},{"type":"null"}]},"lines":{"type":"array","items":{"type":"string","maxLength":600},"maxItems":16}},"additionalProperties":false},"CreateExplainerLot":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"structure":{"type":"string","minLength":1,"maxLength":40},"style":{"type":"string","minLength":1,"maxLength":40},"topic":{"type":"string","minLength":1,"maxLength":300},"audience":{"type":"string","maxLength":200},"subject":{"type":"string","maxLength":300},"target_duration_sec":{"type":"integer","minimum":20,"maximum":900,"default":90},"provider":{"type":"string","enum":["import","cut","kling","omni","veo","seedance","fake","gateway","fal","evolink","nano","seedream","openai","eleven","minimax","bfl","bfl_video","alibaba","xai","runway","runway_image","anthropic","openai_text","gemini"]},"model":{"type":"string","minLength":1,"maxLength":200},"resolution":{"type":"string","enum":["360p","480p","720p","1080p","4k"],"default":"720p"},"aspect_ratio":{"type":"string","enum":["16:9","9:16","1:1"],"default":"16:9"},"client_tag":{"type":"string","maxLength":80},"narration":{"type":"array","items":{"type":"string","maxLength":1200},"maxItems":120},"voice_id":{"type":"string","minLength":1,"maxLength":120}},"required":["structure","topic"],"additionalProperties":false},"CreateFacelessLot":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"structure":{"type":"string","minLength":1,"maxLength":40},"topic":{"type":"string","minLength":1,"maxLength":300},"brand":{"type":"string","maxLength":120},"audience":{"type":"string","maxLength":200},"count":{"type":"integer","minimum":1,"maximum":12},"look":{"type":"string","minLength":1,"maxLength":40},"preset":{"type":"string","enum":["short_30","short_60","short_90"],"default":"short_60"},"visual_mode":{"type":"string","enum":["stills","clips","i2v"]},"provider":{"type":"string","enum":["import","cut","kling","omni","veo","seedance","fake","gateway","fal","evolink","nano","seedream","openai","eleven","minimax","bfl","bfl_video","alibaba","xai","runway","runway_image","anthropic","openai_text","gemini"]},"model":{"type":"string","minLength":1,"maxLength":200},"image_provider":{"type":"string","enum":["import","cut","kling","omni","veo","seedance","fake","gateway","fal","evolink","nano","seedream","openai","eleven","minimax","bfl","bfl_video","alibaba","xai","runway","runway_image","anthropic","openai_text","gemini"]},"image_model":{"type":"string","minLength":1,"maxLength":200},"resolution":{"type":"string","enum":["1K","2K","4K","360p","480p","720p","1080p","4k"]},"aspect_ratio":{"type":"string","const":"9:16","default":"9:16"},"client_tag":{"type":"string","maxLength":80},"brand_kit_id":{"type":"string","format":"uuid"},"narration":{"type":"array","items":{"type":"string","maxLength":1200},"maxItems":24},"sources":{"type":"array","items":{"type":"string","format":"uri","maxLength":2000},"maxItems":12},"voice_id":{"type":"string","minLength":1,"maxLength":120},"caption_style":{"type":"string","minLength":1,"maxLength":40},"text_mode":{"type":"string","enum":["editable","baked"]},"writer":{"type":"object","properties":{"provider":{"type":"string","enum":["import","cut","kling","omni","veo","seedance","fake","gateway","fal","evolink","nano","seedream","openai","eleven","minimax","bfl","bfl_video","alibaba","xai","runway","runway_image","anthropic","openai_text","gemini"]},"model":{"type":"string","minLength":1,"maxLength":200},"notes":{"type":"string","maxLength":2000}},"additionalProperties":false}},"required":["structure","topic"],"additionalProperties":false},"CreateSeries":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"brand_kit_id":{"type":"string","format":"uuid"},"recipe":{"type":"object","properties":{"studio":{"type":"string","const":"faceless","default":"faceless"},"preset":{"type":"string","enum":["short_30","short_60","short_90"],"default":"short_60"},"visual_mode":{"type":"string","enum":["stills","clips","i2v"]},"provider":{"type":"string","enum":["import","cut","kling","omni","veo","seedance","fake","gateway","fal","evolink","nano","seedream","openai","eleven","minimax","bfl","bfl_video","alibaba","xai","runway","runway_image","anthropic","openai_text","gemini"]},"model":{"type":"string","minLength":1,"maxLength":200},"image_provider":{"type":"string","enum":["import","cut","kling","omni","veo","seedance","fake","gateway","fal","evolink","nano","seedream","openai","eleven","minimax","bfl","bfl_video","alibaba","xai","runway","runway_image","anthropic","openai_text","gemini"]},"image_model":{"type":"string","minLength":1,"maxLength":200},"resolution":{"type":"string","enum":["1K","2K","4K","360p","480p","720p","1080p","4k"]},"brand":{"type":"string","maxLength":120},"audience":{"type":"string","maxLength":200},"count":{"type":"integer","minimum":1,"maximum":12},"text_mode":{"type":"string","enum":["editable","baked"]}},"additionalProperties":false,"default":{"studio":"faceless"}},"voice_id":{"type":"string","minLength":1,"maxLength":120},"look":{"type":"string","minLength":1,"maxLength":40},"caption_style":{"type":"string","minLength":1,"maxLength":40,"default":"calm"},"caption_overrides":{"type":"object","additionalProperties":{}},"cadence":{"type":"string","maxLength":120},"destination":{"type":"string","enum":["review","drive","export"],"default":"review"},"structure_rotation":{"type":"array","items":{"type":"string","minLength":1,"maxLength":40},"minItems":1,"maxItems":12},"look_rotation":{"type":"array","items":{"type":"string","minLength":1,"maxLength":40},"minItems":1,"maxItems":10},"cap_usd":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"from_project_id":{"type":"string","format":"uuid"}},"required":["name"],"additionalProperties":false},"UpdateSeries":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"brand_kit_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"recipe":{"type":"object","properties":{"studio":{"type":"string","const":"faceless","default":"faceless"},"preset":{"type":"string","enum":["short_30","short_60","short_90"],"default":"short_60"},"visual_mode":{"type":"string","enum":["stills","clips","i2v"]},"provider":{"type":"string","enum":["import","cut","kling","omni","veo","seedance","fake","gateway","fal","evolink","nano","seedream","openai","eleven","minimax","bfl","bfl_video","alibaba","xai","runway","runway_image","anthropic","openai_text","gemini"]},"model":{"type":"string","minLength":1,"maxLength":200},"image_provider":{"type":"string","enum":["import","cut","kling","omni","veo","seedance","fake","gateway","fal","evolink","nano","seedream","openai","eleven","minimax","bfl","bfl_video","alibaba","xai","runway","runway_image","anthropic","openai_text","gemini"]},"image_model":{"type":"string","minLength":1,"maxLength":200},"resolution":{"type":"string","enum":["1K","2K","4K","360p","480p","720p","1080p","4k"]},"brand":{"type":"string","maxLength":120},"audience":{"type":"string","maxLength":200},"count":{"type":"integer","minimum":1,"maximum":12},"text_mode":{"type":"string","enum":["editable","baked"]}},"additionalProperties":false},"voice_id":{"anyOf":[{"type":"string","minLength":1,"maxLength":120},{"type":"null"}]},"look":{"anyOf":[{"type":"string","minLength":1,"maxLength":40},{"type":"null"}]},"caption_style":{"type":"string","minLength":1,"maxLength":40},"caption_overrides":{"anyOf":[{"type":"object","additionalProperties":{}},{"type":"null"}]},"cadence":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}]},"destination":{"type":"string","enum":["review","drive","export"]},"structure_rotation":{"type":"array","items":{"type":"string","minLength":1,"maxLength":40},"minItems":1,"maxItems":12},"look_rotation":{"anyOf":[{"type":"array","items":{"type":"string","minLength":1,"maxLength":40},"minItems":1,"maxItems":10},{"type":"null"}]},"cap_usd":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]}},"additionalProperties":false},"NextEpisode":{"type":"object","properties":{"topic":{"type":"string","minLength":1,"maxLength":300},"structure":{"type":"string","minLength":1,"maxLength":40},"look":{"type":"string","minLength":1,"maxLength":40},"count":{"type":"integer","minimum":1,"maximum":12},"narration":{"type":"array","items":{"type":"string","maxLength":1200},"maxItems":24},"sources":{"type":"array","items":{"type":"string","format":"uri","maxLength":2000},"maxItems":12},"dry_run":{"type":"boolean"}},"required":["topic"],"additionalProperties":false},"CreatePhotodumpLot":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"aesthetic":{"type":"string","minLength":1,"maxLength":40},"setting":{"type":"string","minLength":1,"maxLength":300},"wardrobe":{"type":"string","maxLength":300},"count":{"type":"integer","minimum":1,"maximum":26,"default":12},"creator_image_url":{"type":"string","format":"uri"},"creator_asset_id":{"type":"string","format":"uuid"},"provider":{"type":"string","enum":["import","cut","kling","omni","veo","seedance","fake","gateway","fal","evolink","nano","seedream","openai","eleven","minimax","bfl","bfl_video","alibaba","xai","runway","runway_image","anthropic","openai_text","gemini"]},"model":{"type":"string","minLength":1,"maxLength":200},"resolution":{"type":"string","enum":["1K","2K","4K","360p","480p","720p","1080p","4k"]},"aspect_ratio":{"type":"string","enum":["16:9","9:16","1:1","4:3","3:4"],"default":"9:16"},"client_tag":{"type":"string","maxLength":80},"text_mode":{"type":"string","enum":["editable","baked"]}},"required":["aesthetic","setting"],"additionalProperties":false},"CreateInfluencerLot":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"presentation":{"type":"string","enum":["woman","man","androgynous"]},"age":{"type":"string","enum":["early 20s","late 20s","30s","40s","50s","60s or older"]},"heritage":{"type":"string","maxLength":120},"skin":{"type":"string","maxLength":120},"hair":{"type":"string","maxLength":160},"eyes":{"type":"string","maxLength":120},"build":{"type":"string","enum":["slight","average","athletic","curvy","broad"]},"distinguishing":{"type":"string","maxLength":300},"style":{"type":"string","maxLength":200},"energy":{"type":"string","enum":["warm","deadpan","bubbly","earnest","polished","edgy"]},"provider":{"type":"string","enum":["import","cut","kling","omni","veo","seedance","fake","gateway","fal","evolink","nano","seedream","openai","eleven","minimax","bfl","bfl_video","alibaba","xai","runway","runway_image","anthropic","openai_text","gemini"]},"model":{"type":"string","minLength":1,"maxLength":200},"resolution":{"type":"string","enum":["1K","2K","4K","360p","480p","720p","1080p","4k"]},"aspect_ratio":{"type":"string","enum":["16:9","9:16","1:1","4:3","3:4"],"default":"9:16"},"client_tag":{"type":"string","maxLength":80},"text_mode":{"type":"string","enum":["editable","baked"]}},"required":["presentation","age","energy"],"additionalProperties":false},"RunRecipe":{"anyOf":[{"type":"object","properties":{"recipe":{"type":"string","const":"marketing"},"params":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"brief":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"url":{"type":"string","format":"uri"},"summary":{"type":"string","maxLength":2000},"features":{"type":"array","items":{"type":"string","minLength":1,"maxLength":200},"maxItems":8},"price":{"type":"string","maxLength":40},"price_on_screen":{"type":"boolean","default":true},"brand_tone":{"type":"string","maxLength":200},"avatar":{"type":"string","maxLength":300}},"required":["name"],"additionalProperties":false},"format":{"type":"string","minLength":1,"maxLength":40},"brand_kit_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"vertical":{"type":"string","maxLength":40},"capture_style":{"type":"string","maxLength":40},"aspect_ratio":{"type":"string","enum":["9:16","16:9","1:1"]},"resolution":{"type":"string","enum":["360p","480p","720p","1080p","4k"],"default":"720p"},"target_duration_sec":{"type":"integer","minimum":4,"maximum":120,"default":15},"provider":{"type":"string","enum":["import","cut","kling","omni","veo","seedance","fake","gateway","fal","evolink","nano","seedream","openai","eleven","minimax","bfl","bfl_video","alibaba","xai","runway","runway_image","anthropic","openai_text","gemini"]},"model":{"type":"string","minLength":1,"maxLength":200},"client_tag":{"type":"string","maxLength":80},"image_urls":{"type":"array","items":{"type":"string","format":"uri"},"maxItems":6},"image_asset_ids":{"type":"array","items":{"type":"string","format":"uuid"},"maxItems":6},"product_asset_ids":{"type":"array","items":{"type":"string","format":"uuid"},"maxItems":24},"look":{"anyOf":[{"type":"object","properties":{"genre":{"type":"string","maxLength":40},"style":{"type":"string","maxLength":40},"lighting":{"type":"string","maxLength":40},"palette":{"type":"string","maxLength":40},"moveset":{"type":"string","maxLength":40},"note":{"type":"string","maxLength":400}},"additionalProperties":false},{"type":"null"}]},"product_id":{"type":"string","format":"uuid"},"text_mode":{"type":"string","enum":["editable","baked"]}},"additionalProperties":false},"dry_run":{"type":"boolean","default":false},"finish":{"type":"object","properties":{"assemble":{"type":"object","properties":{"captions":{"type":"string","enum":["burned","sidecar","both","none"]},"aspect_ratio":{"type":"string","enum":["9:16","16:9","1:1"]},"caption_style":{"type":"string","minLength":1,"maxLength":40,"default":"heavy"},"caption_overrides":{"type":"object","properties":{"font":{"type":"string","minLength":1,"maxLength":60},"bold":{"type":"boolean"},"size_pct":{"type":"number","minimum":0.015,"maximum":0.12},"case":{"type":"string","enum":["upper","sentence"]},"fill":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"stroke":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"stroke_pct":{"type":"number","minimum":0,"maximum":0.02},"active":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"position_pct":{"type":"number","minimum":0.14,"maximum":0.65},"words_per_page":{"type":"integer","minimum":1,"maximum":8}},"additionalProperties":false,"default":{}},"loudness_target":{"type":"number","enum":[-14,-16],"default":-14},"preset":{"type":"string","enum":["medium","veryfast"],"default":"medium"},"bed_asset_id":{"type":"string","format":"uuid"},"end_card":{"type":"object","properties":{"series":{"type":"string","minLength":1,"maxLength":80},"episode":{"type":"integer","minimum":1,"maximum":9999},"cta":{"type":"string","minLength":1,"maxLength":120},"logo":{"type":"boolean","default":true}},"additionalProperties":false},"hook_card":{"type":"string","minLength":1,"maxLength":120},"breath_sec":{"type":"number","minimum":0,"maximum":1.5,"default":0.3},"still_hold_sec":{"type":"number","minimum":0.5,"maximum":15},"transition":{"type":"object","properties":{"kind":{"type":"string","enum":["cut","crossfade"]},"sec":{"type":"number","minimum":0.2,"maximum":1.5}},"required":["kind"],"additionalProperties":false}},"required":["captions"],"additionalProperties":false}},"required":["assemble"],"additionalProperties":false}},"required":["recipe","params"],"additionalProperties":false},{"type":"object","properties":{"recipe":{"type":"string","const":"ugc"},"params":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"brief":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"summary":{"type":"string","maxLength":2000},"features":{"type":"array","items":{"type":"string","minLength":1,"maxLength":200},"maxItems":8},"benefit":{"type":"string","maxLength":300},"problem":{"type":"string","maxLength":300},"category":{"type":"string","maxLength":120},"audience":{"type":"string","maxLength":200},"price":{"type":"string","maxLength":40}},"required":["name"],"additionalProperties":false},"product_id":{"type":"string","format":"uuid"},"structure":{"type":"string","minLength":1,"maxLength":40},"vertical":{"type":"string","maxLength":40},"capture_style":{"type":"string","maxLength":40},"brand_kit_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"hook":{"type":"string","minLength":1,"maxLength":40},"platform":{"type":"string","minLength":1,"maxLength":40,"default":"tiktok"},"aspect_ratio":{"type":"string","enum":["9:16","16:9","1:1"]},"hook_variants":{"type":"integer","minimum":0,"maximum":5,"default":0},"resolution":{"type":"string","enum":["360p","480p","720p","1080p","4k"],"default":"720p"},"provider":{"type":"string","enum":["import","cut","kling","omni","veo","seedance","fake","gateway","fal","evolink","nano","seedream","openai","eleven","minimax","bfl","bfl_video","alibaba","xai","runway","runway_image","anthropic","openai_text","gemini"]},"model":{"type":"string","minLength":1,"maxLength":200},"client_tag":{"type":"string","maxLength":80},"creator_image_url":{"type":"string","format":"uri"},"creator_asset_id":{"type":"string","format":"uuid"},"image_urls":{"type":"array","items":{"type":"string","format":"uri"},"maxItems":6},"image_asset_ids":{"type":"array","items":{"type":"string","format":"uuid"},"maxItems":6},"product_asset_ids":{"type":"array","items":{"type":"string","format":"uuid"},"maxItems":24},"look":{"anyOf":[{"type":"object","properties":{"genre":{"type":"string","maxLength":40},"style":{"type":"string","maxLength":40},"lighting":{"type":"string","maxLength":40},"palette":{"type":"string","maxLength":40},"moveset":{"type":"string","maxLength":40},"note":{"type":"string","maxLength":400}},"additionalProperties":false},{"type":"null"}]},"lines":{"type":"array","items":{"type":"string","maxLength":600},"maxItems":16}},"additionalProperties":false},"dry_run":{"type":"boolean","default":false},"finish":{"type":"object","properties":{"assemble":{"type":"object","properties":{"captions":{"type":"string","enum":["burned","sidecar","both","none"]},"aspect_ratio":{"type":"string","enum":["9:16","16:9","1:1"]},"caption_style":{"type":"string","minLength":1,"maxLength":40,"default":"heavy"},"caption_overrides":{"type":"object","properties":{"font":{"type":"string","minLength":1,"maxLength":60},"bold":{"type":"boolean"},"size_pct":{"type":"number","minimum":0.015,"maximum":0.12},"case":{"type":"string","enum":["upper","sentence"]},"fill":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"stroke":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"stroke_pct":{"type":"number","minimum":0,"maximum":0.02},"active":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"position_pct":{"type":"number","minimum":0.14,"maximum":0.65},"words_per_page":{"type":"integer","minimum":1,"maximum":8}},"additionalProperties":false,"default":{}},"loudness_target":{"type":"number","enum":[-14,-16],"default":-14},"preset":{"type":"string","enum":["medium","veryfast"],"default":"medium"},"bed_asset_id":{"type":"string","format":"uuid"},"end_card":{"type":"object","properties":{"series":{"type":"string","minLength":1,"maxLength":80},"episode":{"type":"integer","minimum":1,"maximum":9999},"cta":{"type":"string","minLength":1,"maxLength":120},"logo":{"type":"boolean","default":true}},"additionalProperties":false},"hook_card":{"type":"string","minLength":1,"maxLength":120},"breath_sec":{"type":"number","minimum":0,"maximum":1.5,"default":0.3},"still_hold_sec":{"type":"number","minimum":0.5,"maximum":15},"transition":{"type":"object","properties":{"kind":{"type":"string","enum":["cut","crossfade"]},"sec":{"type":"number","minimum":0.2,"maximum":1.5}},"required":["kind"],"additionalProperties":false}},"required":["captions"],"additionalProperties":false}},"required":["assemble"],"additionalProperties":false}},"required":["recipe","params"],"additionalProperties":false},{"type":"object","properties":{"recipe":{"type":"string","const":"photodump"},"params":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"aesthetic":{"type":"string","minLength":1,"maxLength":40},"setting":{"type":"string","minLength":1,"maxLength":300},"wardrobe":{"type":"string","maxLength":300},"count":{"type":"integer","minimum":1,"maximum":26,"default":12},"creator_image_url":{"type":"string","format":"uri"},"creator_asset_id":{"type":"string","format":"uuid"},"provider":{"type":"string","enum":["import","cut","kling","omni","veo","seedance","fake","gateway","fal","evolink","nano","seedream","openai","eleven","minimax","bfl","bfl_video","alibaba","xai","runway","runway_image","anthropic","openai_text","gemini"]},"model":{"type":"string","minLength":1,"maxLength":200},"resolution":{"type":"string","enum":["1K","2K","4K","360p","480p","720p","1080p","4k"]},"aspect_ratio":{"type":"string","enum":["16:9","9:16","1:1","4:3","3:4"],"default":"9:16"},"client_tag":{"type":"string","maxLength":80},"text_mode":{"type":"string","enum":["editable","baked"]}},"required":["aesthetic","setting"],"additionalProperties":false},"dry_run":{"type":"boolean","default":false},"finish":{"type":"object","properties":{"assemble":{"type":"object","properties":{"captions":{"type":"string","enum":["burned","sidecar","both","none"]},"aspect_ratio":{"type":"string","enum":["9:16","16:9","1:1"]},"caption_style":{"type":"string","minLength":1,"maxLength":40,"default":"heavy"},"caption_overrides":{"type":"object","properties":{"font":{"type":"string","minLength":1,"maxLength":60},"bold":{"type":"boolean"},"size_pct":{"type":"number","minimum":0.015,"maximum":0.12},"case":{"type":"string","enum":["upper","sentence"]},"fill":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"stroke":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"stroke_pct":{"type":"number","minimum":0,"maximum":0.02},"active":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"position_pct":{"type":"number","minimum":0.14,"maximum":0.65},"words_per_page":{"type":"integer","minimum":1,"maximum":8}},"additionalProperties":false,"default":{}},"loudness_target":{"type":"number","enum":[-14,-16],"default":-14},"preset":{"type":"string","enum":["medium","veryfast"],"default":"medium"},"bed_asset_id":{"type":"string","format":"uuid"},"end_card":{"type":"object","properties":{"series":{"type":"string","minLength":1,"maxLength":80},"episode":{"type":"integer","minimum":1,"maximum":9999},"cta":{"type":"string","minLength":1,"maxLength":120},"logo":{"type":"boolean","default":true}},"additionalProperties":false},"hook_card":{"type":"string","minLength":1,"maxLength":120},"breath_sec":{"type":"number","minimum":0,"maximum":1.5,"default":0.3},"still_hold_sec":{"type":"number","minimum":0.5,"maximum":15},"transition":{"type":"object","properties":{"kind":{"type":"string","enum":["cut","crossfade"]},"sec":{"type":"number","minimum":0.2,"maximum":1.5}},"required":["kind"],"additionalProperties":false}},"required":["captions"],"additionalProperties":false}},"required":["assemble"],"additionalProperties":false}},"required":["recipe","params"],"additionalProperties":false},{"type":"object","properties":{"recipe":{"type":"string","const":"explainer"},"params":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"structure":{"type":"string","minLength":1,"maxLength":40},"style":{"type":"string","minLength":1,"maxLength":40},"topic":{"type":"string","minLength":1,"maxLength":300},"audience":{"type":"string","maxLength":200},"subject":{"type":"string","maxLength":300},"target_duration_sec":{"type":"integer","minimum":20,"maximum":900,"default":90},"provider":{"type":"string","enum":["import","cut","kling","omni","veo","seedance","fake","gateway","fal","evolink","nano","seedream","openai","eleven","minimax","bfl","bfl_video","alibaba","xai","runway","runway_image","anthropic","openai_text","gemini"]},"model":{"type":"string","minLength":1,"maxLength":200},"resolution":{"type":"string","enum":["360p","480p","720p","1080p","4k"],"default":"720p"},"aspect_ratio":{"type":"string","enum":["16:9","9:16","1:1"],"default":"16:9"},"client_tag":{"type":"string","maxLength":80},"narration":{"type":"array","items":{"type":"string","maxLength":1200},"maxItems":120},"voice_id":{"type":"string","minLength":1,"maxLength":120}},"required":["structure","topic"],"additionalProperties":false},"dry_run":{"type":"boolean","default":false},"finish":{"type":"object","properties":{"assemble":{"type":"object","properties":{"captions":{"type":"string","enum":["burned","sidecar","both","none"]},"aspect_ratio":{"type":"string","enum":["9:16","16:9","1:1"]},"caption_style":{"type":"string","minLength":1,"maxLength":40,"default":"heavy"},"caption_overrides":{"type":"object","properties":{"font":{"type":"string","minLength":1,"maxLength":60},"bold":{"type":"boolean"},"size_pct":{"type":"number","minimum":0.015,"maximum":0.12},"case":{"type":"string","enum":["upper","sentence"]},"fill":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"stroke":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"stroke_pct":{"type":"number","minimum":0,"maximum":0.02},"active":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"position_pct":{"type":"number","minimum":0.14,"maximum":0.65},"words_per_page":{"type":"integer","minimum":1,"maximum":8}},"additionalProperties":false,"default":{}},"loudness_target":{"type":"number","enum":[-14,-16],"default":-14},"preset":{"type":"string","enum":["medium","veryfast"],"default":"medium"},"bed_asset_id":{"type":"string","format":"uuid"},"end_card":{"type":"object","properties":{"series":{"type":"string","minLength":1,"maxLength":80},"episode":{"type":"integer","minimum":1,"maximum":9999},"cta":{"type":"string","minLength":1,"maxLength":120},"logo":{"type":"boolean","default":true}},"additionalProperties":false},"hook_card":{"type":"string","minLength":1,"maxLength":120},"breath_sec":{"type":"number","minimum":0,"maximum":1.5,"default":0.3},"still_hold_sec":{"type":"number","minimum":0.5,"maximum":15},"transition":{"type":"object","properties":{"kind":{"type":"string","enum":["cut","crossfade"]},"sec":{"type":"number","minimum":0.2,"maximum":1.5}},"required":["kind"],"additionalProperties":false}},"required":["captions"],"additionalProperties":false}},"required":["assemble"],"additionalProperties":false}},"required":["recipe","params"],"additionalProperties":false},{"type":"object","properties":{"recipe":{"type":"string","const":"faceless"},"params":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"structure":{"type":"string","minLength":1,"maxLength":40},"topic":{"type":"string","minLength":1,"maxLength":300},"brand":{"type":"string","maxLength":120},"audience":{"type":"string","maxLength":200},"count":{"type":"integer","minimum":1,"maximum":12},"look":{"type":"string","minLength":1,"maxLength":40},"preset":{"type":"string","enum":["short_30","short_60","short_90"],"default":"short_60"},"visual_mode":{"type":"string","enum":["stills","clips","i2v"]},"provider":{"type":"string","enum":["import","cut","kling","omni","veo","seedance","fake","gateway","fal","evolink","nano","seedream","openai","eleven","minimax","bfl","bfl_video","alibaba","xai","runway","runway_image","anthropic","openai_text","gemini"]},"model":{"type":"string","minLength":1,"maxLength":200},"image_provider":{"type":"string","enum":["import","cut","kling","omni","veo","seedance","fake","gateway","fal","evolink","nano","seedream","openai","eleven","minimax","bfl","bfl_video","alibaba","xai","runway","runway_image","anthropic","openai_text","gemini"]},"image_model":{"type":"string","minLength":1,"maxLength":200},"resolution":{"type":"string","enum":["1K","2K","4K","360p","480p","720p","1080p","4k"]},"aspect_ratio":{"type":"string","const":"9:16","default":"9:16"},"client_tag":{"type":"string","maxLength":80},"brand_kit_id":{"type":"string","format":"uuid"},"narration":{"type":"array","items":{"type":"string","maxLength":1200},"maxItems":24},"sources":{"type":"array","items":{"type":"string","format":"uri","maxLength":2000},"maxItems":12},"voice_id":{"type":"string","minLength":1,"maxLength":120},"caption_style":{"type":"string","minLength":1,"maxLength":40},"text_mode":{"type":"string","enum":["editable","baked"]},"writer":{"type":"object","properties":{"provider":{"type":"string","enum":["import","cut","kling","omni","veo","seedance","fake","gateway","fal","evolink","nano","seedream","openai","eleven","minimax","bfl","bfl_video","alibaba","xai","runway","runway_image","anthropic","openai_text","gemini"]},"model":{"type":"string","minLength":1,"maxLength":200},"notes":{"type":"string","maxLength":2000}},"additionalProperties":false}},"required":["structure","topic"],"additionalProperties":false},"dry_run":{"type":"boolean","default":false},"finish":{"type":"object","properties":{"assemble":{"type":"object","properties":{"captions":{"type":"string","enum":["burned","sidecar","both","none"]},"aspect_ratio":{"type":"string","enum":["9:16","16:9","1:1"]},"caption_style":{"type":"string","minLength":1,"maxLength":40,"default":"heavy"},"caption_overrides":{"type":"object","properties":{"font":{"type":"string","minLength":1,"maxLength":60},"bold":{"type":"boolean"},"size_pct":{"type":"number","minimum":0.015,"maximum":0.12},"case":{"type":"string","enum":["upper","sentence"]},"fill":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"stroke":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"stroke_pct":{"type":"number","minimum":0,"maximum":0.02},"active":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"position_pct":{"type":"number","minimum":0.14,"maximum":0.65},"words_per_page":{"type":"integer","minimum":1,"maximum":8}},"additionalProperties":false,"default":{}},"loudness_target":{"type":"number","enum":[-14,-16],"default":-14},"preset":{"type":"string","enum":["medium","veryfast"],"default":"medium"},"bed_asset_id":{"type":"string","format":"uuid"},"end_card":{"type":"object","properties":{"series":{"type":"string","minLength":1,"maxLength":80},"episode":{"type":"integer","minimum":1,"maximum":9999},"cta":{"type":"string","minLength":1,"maxLength":120},"logo":{"type":"boolean","default":true}},"additionalProperties":false},"hook_card":{"type":"string","minLength":1,"maxLength":120},"breath_sec":{"type":"number","minimum":0,"maximum":1.5,"default":0.3},"still_hold_sec":{"type":"number","minimum":0.5,"maximum":15},"transition":{"type":"object","properties":{"kind":{"type":"string","enum":["cut","crossfade"]},"sec":{"type":"number","minimum":0.2,"maximum":1.5}},"required":["kind"],"additionalProperties":false}},"required":["captions"],"additionalProperties":false}},"required":["assemble"],"additionalProperties":false}},"required":["recipe","params"],"additionalProperties":false}]},"RunRecipeBatch":{"anyOf":[{"type":"object","properties":{"recipe":{"type":"string","const":"marketing"},"product_ids":{"type":"array","items":{"type":"string","format":"uuid"},"minItems":1,"maxItems":12},"params":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"brief":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"url":{"type":"string","format":"uri"},"summary":{"type":"string","maxLength":2000},"features":{"type":"array","items":{"type":"string","minLength":1,"maxLength":200},"maxItems":8},"price":{"type":"string","maxLength":40},"price_on_screen":{"type":"boolean","default":true},"brand_tone":{"type":"string","maxLength":200},"avatar":{"type":"string","maxLength":300}},"required":["name"],"additionalProperties":false},"format":{"type":"string","minLength":1,"maxLength":40},"brand_kit_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"vertical":{"type":"string","maxLength":40},"capture_style":{"type":"string","maxLength":40},"aspect_ratio":{"type":"string","enum":["9:16","16:9","1:1"]},"resolution":{"type":"string","enum":["360p","480p","720p","1080p","4k"],"default":"720p"},"target_duration_sec":{"type":"integer","minimum":4,"maximum":120,"default":15},"provider":{"type":"string","enum":["import","cut","kling","omni","veo","seedance","fake","gateway","fal","evolink","nano","seedream","openai","eleven","minimax","bfl","bfl_video","alibaba","xai","runway","runway_image","anthropic","openai_text","gemini"]},"model":{"type":"string","minLength":1,"maxLength":200},"client_tag":{"type":"string","maxLength":80},"image_urls":{"type":"array","items":{"type":"string","format":"uri"},"maxItems":6},"image_asset_ids":{"type":"array","items":{"type":"string","format":"uuid"},"maxItems":6},"product_asset_ids":{"type":"array","items":{"type":"string","format":"uuid"},"maxItems":24},"look":{"anyOf":[{"type":"object","properties":{"genre":{"type":"string","maxLength":40},"style":{"type":"string","maxLength":40},"lighting":{"type":"string","maxLength":40},"palette":{"type":"string","maxLength":40},"moveset":{"type":"string","maxLength":40},"note":{"type":"string","maxLength":400}},"additionalProperties":false},{"type":"null"}]},"product_id":{"type":"string","format":"uuid"},"text_mode":{"type":"string","enum":["editable","baked"]}},"additionalProperties":false},"continue_on_error":{"type":"boolean","default":true},"dry_run":{"type":"boolean","default":false},"finish":{"type":"object","properties":{"assemble":{"type":"object","properties":{"captions":{"type":"string","enum":["burned","sidecar","both","none"]},"aspect_ratio":{"type":"string","enum":["9:16","16:9","1:1"]},"caption_style":{"type":"string","minLength":1,"maxLength":40,"default":"heavy"},"caption_overrides":{"type":"object","properties":{"font":{"type":"string","minLength":1,"maxLength":60},"bold":{"type":"boolean"},"size_pct":{"type":"number","minimum":0.015,"maximum":0.12},"case":{"type":"string","enum":["upper","sentence"]},"fill":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"stroke":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"stroke_pct":{"type":"number","minimum":0,"maximum":0.02},"active":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"position_pct":{"type":"number","minimum":0.14,"maximum":0.65},"words_per_page":{"type":"integer","minimum":1,"maximum":8}},"additionalProperties":false,"default":{}},"loudness_target":{"type":"number","enum":[-14,-16],"default":-14},"preset":{"type":"string","enum":["medium","veryfast"],"default":"medium"},"bed_asset_id":{"type":"string","format":"uuid"},"end_card":{"type":"object","properties":{"series":{"type":"string","minLength":1,"maxLength":80},"episode":{"type":"integer","minimum":1,"maximum":9999},"cta":{"type":"string","minLength":1,"maxLength":120},"logo":{"type":"boolean","default":true}},"additionalProperties":false},"hook_card":{"type":"string","minLength":1,"maxLength":120},"breath_sec":{"type":"number","minimum":0,"maximum":1.5,"default":0.3},"still_hold_sec":{"type":"number","minimum":0.5,"maximum":15},"transition":{"type":"object","properties":{"kind":{"type":"string","enum":["cut","crossfade"]},"sec":{"type":"number","minimum":0.2,"maximum":1.5}},"required":["kind"],"additionalProperties":false}},"required":["captions"],"additionalProperties":false}},"required":["assemble"],"additionalProperties":false}},"required":["recipe","product_ids","params"],"additionalProperties":false},{"type":"object","properties":{"recipe":{"type":"string","const":"ugc"},"product_ids":{"type":"array","items":{"type":"string","format":"uuid"},"minItems":1,"maxItems":12},"params":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"brief":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"summary":{"type":"string","maxLength":2000},"features":{"type":"array","items":{"type":"string","minLength":1,"maxLength":200},"maxItems":8},"benefit":{"type":"string","maxLength":300},"problem":{"type":"string","maxLength":300},"category":{"type":"string","maxLength":120},"audience":{"type":"string","maxLength":200},"price":{"type":"string","maxLength":40}},"required":["name"],"additionalProperties":false},"product_id":{"type":"string","format":"uuid"},"structure":{"type":"string","minLength":1,"maxLength":40},"vertical":{"type":"string","maxLength":40},"capture_style":{"type":"string","maxLength":40},"brand_kit_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"hook":{"type":"string","minLength":1,"maxLength":40},"platform":{"type":"string","minLength":1,"maxLength":40,"default":"tiktok"},"aspect_ratio":{"type":"string","enum":["9:16","16:9","1:1"]},"hook_variants":{"type":"integer","minimum":0,"maximum":5,"default":0},"resolution":{"type":"string","enum":["360p","480p","720p","1080p","4k"],"default":"720p"},"provider":{"type":"string","enum":["import","cut","kling","omni","veo","seedance","fake","gateway","fal","evolink","nano","seedream","openai","eleven","minimax","bfl","bfl_video","alibaba","xai","runway","runway_image","anthropic","openai_text","gemini"]},"model":{"type":"string","minLength":1,"maxLength":200},"client_tag":{"type":"string","maxLength":80},"creator_image_url":{"type":"string","format":"uri"},"creator_asset_id":{"type":"string","format":"uuid"},"image_urls":{"type":"array","items":{"type":"string","format":"uri"},"maxItems":6},"image_asset_ids":{"type":"array","items":{"type":"string","format":"uuid"},"maxItems":6},"product_asset_ids":{"type":"array","items":{"type":"string","format":"uuid"},"maxItems":24},"look":{"anyOf":[{"type":"object","properties":{"genre":{"type":"string","maxLength":40},"style":{"type":"string","maxLength":40},"lighting":{"type":"string","maxLength":40},"palette":{"type":"string","maxLength":40},"moveset":{"type":"string","maxLength":40},"note":{"type":"string","maxLength":400}},"additionalProperties":false},{"type":"null"}]},"lines":{"type":"array","items":{"type":"string","maxLength":600},"maxItems":16}},"additionalProperties":false},"continue_on_error":{"type":"boolean","default":true},"dry_run":{"type":"boolean","default":false},"finish":{"type":"object","properties":{"assemble":{"type":"object","properties":{"captions":{"type":"string","enum":["burned","sidecar","both","none"]},"aspect_ratio":{"type":"string","enum":["9:16","16:9","1:1"]},"caption_style":{"type":"string","minLength":1,"maxLength":40,"default":"heavy"},"caption_overrides":{"type":"object","properties":{"font":{"type":"string","minLength":1,"maxLength":60},"bold":{"type":"boolean"},"size_pct":{"type":"number","minimum":0.015,"maximum":0.12},"case":{"type":"string","enum":["upper","sentence"]},"fill":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"stroke":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"stroke_pct":{"type":"number","minimum":0,"maximum":0.02},"active":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"position_pct":{"type":"number","minimum":0.14,"maximum":0.65},"words_per_page":{"type":"integer","minimum":1,"maximum":8}},"additionalProperties":false,"default":{}},"loudness_target":{"type":"number","enum":[-14,-16],"default":-14},"preset":{"type":"string","enum":["medium","veryfast"],"default":"medium"},"bed_asset_id":{"type":"string","format":"uuid"},"end_card":{"type":"object","properties":{"series":{"type":"string","minLength":1,"maxLength":80},"episode":{"type":"integer","minimum":1,"maximum":9999},"cta":{"type":"string","minLength":1,"maxLength":120},"logo":{"type":"boolean","default":true}},"additionalProperties":false},"hook_card":{"type":"string","minLength":1,"maxLength":120},"breath_sec":{"type":"number","minimum":0,"maximum":1.5,"default":0.3},"still_hold_sec":{"type":"number","minimum":0.5,"maximum":15},"transition":{"type":"object","properties":{"kind":{"type":"string","enum":["cut","crossfade"]},"sec":{"type":"number","minimum":0.2,"maximum":1.5}},"required":["kind"],"additionalProperties":false}},"required":["captions"],"additionalProperties":false}},"required":["assemble"],"additionalProperties":false}},"required":["recipe","product_ids","params"],"additionalProperties":false}]},"SaveProduct":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"url":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"summary":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"features":{"anyOf":[{"type":"array","items":{"type":"string","minLength":1,"maxLength":200},"maxItems":12},{"type":"null"}]},"price":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}]},"brand_tone":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}]},"avatar":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}]},"notes":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}]},"brand_kit_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]}},"required":["name"],"additionalProperties":false},"UpdateProduct":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"url":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"summary":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"features":{"anyOf":[{"type":"array","items":{"type":"string","minLength":1,"maxLength":200},"maxItems":12},{"type":"null"}]},"price":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}]},"brand_tone":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}]},"avatar":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}]},"notes":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}]},"brand_kit_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"archived":{"type":"boolean"}},"additionalProperties":false},"UpdateProductAsset":{"type":"object","properties":{"role":{"anyOf":[{"type":"string","enum":["packshot","lifestyle","how_it_works","infographic","product_map","packaging","beauty_shot","product_in_packaging"]},{"type":"null"}]}},"required":["role"],"additionalProperties":false},"SaveBrandKit":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"source_url":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"logo_asset_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"colors":{"anyOf":[{"type":"array","items":{"type":"string","pattern":"^#[0-9a-fA-F]{3,8}$"},"maxItems":8},{"type":"null"}]},"tone":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}]},"voice_id":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}]},"default_look":{"anyOf":[{"type":"object","properties":{"genre":{"type":"string","maxLength":40},"style":{"type":"string","maxLength":40},"lighting":{"type":"string","maxLength":40},"palette":{"type":"string","maxLength":40},"moveset":{"type":"string","maxLength":40},"note":{"type":"string","maxLength":400}},"additionalProperties":false},{"type":"null"}]}},"required":["name"],"additionalProperties":false},"BrandKitFromUrl":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"name":{"type":"string","minLength":1,"maxLength":120}},"required":["url"],"additionalProperties":false},"UpdateBrandKit":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"source_url":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"logo_asset_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"colors":{"anyOf":[{"type":"array","items":{"type":"string","pattern":"^#[0-9a-fA-F]{3,8}$"},"maxItems":8},{"type":"null"}]},"tone":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}]},"voice_id":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}]},"default_look":{"anyOf":[{"type":"object","properties":{"genre":{"type":"string","maxLength":40},"style":{"type":"string","maxLength":40},"lighting":{"type":"string","maxLength":40},"palette":{"type":"string","maxLength":40},"moveset":{"type":"string","maxLength":40},"note":{"type":"string","maxLength":400}},"additionalProperties":false},{"type":"null"}]},"archived":{"type":"boolean"}},"additionalProperties":false},"DriveImport":{"type":"object","properties":{"file_ids":{"type":"array","items":{"type":"string","minLength":1,"maxLength":200},"minItems":1,"maxItems":8},"destination":{"anyOf":[{"type":"object","properties":{"kind":{"type":"string","const":"product"},"product_id":{"type":"string","format":"uuid"}},"required":["kind","product_id"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"creator"}},"required":["kind"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"lot_ref"},"project_id":{"type":"string","format":"uuid"}},"required":["kind","project_id"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"scene_ref"},"scene_id":{"type":"string","format":"uuid"}},"required":["kind","scene_id"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"start_frame"},"scene_id":{"type":"string","format":"uuid"}},"required":["kind","scene_id"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"audio"},"scene_id":{"type":"string","format":"uuid"}},"required":["kind","scene_id"],"additionalProperties":false}]}},"required":["file_ids","destination"],"additionalProperties":false},"PutProviderKey":{"type":"object","properties":{"scheme":{"type":"string","enum":["bearer","jwt_pair","gemini_key","vertex_sa"],"default":"bearer"},"api_key":{"type":"string","minLength":1},"access_key":{"type":"string","minLength":1},"secret_key":{"type":"string","minLength":1}},"additionalProperties":false},"PatchKey":{"type":"object","properties":{"label":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}]},"owner":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}]},"is_default":{"type":"boolean","const":true}},"additionalProperties":false},"AddPlatformKey":{"type":"object","properties":{"scheme":{"type":"string","enum":["bearer","jwt_pair","gemini_key","vertex_sa"],"default":"bearer"},"api_key":{"type":"string","minLength":1},"access_key":{"type":"string","minLength":1},"secret_key":{"type":"string","minLength":1},"label":{"type":"string","maxLength":80},"owner":{"type":"string","maxLength":80}},"additionalProperties":false},"CreateApiKey":{"type":"object","properties":{"name":{"type":"string","maxLength":80},"scopes":{"type":"array","items":{"type":"string","enum":["read","write","render","admin"]},"minItems":1,"maxItems":4},"brand_kit_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]}},"additionalProperties":false},"UpdateApiKey":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"scopes":{"type":"array","items":{"type":"string","enum":["read","write","render","admin"]},"minItems":1,"maxItems":4}},"additionalProperties":false},"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}},"additionalProperties":true}}}}}}