{"openapi":"3.1.0","info":{"title":"FastAPI","version":"0.1.0"},"paths":{"/users/sources/list_files":{"get":{"tags":["accepts-api-key"],"summary":"Request Files Processing","operationId":"request_files_processing_users_sources_list_files_get","parameters":[{"name":"path","in":"query","required":true,"schema":{"type":"string","title":"Path"}},{"name":"limit","in":"query","required":true,"schema":{"type":"integer","exclusiveMinimum":0,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Page"}},{"name":"offset","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Offset"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"folder_on_top","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Folder On Top"}},{"name":"group_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group Name"}},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"enum":["modified_at","added_at"],"type":"string"},{"type":"null"}],"title":"Sort By"}},{"name":"sort_order","in":"query","required":false,"schema":{"enum":["asc","desc"],"type":"string","default":"desc","title":"Sort Order"}},{"name":"filetype","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/FileType"}},{"type":"null"}],"title":"Filetype"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListFilesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/get":{"get":{"tags":["accepts-api-key"],"summary":"Get User","operationId":"get_user_users_get_get","deprecated":true,"parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiUser"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/me":{"get":{"tags":["accepts-api-key"],"summary":"Get Current User","description":"Return the authenticated user's profile, credit balance, and subscription snapshot.","operationId":"get_current_user_users_me_get","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiUser"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["accepts-api-key"],"summary":"Update Current User","operationId":"update_current_user_users_me_patch","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUserRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiUser"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["accepts-api-key"],"summary":"Delete Current User","description":"Preview — or, with ``dry_run=false``, carry out — deleting your own account (SSE).\n\n**This previews by default.** ``dry_run`` is true unless you say otherwise,\nso a call that forgets the parameter reports what deleting the account\n*would* take and touches nothing. The ``done`` event carries ``preview``\nwith the counts — assets, chats, assistants, groups, the Stripe\nsubscriptions that would be cancelled, whether the Firebase login would go\ntoo — for showing the user what they are about to lose.\n\nA caller that means it passes ``dry_run=false``. That runs the same purge\nas ``POST /admin/delete_account`` and streams the same events: the Stripe\nsubscriptions, every asset the user created with its renditions and\nkeyframes, their chats, the assistants they authored and the media those\ncarry, the groups they solely own, the SQL row, the S3 objects and — in\nproduction only — the Firebase account.\n\n**A client that means to delete must check what it got.** Both modes answer\n200 and end in a ``done`` event; only ``dry_run`` and the counters\ndistinguish them. Reporting \"your account is deleted\" off the status code\nalone would be wrong for the default call, which deleted nothing.\n\nIt streams rather than answering once because a large account takes longer\nto delete than a load balancer will hold an idle connection open; the\nprogress events are what keep it open. A caller that disconnects does not\nstop the purge, and calling again finishes whatever was left.\n\nThe email keeps its signup-history row, so registering again with the same\naddress earns no second signup grant.","operationId":"delete_current_user_users_me_delete","parameters":[{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","description":"Defaults to **true**: the call previews and deletes nothing. Pass `dry_run=false` to actually delete the account. Check the `done` event's `dry_run` field to see which of the two you got.","default":true,"title":"Dry Run"},"description":"Defaults to **true**: the call previews and deletes nothing. Pass `dry_run=false` to actually delete the account. Check the `done` event's `dry_run` field to see which of the two you got."},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Server-sent events. `progress` events report each stage as it happens; the final `done` event is the object below — a summary of what was deleted, or, on a dry run, a `preview` of what would be.","content":{"text/event-stream":{"schema":{"type":"string","$ref":"#/components/schemas/DeleteAccountSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/create":{"post":{"summary":"Create User","operationId":"create_user_users_create_post","parameters":[{"name":"email","in":"query","required":true,"schema":{"type":"string","description":"Email address of the existing Firebase user.","format":"email","title":"Email"},"description":"Email address of the existing Firebase user."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/update":{"post":{"summary":"Update User","operationId":"update_user_users_update_post","deprecated":true,"parameters":[{"name":"firstname","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Firstname"}},{"name":"lastname","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lastname"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"boolean","title":"Response Update User Users Update Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/check_coupons":{"get":{"tags":["accepts-api-key"],"summary":"Check Coupons","operationId":"check_coupons_users_check_coupons_get","parameters":[{"name":"coupon_code","in":"query","required":true,"schema":{"type":"string","description":"Stripe promotion code to validate.","title":"Coupon Code"},"description":"Stripe promotion code to validate."},{"name":"currency","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Lowercase ISO currency the prices are shown in (the checkout `currency`). An amount discount is then described in it, and a coupon that can't be charged in it comes back invalid.","title":"Currency"},"description":"Lowercase ISO currency the prices are shown in (the checkout `currency`). An amount discount is then described in it, and a coupon that can't be charged in it comes back invalid."},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CouponCheckResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/me/promo_offer":{"get":{"summary":"Get Current Promo Offer","description":"The temporary upsell offer the signed-in user has now, if any.\n\nAsking may start an offer's one-hour window (for example the first time a\nbalance runs low), so the app calls it when it is about to show one. The\nsame offer is pushed on ``/users/ws`` as ``promo_offer``.","operationId":"get_current_promo_offer_users_me_promo_offer_get","parameters":[{"name":"out_of_tokens","in":"query","required":false,"schema":{"type":"boolean","description":"Set when a request just failed for lack of tokens; counts as a low balance even when the balance is above the threshold.","default":false,"title":"Out Of Tokens"},"description":"Set when a request just failed for lack of tokens; counts as a low balance even when the balance is above the threshold."},{"name":"storage_full","in":"query","required":false,"schema":{"type":"boolean","description":"Set when a request just failed because the library is over its storage allowance.","default":false,"title":"Storage Full"},"description":"Set when a request just failed because the library is over its storage allowance."},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiPromoOfferResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/checkout_redirect":{"get":{"summary":"Checkout Redirect","description":"One navigation to Stripe Checkout.\n\nPrefer a session cookie from ``POST /users/refresh_session_cookie`` (with\n``fetch(..., credentials: 'include')`` from the app origin) so this URL needs no\nquery token. Otherwise use ``?access_token=<firebase_id_token>`` for a plain link\n(Authorization header is not sent on full-page navigations).","operationId":"checkout_redirect_users_checkout_redirect_get","parameters":[{"name":"pricing_tier","in":"query","required":true,"schema":{"type":"string","description":"Plan tier_id from GET /billing/catalog (e.g. starter_90tt_9d, monthly, yearly).","title":"Pricing Tier"},"description":"Plan tier_id from GET /billing/catalog (e.g. starter_90tt_9d, monthly, yearly)."},{"name":"coupon_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coupon Code"}},{"name":"calling_page","in":"query","required":false,"schema":{"type":"string","default":"","title":"Calling Page"}},{"name":"return_origin","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Trusted frontend origin for Stripe success/cancel (e.g. https://localhost:3000). If omitted, the first trusted match is used: Origin header, then Referer origin; otherwise https://app.tellers.ai.","title":"Return Origin"},"description":"Trusted frontend origin for Stripe success/cancel (e.g. https://localhost:3000). If omitted, the first trusted match is used: Origin header, then Referer origin; otherwise https://app.tellers.ai."},{"name":"item_list","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Repeatable item list entries as 'price_id:quantity', e.g. item_list=price_x:200&item_list=price_y:1.","title":"Item List"},"description":"Repeatable item list entries as 'price_id:quantity', e.g. item_list=price_x:200&item_list=price_y:1."},{"name":"currency","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Lowercase ISO currency to charge in; must be listed in the plan's `currencies` from GET /billing/catalog. A customer with an active subscription must keep its currency (defaults to it when omitted).","title":"Currency"},"description":"Lowercase ISO currency to charge in; must be listed in the plan's `currencies` from GET /billing/catalog. A customer with an active subscription must keep its currency (defaults to it when omitted)."},{"name":"access_token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/billing_portal_redirect":{"get":{"summary":"Billing Portal Redirect","description":"Redirect the signed-in user to Stripe Customer Portal.","operationId":"billing_portal_redirect_users_billing_portal_redirect_get","parameters":[{"name":"calling_page","in":"query","required":false,"schema":{"type":"string","default":"","title":"Calling Page"}},{"name":"return_origin","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Trusted frontend origin for Stripe Billing Portal return (e.g. https://localhost:3000). If omitted, the first trusted match is used: Origin header, then Referer origin; otherwise https://app.tellers.ai.","title":"Return Origin"},"description":"Trusted frontend origin for Stripe Billing Portal return (e.g. https://localhost:3000). If omitted, the first trusted match is used: Origin header, then Referer origin; otherwise https://app.tellers.ai."},{"name":"access_token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/subscription/change-plan":{"post":{"summary":"Change Subscription Plan","operationId":"change_subscription_plan_users_subscription_change_plan_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionChangePlanRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionChangePlanResponse"}}}},"403":{"description":"The account's email is not verified yet, so it cannot spend tokens. Nothing was charged. `detail.code` is `EMAIL_NOT_VERIFIED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailNotVerifiedErrorBody"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/refresh_session_cookie":{"post":{"summary":"Refresh Session Cookie","description":"Store the current Firebase ID token in an HttpOnly cookie.\n\nThe route runs normal Bearer verification (same as any other login) before\nechoing that token into the cookie. Subsequent requests validate the cookie\nvia the same ``verify_id_token`` path. Refresh this cookie when the client\nrefreshes the Firebase ID token.","operationId":"refresh_session_cookie_users_refresh_session_cookie_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/assets/multipart/complete":{"post":{"tags":["accepts-api-key"],"summary":"Complete Multipart Asset Upload","description":"Complete a multipart upload. Client must supply ETags returned from each part upload.","operationId":"complete_multipart_asset_upload_users_assets_multipart_complete_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultipartCompleteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/assets/multipart/part_urls":{"post":{"tags":["accepts-api-key"],"summary":"Create Multipart Part Urls","description":"Presign fresh part URLs for an in-flight multipart upload.\n\nCalled as the upload progresses, so a part is always sent with a URL minted\nmoments before, and a part rejected with 403 can be retried with a new one.","operationId":"create_multipart_part_urls_users_assets_multipart_part_urls_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultipartPartUrlsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultipartPartUrlsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/assets/multipart/abort":{"post":{"tags":["accepts-api-key"],"summary":"Abort Multipart Asset Upload","operationId":"abort_multipart_asset_upload_users_assets_multipart_abort_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultipartAbortRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/assets/uploads":{"post":{"tags":["accepts-api-key"],"summary":"Create Uploads","description":"Start uploading assets.\n\nA single-part asset gets its ``presigned_put_url``. A multipart asset gets\nits ``multipart_upload_id``, part size and part count but no part URLs:\nfetch each part's URL from ``/assets/multipart/part_urls`` just before\nsending that part, and a fresh one for a retry. Part URLs are signed with\ntemporary credentials, so one minted long before use can have expired.","operationId":"create_uploads_users_assets_uploads_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AssetUploadRequest"},"title":"Assets"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AssetUploadResponse"},"title":"Response Create Uploads Users Assets Uploads Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/assets/upload_urls":{"post":{"tags":["accepts-api-key"],"summary":"Create Upload Urls","description":"Deprecated: use ``/assets/uploads``.\n\nPresigns every part of a multipart upload up front. Those URLs are signed\nwith temporary credentials and can expire before a large upload reaches\nits last parts, which S3 then rejects with 403.","operationId":"create_upload_urls_users_assets_upload_urls_post","deprecated":true,"parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AssetUploadRequest"},"title":"Assets"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AssetUploadResponse"},"title":"Response Create Upload Urls Users Assets Upload Urls Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/assets/preprocess":{"post":{"tags":["accepts-api-key"],"summary":"Process Assets","operationId":"process_assets_users_assets_preprocess_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessAssetsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RequestTaskResponse"},"title":"Response Process Assets Users Assets Preprocess Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/api_keys/create":{"post":{"summary":"Create Api Key","operationId":"create_api_key_users_api_keys_create_post","parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","title":"Name"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/api_keys/list":{"get":{"summary":"List Api Keys","operationId":"list_api_keys_users_api_keys_list_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"string"},"title":"Response List Api Keys Users Api Keys List Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/api_keys/delete":{"delete":{"summary":"Delete Api Key","operationId":"delete_api_key_users_api_keys_delete_delete","parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","title":"Name"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/tasks/{task_id}":{"get":{"tags":["accepts-api-key"],"summary":"Get User Task","operationId":"get_user_task_users_tasks__task_id__get","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/PendingTaskResponse"},{"$ref":"#/components/schemas/CompleteTaskResponse"},{"$ref":"#/components/schemas/FailedTaskResponse"}],"title":"Response Get User Task Users Tasks  Task Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["accepts-api-key"],"summary":"Cancel User Task","operationId":"cancel_user_task_users_tasks__task_id__delete","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelTaskResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/tasks":{"get":{"tags":["accepts-api-key"],"summary":"Get Tasks","description":"Get pending tasks and recently finished tasks for the user.\n\nArgs:\n    finish_before_seconds: Number of seconds to look back for finished tasks. Default is 300 (5 minutes).","operationId":"get_tasks_users_tasks_get","parameters":[{"name":"finish_before_seconds","in":"query","required":false,"schema":{"type":"integer","default":300,"title":"Finish Before Seconds"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TaskResponse"},"title":"Response Get Tasks Users Tasks Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tools/models":{"get":{"tags":["accepts-api-key"],"summary":"List Capabilities","description":"Describe every `/tools/*` capability and the options each accepts.","operationId":"list_capabilities_tools_models_get","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolsCapabilities"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tools/generate/video":{"post":{"tags":["accepts-api-key"],"summary":"Generate Video","operationId":"generate_video_tools_generate_video_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateVideoRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateVideoResponse"}}}},"402":{"description":"Not enough Tellers tokens to run this tool. The call was refused before the tool ran, so nothing was charged. Buy more tokens or wait for the next subscription grant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolErrorBody"}}}},"403":{"description":"The account's email is not verified yet, so it cannot spend tokens. Nothing was charged. `detail.code` is `EMAIL_NOT_VERIFIED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailNotVerifiedErrorBody"}}}},"413":{"description":"The account is already using all the storage its plan allows, and a generation would add another file. Nothing was charged and no provider was called. Delete files or move to a plan with more storage; `GET /users/me` reports both the usage and the quota.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolErrorBody"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tools/generate/image":{"post":{"tags":["accepts-api-key"],"summary":"Generate Image","operationId":"generate_image_tools_generate_image_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateImageRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateImageResponse"}}}},"402":{"description":"Not enough Tellers tokens to run this tool. The call was refused before the tool ran, so nothing was charged. Buy more tokens or wait for the next subscription grant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolErrorBody"}}}},"403":{"description":"The account's email is not verified yet, so it cannot spend tokens. Nothing was charged. `detail.code` is `EMAIL_NOT_VERIFIED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailNotVerifiedErrorBody"}}}},"413":{"description":"The account is already using all the storage its plan allows, and a generation would add another file. Nothing was charged and no provider was called. Delete files or move to a plan with more storage; `GET /users/me` reports both the usage and the quota.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolErrorBody"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tools/generate/audio":{"post":{"tags":["accepts-api-key"],"summary":"Generate Audio","operationId":"generate_audio_tools_generate_audio_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateAudioRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateAudioResponse"}}}},"402":{"description":"Not enough Tellers tokens to run this tool. The call was refused before the tool ran, so nothing was charged. Buy more tokens or wait for the next subscription grant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolErrorBody"}}}},"403":{"description":"The account's email is not verified yet, so it cannot spend tokens. Nothing was charged. `detail.code` is `EMAIL_NOT_VERIFIED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailNotVerifiedErrorBody"}}}},"413":{"description":"The account is already using all the storage its plan allows, and a generation would add another file. Nothing was charged and no provider was called. Delete files or move to a plan with more storage; `GET /users/me` reports both the usage and the quota.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolErrorBody"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tools/generate/tts":{"post":{"tags":["accepts-api-key"],"summary":"Generate Tts","operationId":"generate_tts_tools_generate_tts_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateTtsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateTtsResponse"}}}},"402":{"description":"Not enough Tellers tokens to run this tool. The call was refused before the tool ran, so nothing was charged. Buy more tokens or wait for the next subscription grant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolErrorBody"}}}},"403":{"description":"The account's email is not verified yet, so it cannot spend tokens. Nothing was charged. `detail.code` is `EMAIL_NOT_VERIFIED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailNotVerifiedErrorBody"}}}},"413":{"description":"The account is already using all the storage its plan allows, and a generation would add another file. Nothing was charged and no provider was called. Delete files or move to a plan with more storage; `GET /users/me` reports both the usage and the quota.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolErrorBody"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tools/search/stock":{"post":{"tags":["accepts-api-key"],"summary":"Search Stock","operationId":"search_stock_tools_search_stock_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchStockRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchStockResponse"}}}},"402":{"description":"Not enough Tellers tokens to run this tool. The call was refused before the tool ran, so nothing was charged. Buy more tokens or wait for the next subscription grant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolErrorBody"}}}},"403":{"description":"The account's email is not verified yet, so it cannot spend tokens. Nothing was charged. `detail.code` is `EMAIL_NOT_VERIFIED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailNotVerifiedErrorBody"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tools/search/assets":{"post":{"tags":["accepts-api-key"],"summary":"Search Assets","operationId":"search_assets_tools_search_assets_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchAssetsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchAssetsResponse"}}}},"402":{"description":"Not enough Tellers tokens to run this tool. The call was refused before the tool ran, so nothing was charged. Buy more tokens or wait for the next subscription grant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolErrorBody"}}}},"403":{"description":"The account's email is not verified yet, so it cannot spend tokens. Nothing was charged. `detail.code` is `EMAIL_NOT_VERIFIED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailNotVerifiedErrorBody"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tools/search/custom-agents":{"post":{"tags":["accepts-api-key"],"summary":"Search Custom Agents","operationId":"search_custom_agents_tools_search_custom_agents_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchCustomAgentsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchCustomAgentsResponse"}}}},"402":{"description":"Not enough Tellers tokens to run this tool. The call was refused before the tool ran, so nothing was charged. Buy more tokens or wait for the next subscription grant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolErrorBody"}}}},"403":{"description":"The account's email is not verified yet, so it cannot spend tokens. Nothing was charged. `detail.code` is `EMAIL_NOT_VERIFIED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailNotVerifiedErrorBody"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tools/search/voices":{"post":{"tags":["accepts-api-key"],"summary":"Search Voices","operationId":"search_voices_tools_search_voices_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchVoicesRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchVoicesResponse"}}}},"402":{"description":"Not enough Tellers tokens to run this tool. The call was refused before the tool ran, so nothing was charged. Buy more tokens or wait for the next subscription grant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolErrorBody"}}}},"403":{"description":"The account's email is not verified yet, so it cannot spend tokens. Nothing was charged. `detail.code` is `EMAIL_NOT_VERIFIED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailNotVerifiedErrorBody"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/video/downscale/{source_file_id}":{"post":{"summary":"Request Downscale","description":"Request downscaling of a video asset. Callable by users with WRITE on the asset or by admins.\n\nSet force=true to regenerate the proxy even if a matching rendition already exists.","operationId":"request_downscale_video_downscale__source_file_id__post","parameters":[{"name":"source_file_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Source File Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DownscaleRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DownscaleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/video/description/{source_file_id}":{"post":{"tags":["accepts-api-key"],"summary":"Request Description","description":"Run the description (Gemini analysis) task on an asset, or on a folder.\n\nRequires WRITE access on the asset or admin.\n\nFor a single asset, ``needs_downscale`` reports whether a player/Gemini-\ncompatible video rendition is missing. When it is, we encode a compatible\nproxy first and chain the description task after it (the downscale's\n``link`` callback), so Gemini only runs once a usable rendition exists. The\nreturned ``task_id`` always tracks the description task, so callers poll the\nsame id in both cases.\n\nPointed at a folder, it queues a walk of that folder instead and returns as\nsoon as the walk is queued: ``task_id`` then tracks the fan-out, which\ndispatches one description task per asset — each exactly as it would be\ndispatched on its own, proxy encode included — and ``needs_downscale`` is\nfalse, since which assets need one is only known once the walk runs. The\nfolder is walked recursively; assets the caller cannot write, and assets\nwhose media is not uploaded, are skipped. There is no limit on its size, and\nevery dispatched asset is billed — the preflight route reports how many that\nwill be before you commit to it.\n\nAn optional body forces the configuration to analyse under, so a one-off run\ndoes not need a tellers-config committed to the folder tree first. It\nreplaces what the tree resolves rather than merging over it. Every entity id\nin it is checked against the caller before anything is dispatched, and the\nwhole request is refused if one is not theirs. The same body on the preflight\nroute shows the resulting config first.","operationId":"request_description_video_description__source_file_id__post","parameters":[{"name":"source_file_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Source File Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/AnalysisConfigOverrideRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateDescriptionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/video/transcript/{source_file_id}":{"post":{"tags":["accepts-api-key"],"summary":"Request Transcript","description":"Generate a transcript for an asset, or for every asset in a folder.\n\nRequires WRITE access on the asset or admin. The task no-ops when a\ntranscript was already generated.\n\nFor a single asset, rejects types that cannot be transcribed with a 400.\nPointed at a folder, it queues a walk of that folder instead and returns as\nsoon as the walk is queued: ``task_id`` then tracks the fan-out, which\ndispatches one transcript task per asset. Types that cannot be transcribed\nare skipped there rather than rejected — a mixed folder is the normal case —\nas are assets the caller cannot write and assets whose media is not\nuploaded. The preflight route reports how many assets a folder would\ndispatch before you commit to it.\n\nUnlike the description route this takes no config override: speech-to-text\nreads none of the tellers-config. One sent here is refused with a 400 rather\nthan accepted and ignored, so a caller cannot believe a config applied to a\ntranscript when nothing read it.","operationId":"request_transcript_video_transcript__source_file_id__post","parameters":[{"name":"source_file_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Source File Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/AnalysisConfigOverrideRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateTranscriptResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/video/analysis-preflight/{source_file_id}":{"post":{"tags":["accepts-api-key"],"summary":"Analysis Preflight","description":"Report what analysing this asset would do, without dispatching anything.\n\nThe dry run for the two routes above, and it takes what they take: a file or\na folder. ``description_asset_count`` and ``transcript_asset_count`` are how\nmany assets each would dispatch — 0 or 1 for a file, the whole subtree for a\nfolder — counted through the very same path, permission, type and\nupload-status filters the walk uses, so the number is what will actually\nrun rather than an estimate.\n\n``config`` is the tellers-config the dispatched tasks will read, resolved at\nthis asset's own path. It is a complete ``TellersConfigFile`` — the same\nobject ``GET /asset/tellers-config/{asset_id}`` returns — with the merged\nanalysis settings and entity ids in it rather than beside it, so reading\n``config.analysis`` gives what will actually apply. ``config_assets`` lists\nthe config files that contributed, nearest last.\n\nFor a folder the counts cover the whole subtree while ``config`` is what a\nfile sitting directly in it resolves. ``overriding_config_assets`` lists the\ntellers-configs nested deeper that make those two disagree: assets under one\nof those resolve it instead, so while this is non-empty the reported config\ndoes not describe everything counted. It is capped, and\n``overriding_config_assets_truncated`` says when there were more.\n\nAn optional body forces a configuration, and ``config`` then reports what\nthat leaves in force — through ``apply_config_override``, the same function\nthe analysis itself applies it with, so what this shows is what would run.\nSince an override replaces the folder tree outright, this is also how to see\nwhat a given body drops: ``config_assets`` comes back empty, and any entity\nthe tree contributed is gone unless the body names it again. Its entity ids\nare validated exactly as the run routes validate them, which makes this the\nway to find out whether an override will be accepted without spending\nanything on it.\n\nIt is a POST because of that body, not because it changes anything: it\ndispatches nothing and bills nothing.\n\nRequires WRITE access, like the routes it previews: a folder's counts only\ninclude assets the caller can write, so the same call by two people can\nlegitimately return different numbers.","operationId":"analysis_preflight_video_analysis_preflight__source_file_id__post","parameters":[{"name":"source_file_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Source File Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/AnalysisConfigOverrideRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisPreflightResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/video/details/{source_file_id}":{"get":{"summary":"Get Details","operationId":"get_details_video_details__source_file_id__get","parameters":[{"name":"source_file_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Source File Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetDetails"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/asset/tellers-config/{asset_id}":{"get":{"summary":"Get Tellers Config By Id","description":"Get TellersConfigFile from ConfigAsset for the given asset id. User must have read access.","operationId":"get_tellers_config_by_id_asset_tellers_config__asset_id__get","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Asset Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TellersConfigFile"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Patch Tellers Config By Id","description":"Update non-entity tellers config fields without changing entity_to_use.\nSet merge_strategy to 'override' to stop inheriting the parent folders' configs,\nand generate_stt_with_diarization to turn speaker splitting in transcripts on or off.","operationId":"patch_tellers_config_by_id_asset_tellers_config__asset_id__patch","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Asset Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TellersConfigPatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TellersConfigFile"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/asset/tellers-config":{"get":{"summary":"Get Tellers Config","description":"Deprecated. Use GET /asset/tellers-config/{asset_id}.","operationId":"get_tellers_config_asset_tellers_config_get","deprecated":true,"parameters":[{"name":"asset_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Asset Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TellersConfigFile"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Create Tellers Config","description":"Create a tellers config Asset. Use path, or directory_id + name to create inside a folder. User must have WRITE on the directory when using directory_id. Returns the new asset id.","operationId":"create_tellers_config_asset_tellers_config_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TellersConfigCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TellersConfigCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/asset/tellers-config/entities":{"post":{"summary":"Tellers Config Add Entity","description":"Add entities (or all entities in folders) to the tellers config's entity_to_use list.\nEach item in entity_ids can be an entity asset (added as-is) or a folder (adds all direct-child entities).\nUser must have write access to the config and read access to each entity/folder.","operationId":"tellers_config_add_entity_asset_tellers_config_entities_post","parameters":[{"name":"asset_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Asset Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TellersConfigAddEntitiesRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Tellers Config Remove Entity","description":"Remove one or more entity/asset ids from the tellers config's entity_to_use list. User must have write access.","operationId":"tellers_config_remove_entity_asset_tellers_config_entities_delete","parameters":[{"name":"asset_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Asset Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TellersConfigRemoveEntitiesRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/asset/entity/{entity_id}":{"get":{"summary":"Get Entity","description":"Get a single entity by id. User must have read access or entity must be public.","operationId":"get_entity_asset_entity__entity_id__get","parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Entity Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntityResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/asset/entity/create":{"post":{"summary":"Create Entity","description":"Create an entity. Uses the user's default group. Optionally set directory_id to create the entity asset inside that folder (WRITE required).","operationId":"create_entity_asset_entity_create_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateEntityRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntityResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/asset/entity/update":{"put":{"summary":"Update Entity","operationId":"update_entity_asset_entity_update_put","parameters":[{"name":"entity_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Entity Id"}},{"name":"name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},{"name":"description","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/asset/entity/asset":{"post":{"summary":"Add Asset To Entity","description":"Add one or more assets to an entity. Each asset_id can be an image/audio asset or a folder (adds all image/audio direct children).","operationId":"add_asset_to_entity_asset_entity_asset_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntityAssetsRequest"}}}},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Remove Asset From Entity","description":"Remove one or more asset references from an entity (from both image and audio reference tables if present).","operationId":"remove_asset_from_entity_asset_entity_asset_delete","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntityAssetsRequest"}}}},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/asset/shared_with_me":{"get":{"tags":["accepts-api-key"],"summary":"List Shared With Me","description":"List the files and folders other people shared with you, folders first.\n\nWithout ``folder_id``: everything shared with you or with one of your\ngroups that you do not own, except what sits inside a folder that is\nitself shared with you. With ``folder_id``: that folder's contents. Rows\ncarry the owner's path in ``file_name``. Page with ``next_cursor``.","operationId":"list_shared_with_me_asset_shared_with_me_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"exclusiveMinimum":0,"default":50,"title":"Limit"}},{"name":"folder_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"A folder shared with you, or inside one: list its contents. Leave out to list what was shared with you.","title":"Folder Id"},"description":"A folder shared with you, or inside one: list its contents. Leave out to list what was shared with you."},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SharedWithMeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/asset/{asset_id}/share":{"get":{"summary":"Get Share Asset","description":"Return current share configuration for an asset: groups (with right), validated_users (email + right),\nplus is_public_read and can_share (True only if caller has ADMIN).\nCaller must have READ on the asset.","operationId":"get_share_asset_asset__asset_id__share_get","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Asset Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetShareResponseOptimized"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/asset/{asset_id}/visibility":{"put":{"tags":["accepts-api-key"],"summary":"Set Asset Visibility","description":"Set visibility (is_public_read) for a single asset (SSE). WRITE required.","operationId":"set_asset_visibility_asset__asset_id__visibility_put","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Asset Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetVisibilityRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/asset/{asset_id}/share/add":{"post":{"summary":"Add Share Asset","description":"Add one share for the asset (SSE): grant ``right`` (READ by default) to either a group\n(group_id) or a user (email).\nIf the asset is a folder, applies to the folder and all underlying assets. Caller must be able\nto share it (ADMIN, or a share with can_share); only ADMIN can set can_share.","operationId":"add_share_asset_asset__asset_id__share_add_post","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Asset Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareAddRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/asset/{asset_id}/share/remove":{"post":{"summary":"Remove Share Asset","description":"Remove one share (SSE): remove all access for either a group (group_id) or a user (email).\nCaller must be able to share the asset; below ADMIN, only for shares no higher than their own\nright and without can_share. If asset is a folder, applies to folder and underlying assets.","operationId":"remove_share_asset_asset__asset_id__share_remove_post","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Asset Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareRemoveRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/asset/{asset_id}/share/update_right":{"post":{"summary":"Update Right Share Asset","description":"Change the right for one share (SSE): set right to to_right for either group_id or email.\nCaller must be able to share the asset; below ADMIN, only for shares no higher than their own\nright and without can_share. If asset is a folder, applies to folder and underlying assets.","operationId":"update_right_share_asset_asset__asset_id__share_update_right_post","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Asset Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareUpdateRightRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/asset/{asset_id}/share/project_media":{"get":{"summary":"Get Project Media Sharing","description":"Whether the media a project uses are shared like the project.\n\nSharing a project only lets its people view the media in it. This lists the\nmedia on which someone the project is shared with holds less, on their own,\nthan their right on the project, with who and what they lack; ``in_sync``\nis true when there are none. Caller must be able to view the project.","operationId":"get_project_media_sharing_asset__asset_id__share_project_media_get","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Asset Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaSharing"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Share Project Media","description":"Share the media a project uses with everyone the project is shared with,\nat their right on the project.\n\nCaller must be able to share the project. Each medium follows the usual\nsharing rules (share/add, share/update_right): the caller must be able to\nshare it, and below ADMIN hands out at most their own right. What cannot be\ngranted is listed in ``skipped`` rather than failing the call. Existing\nshares are only raised, never lowered, and never get ``can_share``.","operationId":"share_project_media_asset__asset_id__share_project_media_post","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Asset Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaShareResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/asset/{asset_id}/share/project_media/request_access":{"post":{"summary":"Request Project Media Access","description":"Ask the owners of the project's media the caller cannot read for access.\n\nFor anyone who can view the project, whatever their right on it: one\naccess request per medium in ``lacking_for_me`` not already asked for, to\nits owner, as ``POST /access_request`` would. Returns the media sharing as\nit now stands, with those media marked ``requested``.","operationId":"request_project_media_access_asset__asset_id__share_project_media_request_access_post","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Asset Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaSharing"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/asset/{asset_id}/comments":{"get":{"tags":["accepts-api-key"],"summary":"List Asset Comments","description":"The comments on an asset, oldest first. Needs READ on the asset.","operationId":"list_asset_comments_asset__asset_id__comments_get","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Asset Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AssetComment"},"title":"Response List Asset Comments Asset  Asset Id  Comments Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["accepts-api-key"],"summary":"Add Asset Comment","description":"Add a comment to an asset. Needs READ on the asset.","operationId":"add_asset_comment_asset__asset_id__comments_post","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Asset Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetCommentCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetComment"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/asset/{asset_id}/comments/{comment_id}":{"patch":{"tags":["accepts-api-key"],"summary":"Update Asset Comment","description":"Change the text and/or timecode of one of your comments.","operationId":"update_asset_comment_asset__asset_id__comments__comment_id__patch","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Asset Id"}},{"name":"comment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Comment Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetCommentUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetComment"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["accepts-api-key"],"summary":"Delete Asset Comment","description":"Remove a comment: yours, or any on an asset you are ADMIN of.","operationId":"delete_asset_comment_asset__asset_id__comments__comment_id__delete","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Asset Id"}},{"name":"comment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Comment Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/asset/most_recent":{"get":{"tags":["accepts-api-key"],"summary":"Get Most Recent Files","description":"Return the most recently added file(s) the user has read access to.\nUses the user's own library unless group_id is set.\nWith group_id, uses what that group was given (the user must be a member).\nafter: only files with last_edit > after (newer).\nbefore: only files with last_edit < before (older); use the smallest last_edit from a previous page to get the next page.\nfiletype: only files with the given file type(s).","operationId":"get_most_recent_files_asset_most_recent_get","parameters":[{"name":"path","in":"query","required":false,"schema":{"type":"string","default":"/","title":"Path"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","exclusiveMinimum":0,"default":1,"title":"Limit"}},{"name":"group_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Group Id"}},{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Before"}},{"name":"after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"After"}},{"name":"filetype","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/FileType"}},{"type":"null"}],"title":"Filetype"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FileReference"},"title":"Response Get Most Recent Files Asset Most Recent Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/asset/folder":{"post":{"tags":["accepts-api-key"],"summary":"Create Folder","description":"Create a folder. Either at a path (body.path) or under a parent folder (body.parent_asset_id + body.name).\nPath-based: ensures folder and ancestors exist for the user's default group.\nParent-based: parent must be a folder the user has WRITE access to.\nCallable with API key (X-Api-Key header) or Bearer token.","operationId":"create_folder_asset_folder_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFolderRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFolderResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/asset/download_urls":{"post":{"tags":["accepts-api-key"],"summary":"Get Asset Download Url Batch Json","description":"Return download URL payloads for multiple assets using one shared config.","operationId":"get_asset_download_url_batch_json_asset_download_urls_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetDownloadUrlBatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetDownloadUrlBatchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/asset/file_urls":{"post":{"tags":["accepts-api-key"],"summary":"Get Asset File Url Batch Json","description":"Return presigned URLs to the uploaded file of text, PDF, LUT and font assets.\n\nThese types have no renditions, so there is no quality or player choice to\nmake. Any other type comes back as an error item pointing at\n``/asset/download_urls``.","operationId":"get_asset_file_url_batch_json_asset_file_urls_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetFileUrlBatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetFileUrlBatchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/asset/download_url/{asset_id}":{"get":{"summary":"Get Asset Download Url Json","description":"Return ``url`` and ``expiredIn`` (seconds) — no redirect. Use for WebCodecs / fetch + UrlSource.","operationId":"get_asset_download_url_json_asset_download_url__asset_id__get","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Asset Id"}},{"name":"quality","in":"query","required":false,"schema":{"enum":["480p","720p","1080p","original","highest","lowest","thumbnail"],"type":"string","default":"720p","title":"Quality"}},{"name":"player_compatible","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Player Compatible"}},{"name":"frame_time","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Frame Time"}},{"name":"request_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetDownloadUrlResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/asset/url/{asset_id}":{"get":{"summary":"Get Asset Download Url Redirect","description":"Redirect to the resolved asset URL (supports Bearer, session cookie, or access_token).\n\nWith ``filename``, the file downloads under that name; Pexels media, which\ncannot be presigned with a name, is streamed through instead of redirected.","operationId":"get_asset_download_url_redirect_asset_url__asset_id__get","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Asset Id"}},{"name":"quality","in":"query","required":false,"schema":{"enum":["480p","720p","1080p","original","highest","lowest","thumbnail"],"type":"string","default":"720p","title":"Quality"}},{"name":"player_compatible","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Player Compatible"}},{"name":"frame_time","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Frame Time"}},{"name":"filename","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"description":"Save the file under this name. A timeline export passes the name its timeline references the file by (see /project/{project_id}/export_timeline_files).","title":"Filename"},"description":"Save the file under this name. A timeline export passes the name its timeline references the file by (see /project/{project_id}/export_timeline_files)."},{"name":"access_token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/asset/infos":{"post":{"tags":["accepts-api-key"],"summary":"Get Asset Infos Batch Json","description":"Return minimal source/path/duration info for multiple assets.","operationId":"get_asset_infos_batch_json_asset_infos_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetInfosBatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetInfosBatchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/asset/description/{description_id}/generation-metadata":{"get":{"tags":["accepts-api-key"],"summary":"Get Asset Description Generation Metadata","description":"Return debug/provenance metadata saved with one generated chunk description.","operationId":"get_asset_description_generation_metadata_asset_description__description_id__generation_metadata_get","parameters":[{"name":"description_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Description Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetDescriptionGenerationMetadataResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/asset/{asset_id}/duplicate":{"post":{"tags":["accepts-api-key"],"summary":"Duplicate Asset","description":"Duplicate an asset into the caller's library.\n\nAny asset needs only VIEW, so one shared read-only can be copied. A project\nis copied without its media: the copy's timeline uses the same assets. Any\nother file (media, stock footage, entity, config) is copied in full, stored\nfiles and analysis included, as ``name (1).ext`` next to the original when\nthe caller can write to its folder, at the library root otherwise or with\n``to_library_root``. A folder is copied the same way with everything in it;\nthe group clips, master clips and still-uploading files inside are left out\nand counted in ``skipped_count``. Group clips, master clips, assets still\nuploading and folders of more than 500 items return 400. A copy whose files would not fit\nthe caller's storage returns 413. A missing or inaccessible asset returns\n404.","operationId":"duplicate_asset_asset__asset_id__duplicate_post","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Asset Id"}},{"name":"to_library_root","in":"query","required":false,"schema":{"type":"boolean","description":"Put the copy at the top of the caller's own library even when they can write to the original's folder (\"copy to my account\").","default":false,"title":"To Library Root"},"description":"Put the copy at the top of the caller's own library even when they can write to the original's folder (\"copy to my account\")."},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DuplicateAssetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/asset/{asset_id}/description":{"post":{"tags":["accepts-api-key"],"summary":"Create Asset Scene Description","description":"Add one timed scene description and generate its embeddings.","operationId":"create_asset_scene_description_asset__asset_id__description_post","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Asset Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetSceneDescriptionCreateRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetSceneDescriptionUpdateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/asset/{asset_id}/content":{"put":{"tags":["accepts-api-key"],"summary":"Replace Asset Text Content","description":"Replace or patch a text, Markdown or SVG file's content and reprocess it.\n\nSend `content` to replace the whole body, or `diff` (a unified diff\nagainst the file as stored) to change part of a long file without\nresending it. Either way the file is written over in place, the way the\nagent's patch_file tool does, then preprocessing re-runs so the search\nembeddings match the new text and an SVG's thumbnail matches its new\nmarkup. There is no size limit. The resulting SVG must be a well-formed\ndocument with an <svg> root, or the call is refused with 400 and nothing\nis written. A diff whose hunks do not match the stored file is refused\nwith 409; a diff that cannot be parsed with 400.","operationId":"replace_asset_text_content_asset__asset_id__content_put","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Asset Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetTextContentRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetTextContentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/asset/{asset_id}/description/{description_id}":{"patch":{"tags":["accepts-api-key"],"summary":"Update Asset Scene Description","description":"Change the text and/or timing of one scene description and regenerate\nits embeddings.","operationId":"update_asset_scene_description_asset__asset_id__description__description_id__patch","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Asset Id"}},{"name":"description_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Description Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetSceneDescriptionUpdateRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetSceneDescriptionUpdateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["accepts-api-key"],"summary":"Delete Asset Scene Description","description":"Remove one scene description and rebuild the asset's aggregate\nembeddings without it.","operationId":"delete_asset_scene_description_asset__asset_id__description__description_id__delete","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Asset Id"}},{"name":"description_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Description Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetSceneDescriptionUpdateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/asset/{asset_id}":{"patch":{"summary":"Patch Asset","description":"Partial update of an asset (SSE): rename, move, description, authors and/or source_url. At least one field required. WRITE on asset (and on destination if moving).","operationId":"patch_asset_asset__asset_id__patch","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Asset Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetPatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Asset","description":"Delete an asset (and if folder, its contents) (SSE). Removes DB records and S3 objects. User must have WRITE on the asset.","operationId":"delete_asset_asset__asset_id__delete","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Asset Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/project/{project_id}/export_tellers_otio":{"get":{"tags":["accepts-api-key"],"summary":"Export Tellers Otio","description":"Return project OTIO JSON with clip ``target_url``s, LUT ``cube`` URLs and uploaded font URLs presigned (≥1h by default).","operationId":"export_tellers_otio_project__project_id__export_tellers_otio_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"input_rendition","in":"query","required":false,"schema":{"enum":["480p","720p","1080p","original","highest","lowest"],"type":"string","description":"Rendition passed to presign selection (highest player-compatible transcodes, etc.).","default":"highest","title":"Input Rendition"},"description":"Rendition passed to presign selection (highest player-compatible transcodes, etc.)."},{"name":"presign_expires_in","in":"query","required":false,"schema":{"type":"integer","maximum":604800,"minimum":3600,"description":"S3 presigned GET lifetime in seconds (minimum 1 hour).","default":43200,"title":"Presign Expires In"},"description":"S3 presigned GET lifetime in seconds (minimum 1 hour)."},{"name":"use_redirect_urls","in":"query","required":false,"schema":{"type":"boolean","description":"When true, write clip target_url as /asset/url/{asset_id} redirect links instead of direct presigned URLs.","default":false,"title":"Use Redirect Urls"},"description":"When true, write clip target_url as /asset/url/{asset_id} redirect links instead of direct presigned URLs."},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Export Tellers Otio Project  Project Id  Export Tellers Otio Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/project/{project_id}/export_tellers_otio/presign":{"post":{"tags":["accepts-api-key"],"summary":"Presign Export Tellers Otio","description":"Presign the URLs of the timeline in the body again, as ``export_tellers_otio`` does.\n\nFor a client export that outlives its presigned URLs: it re-signs the\ntimeline it started with, not the project as it is now — media removed\nfrom the project meanwhile is still re-signed, as long as the caller can\nstill view the asset. Same rules as ``export_tellers_otio`` otherwise: the\ncaller needs view rights on the project, and an asset it cannot view keeps\nthe URL it was sent with. Nothing is saved.","operationId":"presign_export_tellers_otio_project__project_id__export_tellers_otio_presign_post","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"input_rendition","in":"query","required":false,"schema":{"enum":["480p","720p","1080p","original","highest","lowest"],"type":"string","description":"Rendition passed to presign selection (highest player-compatible transcodes, etc.).","default":"highest","title":"Input Rendition"},"description":"Rendition passed to presign selection (highest player-compatible transcodes, etc.)."},{"name":"presign_expires_in","in":"query","required":false,"schema":{"type":"integer","maximum":604800,"minimum":3600,"description":"S3 presigned GET lifetime in seconds (minimum 1 hour).","default":43200,"title":"Presign Expires In"},"description":"S3 presigned GET lifetime in seconds (minimum 1 hour)."},{"name":"use_redirect_urls","in":"query","required":false,"schema":{"type":"boolean","description":"When true, write clip target_url as /asset/url/{asset_id} redirect links instead of direct presigned URLs.","default":false,"title":"Use Redirect Urls"},"description":"When true, write clip target_url as /asset/url/{asset_id} redirect links instead of direct presigned URLs."},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"A timeline previously returned by export_tellers_otio for this project, as the caller kept it.","title":"Otio"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Presign Export Tellers Otio Project  Project Id  Export Tellers Otio Presign Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/project/{project_id}/export_timeline_files":{"get":{"summary":"Export Project Timeline Files","description":"The media files to download next to an ``export_timeline`` export.\n\nEach file's ``filename`` is the name the exported timeline references it by\nwith ``target_url_source=in_app_filename``. Download it with\n``GET /asset/url/{asset_id}?quality=original&player_compatible=false&filename=…``\nso it is saved under that same name.","operationId":"export_project_timeline_files_project__project_id__export_timeline_files_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"track_id","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"If provided, only list media of tracks with these IDs.","title":"Track Id"},"description":"If provided, only list media of tracks with these IDs."},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportTimelineFilesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/project/{project_id}/export_timeline":{"get":{"summary":"Export Project Timeline","description":"Export a project timeline to OTIO, EDL, AAF, or Final Cut Pro 7 XML.","operationId":"export_project_timeline_project__project_id__export_timeline_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"timeline_type","in":"query","required":false,"schema":{"$ref":"#/components/schemas/TimelineExportType","default":"aaf"}},{"name":"target_url_source","in":"query","required":false,"schema":{"$ref":"#/components/schemas/AafTargetUrlSource","default":"in_app_filename"}},{"name":"track_id","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"If provided, only export tracks with these IDs.","title":"Track Id"},"description":"If provided, only export tracks with these IDs."},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/project/{project_id}":{"post":{"summary":"Update","operationId":"update_project__project_id__post","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiProjectOtio"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Get","operationId":"get_project__project_id__get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiProjectOtio"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/project/{project_id}/export/cost":{"get":{"tags":["accepts-api-key"],"summary":"Estimate Export Cost","description":"Estimate the token cost of rendering a project's timeline.\n\n``start_time`` / ``end_time`` quote the export of that range only, as\n``POST /project/{project_id}/export`` takes them (400 on the same ranges\nit refuses). Past exports of other lengths say nothing about a range's\nprice, so a ranged quote comes from the pricing formula on the range's\nlength, which is what the export is charged, rather than from history.\n``hdr`` quotes an HDR render (400 where the export would refuse it), also\nfrom the formula: SDR history says nothing about its price.","operationId":"estimate_export_cost_project__project_id__export_cost_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"rendition","in":"query","required":true,"schema":{"enum":["480p","720p","1080p","4k"],"type":"string","description":"The rendition to estimate (for example, 1080p).","title":"Rendition"},"description":"The rendition to estimate (for example, 1080p)."},{"name":"start_time","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Timeline time, in seconds, the export starts at. Omit to start at the beginning of the timeline.","title":"Start Time"},"description":"Timeline time, in seconds, the export starts at. Omit to start at the beginning of the timeline."},{"name":"end_time","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Timeline time, in seconds, the export ends at (excluded). Omit to end with the timeline; a time past its end stops there.","title":"End Time"},"description":"Timeline time, in seconds, the export ends at (excluded). Omit to end with the timeline; a time past its end stops there."},{"name":"hdr","in":"query","required":false,"schema":{"type":"boolean","description":"Quote an HDR export: it takes far longer to render than SDR and is priced for it.","default":false,"title":"Hdr"},"description":"Quote an HDR export: it takes far longer to render than SDR and is priced for it."},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportCostEstimateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/project/{project_id}/export/preflight":{"get":{"tags":["accepts-api-key"],"summary":"Export Preflight","description":"Check a project's source renditions before starting an export.\n\nAlways reports all four resolutions — 480p, 720p, 1080p and 4k — so the id\nis the only thing to pass. Each says whether every asset already has the\nrendition the render would read (``has_all_renditions``), which assets still\nneed one generated (``state`` ``needs_rendition`` or ``generating``, with the\n``suggested_min_dimension`` to downscale to), and whether the render would\npull a 2K-or-larger input (``uses_2k_input``) — the thing that makes an\nexport slow even when nothing is missing.\n\nNothing is queued: an asset reported as ``needs_rendition`` stays that way\nuntil a downscale is asked for. An export started regardless still renders —\n``source_limited`` assets are upscaled, and ``missing`` ones are left out of\nthe playlist entirely, so their clips come out empty.","operationId":"export_preflight_project__project_id__export_preflight_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportPreflightResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/project/{project_id}/export/generate_missing_renditions":{"post":{"tags":["accepts-api-key"],"summary":"Generate Missing Renditions","description":"Encode an export-compatible master for every clip that lacks one.\n\nCovers the clips ``GET /project/{project_id}/export/preflight`` counts in\n``renditions_needed_for_optimum_export`` — those with no export-compatible\nrendition at their own resolution — dispatching one downscale each, at that\nresolution. It is the highest rendition the sources allow, so afterwards\nevery export reads the best master there is rather than a small proxy.\n\nAssets with a downscale already running are left alone instead of being\nre-encoded, and an asset the caller cannot write to is skipped so its owner\nis not billed for an encode they did not ask for. Each encode is billed to\nthe asset's owner as it runs, the same as ``POST /video/downscale/{id}``;\nthe amount reported here is the preflight's estimate of it.\n\nAn asset holds one proxy rendition at a time, so a new master replaces the\nsmaller proxy that asset had.","operationId":"generate_missing_renditions_project__project_id__export_generate_missing_renditions_post","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateMissingRenditionsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/project/{project_id}/export":{"post":{"tags":["accepts-api-key"],"summary":"Export Project","description":"Start async export of project to MP4 at one or more resolutions. Creates the export asset\nin the API, then enqueues a task that browser-encodes the highest requested resolution.\nSmaller renditions are enqueued as downscaling_task jobs (not chained). The export\nappears as a new video asset in the project's export folder (project name + date + .mp4).\n\n``track_ids`` renders only those tracks; every track is rendered without it.\n\n``start_time`` / ``end_time`` (timeline seconds, either optional) render only\n``[start_time, end_time)``; the file starts at 0. 400 when either is negative,\nwhen ``end_time`` is not after ``start_time``, or when ``start_time`` is at or\npast the end of the timeline. A long range is rendered in parts cut on whole\nframes, so its start is rounded up to the next 1/30 s.\n\n``hdr`` encodes HLG HDR video (VP9 profile 2, 10-bit, BT.2020, in MP4) rather\nthan SDR H.264. It is refused (400) with more than one rendition: the smaller\nrenditions are made by re-encoding the master, which tone-maps it to SDR H.264,\nso they would not be HDR. Ask for each size as its own HDR export instead. It\nis refused at 4k too, and renders far slower than an SDR export (about 40\ntimes at 1080p).\n\nReturns task_id and asset_id. Poll GET /users/tasks/{task_id} for completion; result includes asset_id.","operationId":"export_project_project__project_id__export_post","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"track_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Ids of the timeline tracks to render (repeat the parameter for each). Every other track is left out of this export only; the project is not changed. A video track carries no sound: its audio sits on its own audio track, which is left out unless listed too. Omit to render every track.","title":"Track Ids"},"description":"Ids of the timeline tracks to render (repeat the parameter for each). Every other track is left out of this export only; the project is not changed. A video track carries no sound: its audio sits on its own audio track, which is left out unless listed too. Omit to render every track."},{"name":"start_time","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Timeline time, in seconds, the export starts at. Omit to start at the beginning of the timeline.","title":"Start Time"},"description":"Timeline time, in seconds, the export starts at. Omit to start at the beginning of the timeline."},{"name":"end_time","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Timeline time, in seconds, the export ends at (excluded). Omit to end with the timeline; a time past its end stops there.","title":"End Time"},"description":"Timeline time, in seconds, the export ends at (excluded). Omit to end with the timeline; a time past its end stops there."},{"name":"hdr","in":"query","required":false,"schema":{"type":"boolean","description":"Encode the video as HDR (HLG, BT.2020, VP9 10-bit in MP4) instead of SDR H.264. Takes a single rendition, at most 1080p. Plays in Chrome, Firefox, VLC and YouTube, not in QuickTime.","default":false,"title":"Hdr"},"description":"Encode the video as HDR (HLG, BT.2020, VP9 10-bit in MP4) instead of SDR H.264. Takes a single rendition, at most 1080p. Plays in Chrome, Firefox, VLC and YouTube, not in QuickTime."},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"enum":["480p","720p","1080p","4k"],"type":"string"},"description":"List of resolutions to export (e.g. [\"720p\", \"1080p\"])","title":"Renditions"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportProjectResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/project/{project_id}/export/audio":{"post":{"tags":["accepts-api-key"],"summary":"Export Project Audio","description":"Start async export of the project's sound alone, mixed to an M4A (AAC) file. It\nappears as a new audio asset in the project's export folder (project name + date\n+ .m4a). Only audio tracks make sound, so a selection of video tracks alone is\nrefused, as is a timeline with no audio.\n\n``track_ids`` mixes only those tracks; every track is mixed without it.\n\n``start_time`` / ``end_time`` (timeline seconds, either optional) mix only\n``[start_time, end_time)``, refused (400) as for the video export.\n\nReturns task_id and asset_id. Poll GET /users/tasks/{task_id} for completion; result includes asset_id.","operationId":"export_project_audio_project__project_id__export_audio_post","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Project Id"}},{"name":"track_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Ids of the timeline tracks to render (repeat the parameter for each). Every other track is left out of this export only; the project is not changed. A video track carries no sound: its audio sits on its own audio track, which is left out unless listed too. Omit to render every track.","title":"Track Ids"},"description":"Ids of the timeline tracks to render (repeat the parameter for each). Every other track is left out of this export only; the project is not changed. A video track carries no sound: its audio sits on its own audio track, which is left out unless listed too. Omit to render every track."},{"name":"start_time","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Timeline time, in seconds, the export starts at. Omit to start at the beginning of the timeline.","title":"Start Time"},"description":"Timeline time, in seconds, the export starts at. Omit to start at the beginning of the timeline."},{"name":"end_time","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Timeline time, in seconds, the export ends at (excluded). Omit to end with the timeline; a time past its end stops there.","title":"End Time"},"description":"Timeline time, in seconds, the export ends at (excluded). Omit to end with the timeline; a time past its end stops there."},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportProjectResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/project/original/{asset_id}/sources":{"get":{"summary":"Get Project Original Sources","description":"Stream the source files an imported AAF sequence references, over SSE.\n\n``asset_id`` is a PROJECT_ORIGINAL asset. Events, in order:\n\n* ``cached`` — the last computed listing, if any (e.g. from preprocess, or\n  an earlier call here), sent immediately so a caller has something to\n  show before the AAF is reparsed.\n* ``refreshed`` — the freshly recomputed listing (same shape as\n  ``cached``). Sent even when the sequence was already converted: a\n  conversion does not have to cover every source, so the listing stays\n  useful afterwards (link the sources that were missing, then convert\n  again). The single case where the AAF is *not* reparsed is a cached\n  listing that already links every source and a project that already\n  exists — there is then nothing left to resolve and nothing to create,\n  so only ``cached`` and ``project_ready`` are sent.\n* ``project_ready`` (``project_id``) — last, when a project exists for this\n  sequence: the one already converted (auto- or user-triggered), or one\n  created right here because this fresh parse found every source resolved\n  and nothing had been converted yet. An already-converted sequence is\n  never converted again on a plain read — use ``POST .../convert`` for\n  that.\n\nEach source comes back either linked (``asset_id`` set — validated by a\nuser, or matched on the MXF material package UMID or a single full-path\nhit), with ``candidates`` to choose from when only the file name matched,\nor with neither when the file has not been imported at all. Choices saved\nthrough ``PUT .../sources`` win over the automatic match and come back as\n``match: \"user\"``.","operationId":"get_project_original_sources_project_original__asset_id__sources_get","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Asset Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Set Project Original Sources","description":"Save which asset a source file of an imported AAF sequence stands for.\n\nThis is how a user validates the ``candidates`` returned by\n``GET .../sources``: the choice is stored against the PROJECT_ORIGINAL asset\nand reused every time the sequence is listed or converted. Returns the\nrefreshed source list.","operationId":"set_project_original_sources_project_original__asset_id__sources_put","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Asset Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_project_original_sources_project_original__asset_id__sources_put"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AafSequenceSourcesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/project/original/{asset_id}/convert":{"post":{"summary":"Convert Project Original","description":"Turn an imported AAF sequence into an editable project, over SSE.\n\nEvents, in order:\n\n* ``progress`` (``stage``: one of downloading/parsing/resolving/creating_project)\n* ``done`` (``project_id``, ``missing``, ``missing_count``) — the newly\n  created project.\n\nA clip is linked to its source asset when the user validated it (see\n``PUT .../sources``), when ``source_assets`` overrides it for this call,\nor when the match is certain on its own (UMID, or a single full-path\nhit). The rest stay on the timeline without media, so the edit keeps its\nstructure, and are listed in ``missing``.\n\nNot every source has to be linked to convert, so this is deliberately not\nidempotent: converting a sequence that was already converted — after\nimporting the media that was missing, say — creates another project from\nthe sources resolved now, and leaves the earlier one untouched. The\nsequence then points at this latest project (that is the one\n``GET .../sources`` reports as ``project_ready``).","operationId":"convert_project_original_project_original__asset_id__convert_post","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Asset Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_convert_project_original_project_original__asset_id__convert_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/group/list":{"get":{"summary":"List Public Groups","operationId":"list_public_groups_preview_group_list_get","parameters":[{"name":"is_reference","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Reference"}},{"name":"offset","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Offset"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","exclusiveMinimum":0,"default":100,"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"X-Preview-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Preview-Key"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreviewGroupListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/group/get":{"get":{"summary":"Get Public Group","operationId":"get_public_group_preview_group_get_get","parameters":[{"name":"group_id","in":"query","required":true,"schema":{"type":"string","title":"Group Id"}},{"name":"X-Preview-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Preview-Key"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/asset/list":{"get":{"summary":"List Public Assets","description":"List all public assets (is_public_read=True).","operationId":"list_public_assets_preview_asset_list_get","parameters":[{"name":"offset","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Offset"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","exclusiveMinimum":0,"default":100,"title":"Limit"}},{"name":"file_type","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/FileType"},{"type":"null"}],"title":"File Type"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"X-Preview-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Preview-Key"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreviewAssetListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/asset/get/{asset_id}":{"get":{"summary":"Get Preview Otio","description":"Return OTIO with presigned URLs for the project or a single asset.\nWithout auth: public access (project or file must be public-read).\nWith Bearer token: files that user can read resolve too. If asset is a project, return\nits OTIO; if image, return a 20s project; if video/audio, return a project with\nthat asset's duration.","operationId":"get_preview_otio_preview_asset_get__asset_id__get","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Asset Id"}},{"name":"presigned_url_ttl_seconds","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":86400,"title":"Presigned Url Ttl Seconds"}},{"name":"X-Preview-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Preview-Key"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreviewAssetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/user/list":{"get":{"summary":"List Public Users","description":"List all public users (is_public_read=True).","operationId":"list_public_users_preview_user_list_get","parameters":[{"name":"offset","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Offset"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","exclusiveMinimum":0,"default":100,"title":"Limit"}},{"name":"is_reference","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Reference"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"X-Preview-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Preview-Key"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreviewUserListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/user/get":{"get":{"summary":"Get Public User","operationId":"get_public_user_preview_user_get_get","parameters":[{"name":"user_id","in":"query","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"X-Preview-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Preview-Key"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicUserInfo"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/info":{"get":{"summary":"Get Preview Info","description":"Return total counters for users, assets, entities, custom agents and projects.","operationId":"get_preview_info_preview_info_get","parameters":[{"name":"X-Preview-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Preview-Key"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreviewInfoCounts"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/agent/custom/list":{"get":{"summary":"Get Public Custom Agents","description":"List custom agents marked as public (is_public_read=True).","operationId":"get_public_custom_agents_preview_agent_custom_list_get","parameters":[{"name":"offset","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Offset"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","exclusiveMinimum":0,"default":20,"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"presigned_url_ttl_seconds","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":86400,"title":"Presigned Url Ttl Seconds"}},{"name":"labels","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Only assistants carrying every one of these labels. Repeat the parameter to require more than one.","title":"Labels"},"description":"Only assistants carrying every one of these labels. Repeat the parameter to require more than one."},{"name":"X-Preview-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Preview-Key"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreviewCustomAgentListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/agent/custom/get":{"get":{"summary":"Get Public Custom Agent","operationId":"get_public_custom_agent_preview_agent_custom_get_get","parameters":[{"name":"custom_agent_id","in":"query","required":true,"schema":{"type":"string","title":"Custom Agent Id"}},{"name":"presigned_url_ttl_seconds","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":86400,"title":"Presigned Url Ttl Seconds"}},{"name":"X-Preview-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Preview-Key"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APICustomAgentWithoutData"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/agent/custom/by_slug/{slug_id}":{"get":{"summary":"Get Public Custom Agent By Slug","description":"Resolve a published assistant by its slug. Approved copies only.","operationId":"get_public_custom_agent_by_slug_preview_agent_custom_by_slug__slug_id__get","parameters":[{"name":"slug_id","in":"path","required":true,"schema":{"type":"string","title":"Slug Id"}},{"name":"presigned_url_ttl_seconds","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":86400,"title":"Presigned Url Ttl Seconds"}},{"name":"X-Preview-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Preview-Key"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APICustomAgentWithoutData"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/tool/list":{"get":{"summary":"List Tools","operationId":"list_tools_preview_tool_list_get","parameters":[{"name":"X-Preview-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Preview-Key"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PreviewToolInfo"},"title":"Response List Tools Preview Tool List Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preview/tool/get":{"get":{"summary":"Get Tool","operationId":"get_tool_preview_tool_get_get","parameters":[{"name":"tool_id","in":"query","required":true,"schema":{"type":"string","title":"Tool Id"}},{"name":"X-Preview-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Preview-Key"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreviewToolInfo"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/stripe/checkout-session-completed":{"post":{"summary":"Stripe Webhook","description":"Stripe webhooks (verify signature). Handles all registered event types.","operationId":"stripe_webhook_stripe_checkout_session_completed_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/social-publishing/connect":{"get":{"summary":"Redirect To Upload Post Connect","operationId":"redirect_to_upload_post_connect_social_publishing_connect_get","parameters":[{"name":"platforms","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"title":"Platforms"}},{"name":"redirect_url","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Redirect Url"}},{"name":"show_calendar","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Show Calendar"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/social-publishing/posts":{"post":{"summary":"Publish Social Post","operationId":"publish_social_post_social_publishing_posts_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SocialPublishPostRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SocialPublishPostResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/catalog":{"get":{"tags":["accepts-api-key"],"summary":"Get Billing Catalog","operationId":"get_billing_catalog_billing_catalog_get","parameters":[{"name":"If-None-Match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingCatalog"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/mcp/tools/list":{"get":{"tags":["accepts-api-key"],"summary":"List Agent Tools","description":"Return this user's visible agent tools, optionally filtered by GenAI.","operationId":"list_agent_tools_agent_mcp_tools_list_get","parameters":[{"name":"is_gen_ai","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter the catalog to GenAI tools (true) or non-GenAI tools (false).","title":"Is Gen Ai"},"description":"Filter the catalog to GenAI tools (true) or non-GenAI tools (false)."},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AgentToolCatalogEntry"},"title":"Response List Agent Tools Agent Mcp Tools List Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/response/{chat_id}":{"delete":{"tags":["accepts-api-key"],"summary":"Cancel Response","operationId":"cancel_response_agent_response__chat_id__delete","parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Chat Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"string","title":"Response Cancel Response Agent Response  Chat Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["accepts-api-key"],"summary":"Stream Chat Messages","description":"Subscribe to a chat's agent SSE stream (Redis-backed).\n\nEmits the exact same events as ``POST /agent/response`` — both sides read\nfrom the per-chat Redis Stream written by the producer running the agent.\n\nQuery params:\n  - ``last_event_id``: resume from this Redis stream entry id. Pass the\n    ``id:`` of the last SSE event you received to avoid duplicates. When\n    omitted, the subscription starts from \"now\" — only events produced\n    after the GET request arrives are delivered, no history is replayed.\n  - ``after``: accepted for backward compatibility and currently ignored.\n    Use ``last_event_id`` instead.\n\nLike ``POST /agent/response``, the stream is terminated by a\n``tellers.stream.end`` event carrying the reason the turn ended. It is also\nemitted when the subscription finds the chat already finished, so a client\nthat reconnects late still gets a definitive answer instead of an idle\nsocket.","operationId":"stream_chat_messages_agent_response__chat_id__get","parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Chat Id"}},{"name":"after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"After"}},{"name":"last_event_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Event Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/response":{"post":{"tags":["accepts-api-key"],"summary":"Process Agent Message","description":"Run the agent and stream its events as SSE.\n\nThe last event of the stream is always ``tellers.stream.end``, whose\n``reason`` tells the client why the turn ended (``completed``,\n``cancelled``, ``insufficient_tokens``, ``budget_exceeded``, ``error``,\n``interrupted``). ``insufficient_tokens`` means the account is out and\nneeds a top-up; ``budget_exceeded`` means the run spent the credit\nallocated to it, which buying tokens does not fix. A stream that closes\n*without* it was cut short by the network — reconnect with\n``GET /agent/response/{chat_id}`` to pick the run back up.","operationId":"process_agent_message_agent_response_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentMessageRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"403":{"description":"The account's email is not verified yet, so it cannot spend tokens. Nothing was charged. `detail.code` is `EMAIL_NOT_VERIFIED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailNotVerifiedErrorBody"}}}},"402":{"description":"The chosen `llm_model` or `priority` needs a higher subscription tier (see `subscription_locked` in GET /settings). Nothing was charged. `detail.code` is `SUBSCRIPTION_REQUIRED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LlmSubscriptionRequiredErrorBody"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/messages":{"post":{"tags":["accepts-api-key"],"summary":"Send Agent Message","description":"Send a message to a chat; the backend decides how it runs.\n\nNothing is streamed back: the run's events go to the chat's stream, which\nclients watch with ``subscribe_chat`` on the user websocket (or\n``GET /agent/response/{chat_id}``) from ``stream_cursor``.\n\n- Idle chat (or no ``chat_id``, which creates one): a turn starts with this\n  message (``mode: started``).\n- Running chat: the message is queued (``mode: queued``) and handed to the\n  running turn with the next tool results, so it can change course\n  mid-turn. If the turn ends before another tool call, the message opens\n  the next turn instead, with its own settings. Its\n  ``tellers.user_message`` events say which happened.\n\n``DELETE /agent/response/{chat_id}`` cancels the turn and drops the\nmessages still waiting for it.","operationId":"send_agent_message_agent_messages_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentMessageRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentMessageSubmitResponse"}}}},"403":{"description":"The account's email is not verified yet, so it cannot spend tokens. Nothing was charged. `detail.code` is `EMAIL_NOT_VERIFIED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailNotVerifiedErrorBody"}}}},"402":{"description":"The chosen `llm_model` or `priority` needs a higher subscription tier (see `subscription_locked` in GET /settings). Nothing was charged. `detail.code` is `SUBSCRIPTION_REQUIRED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LlmSubscriptionRequiredErrorBody"}}}},"429":{"description":"Too many messages already wait on this chat."},"503":{"description":"The chat run coordinator is unavailable."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/chat/{chat_id}/upgrade_priority":{"post":{"tags":["accepts-api-key"],"summary":"Upgrade Running Turn Priority","description":"Move the chat's running turn from flex to the standard tier.\n\nThe answer to ``tellers.agent.flex_slow``: flex has had no capacity for a\nwhile, and the user accepts the standard price to get on with it. Applies\nto the turn running now; the next one uses whatever it is sent with.","operationId":"upgrade_running_turn_priority_agent_chat__chat_id__upgrade_priority_post","parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Chat Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"404":{"description":"Chat not found."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/response/json":{"post":{"tags":["accepts-api-key","accepts-api-key"],"summary":"Process Agent Message Json","description":"Same as POST /response but runs with no_interaction=True. Emits only SSE events\n`event: tellers.json_result` (progressing while running, then done with full result).\nchat_id must be set by the client or is created at the start.","operationId":"process_agent_message_json_agent_response_json_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentMessageRequestWithoutNoInteraction"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"403":{"description":"The account's email is not verified yet, so it cannot spend tokens. Nothing was charged. `detail.code` is `EMAIL_NOT_VERIFIED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailNotVerifiedErrorBody"}}}},"402":{"description":"The chosen `llm_model` or `priority` needs a higher subscription tier (see `subscription_locked` in GET /settings). Nothing was charged. `detail.code` is `SUBSCRIPTION_REQUIRED`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LlmSubscriptionRequiredErrorBody"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/use-tool":{"post":{"tags":["accepts-api-key"],"summary":"Use Agent Tool","operationId":"use_agent_tool_agent_use_tool_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UseAgentToolRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/chats/list":{"get":{"tags":["accepts-api-key"],"summary":"List Chats","operationId":"list_chats_agent_chats_list_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","exclusiveMinimum":0,"default":10,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Before"}},{"name":"after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"After"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ChatHistoryResponse"},"title":"Response List Chats Agent Chats List Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/chat/{chat_id}":{"get":{"tags":["accepts-api-key"],"summary":"Get Chat Info","operationId":"get_chat_info_agent_chat__chat_id__get","parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Chat Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["accepts-api-key"],"summary":"Delete Chat","operationId":"delete_chat_agent_chat__chat_id__delete","parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Chat Id"}},{"name":"cancel_running","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Cancel Running"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/chat/{chat_id}/sub_chats":{"get":{"tags":["accepts-api-key"],"summary":"List Sub Chats","description":"The sub-chats a chat started, in CSV row order, then oldest first.\n\nReadable by anyone who can read the main chat; each sub-chat can then be\nopened, followed and written in like any chat.","operationId":"list_sub_chats_agent_chat__chat_id__sub_chats_get","parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Chat Id"}},{"name":"call_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only the sub-chats this tool call started. Omit for all of the chat's sub-chats.","title":"Call Id"},"description":"Only the sub-chats this tool call started. Omit for all of the chat's sub-chats."},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ChatHistoryResponse"},"title":"Response List Sub Chats Agent Chat  Chat Id  Sub Chats Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/chat/{chat_id}/usage":{"get":{"tags":["accepts-api-key"],"summary":"Get Chat Usage","description":"Return chat-token and per-tool token usage for a chat, and its sub-chats' total.","operationId":"get_chat_usage_agent_chat__chat_id__usage_get","parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Chat Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatUsageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/chat/{chat_id}/read":{"post":{"tags":["accepts-api-key"],"summary":"Mark Chat Read","description":"Mark the chat read up to its newest message, for the caller only.\n\nAn admin impersonating the user is only looking, so nothing is recorded.","operationId":"mark_chat_read_agent_chat__chat_id__read_post","parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Chat Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/chat/{chat_id}/rename":{"patch":{"tags":["accepts-api-key"],"summary":"Rename Chat","operationId":"rename_chat_agent_chat__chat_id__rename_patch","parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Chat Id"}},{"name":"name","in":"query","required":true,"schema":{"type":"string","title":"Name"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/chat/{chat_id}/share":{"get":{"tags":["accepts-api-key"],"summary":"Get Chat Share","description":"Who the chat is shared with. Anyone who can read the chat may ask;\n``can_share`` says whether the caller may change it (the owner).","operationId":"get_chat_share_agent_chat__chat_id__share_get","parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Chat Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetShareResponseOptimized"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/chat/{chat_id}/share/add":{"post":{"tags":["accepts-api-key"],"summary":"Add Chat Share","description":"Let a group, or one person by email, view the chat.\n\nOnly the chat's owner can share it, and a share only ever lets its grantee\nread the chat, never send messages in it. A group must be one the owner\nmanages; an email must belong to a Tellers user.","operationId":"add_chat_share_agent_chat__chat_id__share_add_post","parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Chat Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatShareRequest"}}}},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/chat/{chat_id}/share/remove":{"post":{"tags":["accepts-api-key"],"summary":"Remove Chat Share","description":"Stop sharing the chat with a group or one person.\n\nThe owner removes any share; anyone else can only remove their own, by\ntheir own email. Removing a share that does not exist does nothing.","operationId":"remove_chat_share_agent_chat__chat_id__share_remove_post","parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Chat Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatShareRequest"}}}},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/chat/{chat_id}/messages":{"get":{"tags":["accepts-api-key"],"summary":"Get Chat","description":"The chat's messages, newest first.\n\nFetching the newest page (no ``offset``, no ``before``) marks the chat read\nup to the newest message returned, unless an admin is impersonating.","operationId":"get_chat_agent_chat__chat_id__messages_get","parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Chat Id"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","exclusiveMinimum":0,"default":20,"title":"Limit"}},{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Before"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"anyOf":[{"$ref":"#/components/schemas/ChatMessageUserResponse"},{"$ref":"#/components/schemas/ChatMessageAgentResponse"}]},"title":"Response Get Chat Agent Chat  Chat Id  Messages Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/custom/batch":{"get":{"summary":"Get Public Custom Agents Batch","operationId":"get_public_custom_agents_batch_agent_custom_batch_get","parameters":[{"name":"ids","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"description":"Assistant ids. Repeat for multiple ids.","default":[],"title":"Ids"},"description":"Assistant ids. Repeat for multiple ids."},{"name":"slug_ids","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"description":"Assistant slug ids. Repeat for multiple slugs.","default":[],"title":"Slug Ids"},"description":"Assistant slug ids. Repeat for multiple slugs."},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCustomAgentBatchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/custom/published":{"get":{"summary":"List Public Published Custom Agents","operationId":"list_public_published_custom_agents_agent_custom_published_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque cursor from a previous page.","title":"Cursor"},"description":"Opaque cursor from a previous page."},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCustomAgentPageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/review/list":{"get":{"summary":"List Custom Agents For Review","description":"The queue: copies awaiting review, oldest request first.","operationId":"list_custom_agents_for_review_agent_review_list_get","deprecated":true,"parameters":[{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","exclusiveMinimum":0,"default":20,"title":"Limit"}},{"name":"labels","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Only assistants carrying every one of these labels. Repeat the parameter to require more than one.","title":"Labels"},"description":"Only assistants carrying every one of these labels. Repeat the parameter to require more than one."},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/APICustomAgentForReview"},"title":"Response List Custom Agents For Review Agent Review List Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/{custom_agent_id}/labels":{"put":{"summary":"Set Custom Agent Labels","description":"Replace an assistant's curation labels.\n\nHere rather than on the assistant routes because labels are not the\nowner's to set — they exist to organise the review queue above, which\nfilters on them. The module's router-wide gate is what enforces that.\n\nThe body is the complete set: it replaces rather than merges, so removing\na label is sending the list without it. It replaces the owner's labels\ntoo — the curator has the last word on what an assistant is filed under.\n\nEvery entry must name a label in the vocabulary. Minting one is\n``PUT /label/{label_id}``, deliberately a separate act: a typo here should\nbe a refusal, not a new label nobody meant to create.","operationId":"set_custom_agent_labels_agent__custom_agent_id__labels_put","deprecated":true,"parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APICustomAgentLabelsRequest"}}}},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/label/{label_id}":{"put":{"summary":"Upsert Label","description":"Create a label, or rename one and change who may attach it.\n\nThe only route that creates vocabulary, and reviewer-gated like everything\nelse in this module — which is why nothing here screens what a label is\ncalled. An owner picks from what this produced; they never add to it.\n\n``label_id`` is normalised into a slug and then never rewritten: it is what\nevery filter and every existing attachment names. Renaming is a\n``display_name`` change.","operationId":"upsert_label_agent_label__label_id__put","deprecated":true,"parameters":[{"name":"label_id","in":"path","required":true,"schema":{"type":"string","title":"Label Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APILabelUpsertRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APILabel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Label","description":"Retire a label, detaching it from every assistant carrying it.\n\nA label that no longer applies has to leave the assistants it was filed\nagainst too, or the vocabulary and the shelf disagree.","operationId":"delete_label_agent_label__label_id__delete","deprecated":true,"parameters":[{"name":"label_id","in":"path","required":true,"schema":{"type":"string","title":"Label Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/{custom_agent_id}/review":{"get":{"summary":"Get Custom Agent For Review","description":"Everything needed to judge one pending assistant.\n\nEvery asset the prompt names comes back with a presigned URL meant for\n*viewing*: no filename is attached, so S3 sends no Content-Disposition and\na browser renders it in place rather than saving it. The asset's folder\ncomes with it. An id the prompt names that no longer resolves is reported\nas ``missing`` rather than dropped — a prompt pointing at a deleted asset\nis what review is for.","operationId":"get_custom_agent_for_review_agent__custom_agent_id__review_get","deprecated":true,"parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APICustomAgentReviewDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/{custom_agent_id}/review/page":{"get":{"summary":"Get Custom Agent Review Page","description":"The review, as something a person can read and act on.\n\nThe same data as the JSON route above, laid out so the decision can be\nmade without leaving the page: the prompt in full, the media playing in\nplace, and the two buttons that end it.\n\nAny ``?token=`` is carried into the buttons' requests, so a reviewer who\narrived from Slack without a session can still decide — once. It is put\nthere by the script rather than into a form action so it never lands in\n``document.referrer`` when a reviewer opens one of the asset links.","operationId":"get_custom_agent_review_page_agent__custom_agent_id__review_page_get","deprecated":true,"parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Review link token, as minted into the Slack ping. Scoped to this assistant and to one reviewer; ignored when the caller is already signed in as a reviewer.","title":"Token"},"description":"Review link token, as minted into the Slack ping. Scoped to this assistant and to one reviewer; ignored when the caller is already signed in as a reviewer."},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/{custom_agent_id}/review/approve":{"post":{"summary":"Approve Custom Agent Review","description":"Approve a pending copy and put it live.\n\nPromotion is atomic: whichever copy was live is retired in the same\ntransaction, so the public never sees two versions or none.","operationId":"approve_custom_agent_review_agent__custom_agent_id__review_approve_post","deprecated":true,"parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Review link token, as minted into the Slack ping. Scoped to this assistant and to one reviewer; ignored when the caller is already signed in as a reviewer.","title":"Token"},"description":"Review link token, as minted into the Slack ping. Scoped to this assistant and to one reviewer; ignored when the caller is already signed in as a reviewer."},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/APICustomAgentReviewApproveRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/{custom_agent_id}/review/reject_with_comment":{"post":{"summary":"Reject Custom Agent Review","description":"Send a pending copy back to its author with a reason.\n\nThe copy stays PENDING and is flagged ``needs_changes`` — the author has\nto tell \"nobody has looked at this yet\" from \"looked at, and sent back\".\nA live copy, if there is one, is untouched and stays up.","operationId":"reject_custom_agent_review_agent__custom_agent_id__review_reject_with_comment_post","deprecated":true,"parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Review link token, as minted into the Slack ping. Scoped to this assistant and to one reviewer; ignored when the caller is already signed in as a reviewer.","title":"Token"},"description":"Review link token, as minted into the Slack ping. Scoped to this assistant and to one reviewer; ignored when the caller is already signed in as a reviewer."},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APICustomAgentReviewRejectRequest"}}}},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/{custom_agent_id}/share":{"get":{"summary":"Get Custom Agent Share","operationId":"get_custom_agent_share_agent__custom_agent_id__share_get","deprecated":true,"parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetShareResponseOptimized"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/{custom_agent_id}/share/add":{"post":{"summary":"Add Custom Agent Share","description":"Share the assistant with a group or with one person by email.\n\nNeeds ``can_share`` on the assistant: its author, an ADMIN grant, or a\ngrant with ``can_share``. Below ADMIN the caller grants at most their own\nright, never ``can_share``, and cannot change a grant they could not have\nmade. An email with no account yet is listed in ``pending_invites`` until\nsomeone signs in with it. Returns the sharing as ``GET\n/{custom_agent_id}/share`` does.","operationId":"add_custom_agent_share_agent__custom_agent_id__share_add_post","deprecated":true,"parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomAgentShareAddRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetShareResponseOptimized"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/{custom_agent_id}/share/remove":{"post":{"summary":"Remove Custom Agent Share","description":"Stop sharing the assistant with a group or with one person.\n\nNeeds ``can_share`` on the assistant, except that anyone may remove their\nown access; below ADMIN only a grant the caller could have made. Returns\nthe sharing left, empty when the caller removed their own.","operationId":"remove_custom_agent_share_agent__custom_agent_id__share_remove_post","deprecated":true,"parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomAgentShareRemoveRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetShareResponseOptimized"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/{custom_agent_id}/share/prompt_assets":{"get":{"summary":"Get Custom Agent Prompt Assets Sharing","description":"Whether the assets the assistant's prompt names are shared with everyone\nthe assistant is shared with.\n\nA run reads each prompt asset as the person running it, so someone who\ncannot view one gets an assistant that cannot use it. This lists the\nassets missing a person, group or pending invite of the assistant (VIEW\neach), with who; ``in_sync`` is true when there are none. Needs the\nassistant shared with the caller.","operationId":"get_custom_agent_prompt_assets_sharing_agent__custom_agent_id__share_prompt_assets_get","deprecated":true,"parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaSharing"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Share Custom Agent Prompt Assets","description":"Share the assets the assistant's prompt names, at VIEW, with everyone\nthe assistant is shared with.\n\nNeeds ``can_share`` on the assistant. Each asset follows the usual asset\nsharing rules: the caller must be able to share it, existing shares are\nnever lowered and never get ``can_share``. What cannot be granted is\nlisted in ``skipped`` rather than failing the call.","operationId":"share_custom_agent_prompt_assets_agent__custom_agent_id__share_prompt_assets_post","deprecated":true,"parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaShareResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/{custom_agent_id}/visibility":{"put":{"summary":"Set Custom Agent Visibility","operationId":"set_custom_agent_visibility_agent__custom_agent_id__visibility_put","deprecated":true,"parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomAgentVisibilityRequest"}}}},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/{custom_agent_id}/owner_labels":{"put":{"summary":"Set Custom Agent Owner Labels","description":"Replace the labels an author may set on their own assistant.\n\nHere rather than with the reviewer's ``/labels`` because this is the\nowner's half: it reaches only the vocabulary entries marked owner-settable,\nand replaces only those, so a reviewer's curation on the same assistant is\nnot something an author can drop by leaving it out.\n\nEvery entry must name a label from ``/label/list`` — an author picks from\nthe vocabulary rather than inventing an entry in it.","operationId":"set_custom_agent_owner_labels_agent__custom_agent_id__owner_labels_put","deprecated":true,"parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APICustomAgentLabelsRequest"}}}},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/label/list":{"get":{"summary":"Get Labels","description":"The label vocabulary.\n\nReadable by any signed-in user, unlike the routes that write it: an author\ncannot pick from a list they are not allowed to see. Two segments rather\nthan ``/labels`` so it can never be mistaken for an assistant id by the\n``/{custom_agent_id}`` routes.","operationId":"get_labels_agent_label_list_get","deprecated":true,"parameters":[{"name":"set_by","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/LabelSetBy"},{"type":"null"}],"description":"Only labels this side may attach. OWNER is what an author can put on their own assistant.","title":"Set By"},"description":"Only labels this side may attach. OWNER is what an author can put on their own assistant."},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/APILabel"},"title":"Response Get Labels Agent Label List Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/list":{"get":{"summary":"Get Custom Agents","operationId":"get_custom_agents_agent_list_get","deprecated":true,"parameters":[{"name":"with_public_access","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"With Public Access"}},{"name":"right","in":"query","required":false,"schema":{"$ref":"#/components/schemas/GroupRights","default":"READ"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","exclusiveMinimum":0,"default":20,"title":"Limit"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/APICustomAgentWithoutData"},"title":"Response Get Custom Agents Agent List Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/create":{"post":{"summary":"Create Custom Agent","operationId":"create_custom_agent_agent_create_post","deprecated":true,"parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","title":"Name"}},{"name":"description","in":"query","required":true,"schema":{"type":"string","title":"Description"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/likes":{"get":{"summary":"Get Liked Custom Agents","description":"Assistants the caller liked, most recently liked first.\n\nDeclared above ``/{custom_agent_id}`` so \"likes\" is not mistaken for\nan assistant id.\n\nReturns the *published* copy of each, which is what the user liked and the\nonly part of it that is theirs to see — the assistant behind it may be\nprivate. One that has since been unpublished drops out rather than coming\nback unopenable.","operationId":"get_liked_custom_agents_agent_likes_get","deprecated":true,"parameters":[{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","exclusiveMinimum":0,"default":20,"title":"Limit"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/APICustomAgentWithoutData"},"title":"Response Get Liked Custom Agents Agent Likes Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/by_slug/{slug_id}":{"get":{"summary":"Get Custom Agent By Slug","description":"Resolve a published assistant's slug for a signed-in caller.\n\nDeclared above ``/{custom_agent_id}`` so \"by_slug\" is not mistaken for an\nassistant id.\n\nLands on the assistant itself when the caller can already see it — that is\nthe row carrying the prompt, the publication links and the rights the\nclient renders edit affordances from. Every other caller lands on the live\ncopy, exactly what ``/preview/agent/custom/by_slug/{slug_id}`` serves them,\nand an unknown slug or an assistant with nothing live is a 404 either way.","operationId":"get_custom_agent_by_slug_agent_by_slug__slug_id__get","deprecated":true,"parameters":[{"name":"slug_id","in":"path","required":true,"schema":{"type":"string","title":"Slug Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APICustomAgent"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/{custom_agent_id}":{"get":{"summary":"Get Custom Agent","operationId":"get_custom_agent_agent__custom_agent_id__get","deprecated":true,"parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APICustomAgent"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Patch Custom Agent","operationId":"patch_custom_agent_agent__custom_agent_id__patch","deprecated":true,"parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APICustomAgent"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"null","title":"Response Patch Custom Agent Agent  Custom Agent Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Custom Agent","description":"Delete an assistant, or take a published copy down by deleting it.\n\nEvery row the delete touches is pushed to its ``/users/ws`` followers:\n\n* the addressed row, as a delete;\n* the copies that go with an assistant, also as deletes — Postgres\n  cascades them away, and nothing else would tell their followers;\n* the **assistant behind a copy**, as an update — deleting a copy is an\n  unpublish, so its posted/pending ids have just changed and a follower\n  still holding the old ones would keep offering a page that is gone.","operationId":"delete_custom_agent_agent__custom_agent_id__delete","deprecated":true,"parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/update":{"put":{"summary":"Update Custom Agent","operationId":"update_custom_agent_agent_update_put","deprecated":true,"parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APICustomAgent"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"null","title":"Response Update Custom Agent Agent Update Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/{custom_agent_id}/publish":{"post":{"summary":"Publish Custom Agent","description":"Publish an assistant, returning the frozen copy submitted for review.\n\nThe copy is what reviewers and the public see; the assistant it was\npublished from stays editable. Only one copy can exist per assistant.\n\nEverything publishing does, in the order it has to happen: freeze the\ncopy, push both rows to their followers, then ping the review channel\nonce the write is committed.","operationId":"publish_custom_agent_agent__custom_agent_id__publish_post","deprecated":true,"parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APICustomAgent"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/{custom_agent_id}/unpublish":{"post":{"summary":"Unpublish Custom Agent","description":"Take a published assistant, or one of its copies, down.\n\nWhat comes down depends on which id is given, so the caller can be as\nbroad or as narrow as they need:\n\n* the **assistant's** id — everything: the live copy and any submission\n  still under review;\n* a **posted** copy's id — only the live one, leaving a pending\n  submission queued;\n* a **pending** copy's id — only the submission, withdrawing it while\n  the live version stays up.\n\nThe slug stays on the assistant either way, so publishing again reuses\nthe same public URL.","operationId":"unpublish_custom_agent_agent__custom_agent_id__unpublish_post","deprecated":true,"parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/{custom_agent_id}/vote":{"put":{"summary":"Vote Custom Agent","description":"Like or dislike an assistant. Idempotent — a second call just switches.\n\nAccepts a published copy's id too: the vote is recorded against the\nassistant behind it, so it survives an unpublish/republish.","operationId":"vote_custom_agent_agent__custom_agent_id__vote_put","deprecated":true,"parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APICustomAgentVoteRequest"}}}},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Clear Custom Agent Vote","description":"Withdraw a vote. Succeeds whether or not one was there.","operationId":"clear_custom_agent_vote_agent__custom_agent_id__vote_delete","deprecated":true,"parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/{custom_agent_id}/assistant_asset/upload_url":{"post":{"summary":"Create Assistant Asset Upload Url","operationId":"create_assistant_asset_upload_url_agent__custom_agent_id__assistant_asset_upload_url_post","deprecated":true,"parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantAssetUploadRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantAssetUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/{custom_agent_id}/assistant_asset/{role}/upload_part_urls":{"post":{"summary":"Create Assistant Asset Part Urls","description":"Presign a small batch of part URLs for an in-flight multipart upload.\n\nCalled repeatedly as the upload progresses so URLs are always fresh and a\nfailed part can be retried with a newly minted URL.","operationId":"create_assistant_asset_part_urls_agent__custom_agent_id__assistant_asset__role__upload_part_urls_post","deprecated":true,"parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"role","in":"path","required":true,"schema":{"$ref":"#/components/schemas/AssistantAssetRole"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantAssetPartUrlsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantAssetPartUrlsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/{custom_agent_id}/assistant_asset/{role}/upload_complete":{"post":{"summary":"Complete Assistant Asset Upload","description":"Finalise a multipart upload and start optimisation.\n\nOptional: /process finalises a pending upload too, and the reconciliation\nsweep picks up anything neither call reached. Send no body (the common\ncase) and the parts are read from S3, which is authoritative;\nclient-supplied ETags are accepted but never required.","operationId":"complete_assistant_asset_upload_agent__custom_agent_id__assistant_asset__role__upload_complete_post","deprecated":true,"parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"role","in":"path","required":true,"schema":{"$ref":"#/components/schemas/AssistantAssetRole"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/AssistantAssetCompleteRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/{custom_agent_id}/assistant_asset/{role}/upload_abort":{"post":{"summary":"Abort Assistant Asset Upload","description":"Abort an in-flight multipart upload so S3 stops billing for its parts.","operationId":"abort_assistant_asset_upload_agent__custom_agent_id__assistant_asset__role__upload_abort_post","deprecated":true,"parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"role","in":"path","required":true,"schema":{"$ref":"#/components/schemas/AssistantAssetRole"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/{custom_agent_id}/assistant_asset/{role}/upload_status":{"get":{"summary":"Get Assistant Asset Upload Status","description":"Which parts S3 already holds, so an interrupted upload can resume.\n\nLets a client that lost its in-memory state (tab closed, reload) send only\nthe missing parts, without having persisted any ETags of its own.","operationId":"get_assistant_asset_upload_status_agent__custom_agent_id__assistant_asset__role__upload_status_get","deprecated":true,"parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"role","in":"path","required":true,"schema":{"$ref":"#/components/schemas/AssistantAssetRole"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantAssetUploadStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/{custom_agent_id}/assistant_asset/from_asset":{"post":{"summary":"Create Assistant Asset From Asset","operationId":"create_assistant_asset_from_asset_agent__custom_agent_id__assistant_asset_from_asset_post","deprecated":true,"parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantAssetFromAssetRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIAssistantAsset"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/{custom_agent_id}/assistant_asset/{role}/process":{"post":{"summary":"Process Assistant Asset","operationId":"process_assistant_asset_agent__custom_agent_id__assistant_asset__role__process_post","deprecated":true,"parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"role","in":"path","required":true,"schema":{"$ref":"#/components/schemas/AssistantAssetRole"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIAssistantAsset"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/{custom_agent_id}/assistant_asset/{role}":{"delete":{"summary":"Delete Assistant Asset","operationId":"delete_assistant_asset_agent__custom_agent_id__assistant_asset__role__delete","deprecated":true,"parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"role","in":"path","required":true,"schema":{"$ref":"#/components/schemas/AssistantAssetRole"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/custom/review/list":{"get":{"summary":"List Custom Agents For Review","description":"The queue: copies awaiting review, oldest request first.","operationId":"list_custom_agents_for_review_agent_custom_review_list_get","parameters":[{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","exclusiveMinimum":0,"default":20,"title":"Limit"}},{"name":"labels","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Only assistants carrying every one of these labels. Repeat the parameter to require more than one.","title":"Labels"},"description":"Only assistants carrying every one of these labels. Repeat the parameter to require more than one."},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/APICustomAgentForReview"},"title":"Response List Custom Agents For Review Agent Custom Review List Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/custom/{custom_agent_id}/labels":{"put":{"summary":"Set Custom Agent Labels","description":"Replace an assistant's curation labels.\n\nHere rather than on the assistant routes because labels are not the\nowner's to set — they exist to organise the review queue above, which\nfilters on them. The module's router-wide gate is what enforces that.\n\nThe body is the complete set: it replaces rather than merges, so removing\na label is sending the list without it. It replaces the owner's labels\ntoo — the curator has the last word on what an assistant is filed under.\n\nEvery entry must name a label in the vocabulary. Minting one is\n``PUT /label/{label_id}``, deliberately a separate act: a typo here should\nbe a refusal, not a new label nobody meant to create.","operationId":"set_custom_agent_labels_agent_custom__custom_agent_id__labels_put","parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APICustomAgentLabelsRequest"}}}},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/custom/label/{label_id}":{"put":{"summary":"Upsert Label","description":"Create a label, or rename one and change who may attach it.\n\nThe only route that creates vocabulary, and reviewer-gated like everything\nelse in this module — which is why nothing here screens what a label is\ncalled. An owner picks from what this produced; they never add to it.\n\n``label_id`` is normalised into a slug and then never rewritten: it is what\nevery filter and every existing attachment names. Renaming is a\n``display_name`` change.","operationId":"upsert_label_agent_custom_label__label_id__put","parameters":[{"name":"label_id","in":"path","required":true,"schema":{"type":"string","title":"Label Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APILabelUpsertRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APILabel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Label","description":"Retire a label, detaching it from every assistant carrying it.\n\nA label that no longer applies has to leave the assistants it was filed\nagainst too, or the vocabulary and the shelf disagree.","operationId":"delete_label_agent_custom_label__label_id__delete","parameters":[{"name":"label_id","in":"path","required":true,"schema":{"type":"string","title":"Label Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/custom/{custom_agent_id}/review":{"get":{"summary":"Get Custom Agent For Review","description":"Everything needed to judge one pending assistant.\n\nEvery asset the prompt names comes back with a presigned URL meant for\n*viewing*: no filename is attached, so S3 sends no Content-Disposition and\na browser renders it in place rather than saving it. The asset's folder\ncomes with it. An id the prompt names that no longer resolves is reported\nas ``missing`` rather than dropped — a prompt pointing at a deleted asset\nis what review is for.","operationId":"get_custom_agent_for_review_agent_custom__custom_agent_id__review_get","parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APICustomAgentReviewDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/custom/{custom_agent_id}/review/page":{"get":{"summary":"Get Custom Agent Review Page","description":"The review, as something a person can read and act on.\n\nThe same data as the JSON route above, laid out so the decision can be\nmade without leaving the page: the prompt in full, the media playing in\nplace, and the two buttons that end it.\n\nAny ``?token=`` is carried into the buttons' requests, so a reviewer who\narrived from Slack without a session can still decide — once. It is put\nthere by the script rather than into a form action so it never lands in\n``document.referrer`` when a reviewer opens one of the asset links.","operationId":"get_custom_agent_review_page_agent_custom__custom_agent_id__review_page_get","parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Review link token, as minted into the Slack ping. Scoped to this assistant and to one reviewer; ignored when the caller is already signed in as a reviewer.","title":"Token"},"description":"Review link token, as minted into the Slack ping. Scoped to this assistant and to one reviewer; ignored when the caller is already signed in as a reviewer."},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/custom/{custom_agent_id}/review/approve":{"post":{"summary":"Approve Custom Agent Review","description":"Approve a pending copy and put it live.\n\nPromotion is atomic: whichever copy was live is retired in the same\ntransaction, so the public never sees two versions or none.","operationId":"approve_custom_agent_review_agent_custom__custom_agent_id__review_approve_post","parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Review link token, as minted into the Slack ping. Scoped to this assistant and to one reviewer; ignored when the caller is already signed in as a reviewer.","title":"Token"},"description":"Review link token, as minted into the Slack ping. Scoped to this assistant and to one reviewer; ignored when the caller is already signed in as a reviewer."},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/APICustomAgentReviewApproveRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/custom/{custom_agent_id}/review/reject_with_comment":{"post":{"summary":"Reject Custom Agent Review","description":"Send a pending copy back to its author with a reason.\n\nThe copy stays PENDING and is flagged ``needs_changes`` — the author has\nto tell \"nobody has looked at this yet\" from \"looked at, and sent back\".\nA live copy, if there is one, is untouched and stays up.","operationId":"reject_custom_agent_review_agent_custom__custom_agent_id__review_reject_with_comment_post","parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Review link token, as minted into the Slack ping. Scoped to this assistant and to one reviewer; ignored when the caller is already signed in as a reviewer.","title":"Token"},"description":"Review link token, as minted into the Slack ping. Scoped to this assistant and to one reviewer; ignored when the caller is already signed in as a reviewer."},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APICustomAgentReviewRejectRequest"}}}},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/custom/{custom_agent_id}/share":{"get":{"summary":"Get Custom Agent Share","operationId":"get_custom_agent_share_agent_custom__custom_agent_id__share_get","parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetShareResponseOptimized"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/custom/{custom_agent_id}/share/add":{"post":{"summary":"Add Custom Agent Share","description":"Share the assistant with a group or with one person by email.\n\nNeeds ``can_share`` on the assistant: its author, an ADMIN grant, or a\ngrant with ``can_share``. Below ADMIN the caller grants at most their own\nright, never ``can_share``, and cannot change a grant they could not have\nmade. An email with no account yet is listed in ``pending_invites`` until\nsomeone signs in with it. Returns the sharing as ``GET\n/{custom_agent_id}/share`` does.","operationId":"add_custom_agent_share_agent_custom__custom_agent_id__share_add_post","parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomAgentShareAddRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetShareResponseOptimized"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/custom/{custom_agent_id}/share/remove":{"post":{"summary":"Remove Custom Agent Share","description":"Stop sharing the assistant with a group or with one person.\n\nNeeds ``can_share`` on the assistant, except that anyone may remove their\nown access; below ADMIN only a grant the caller could have made. Returns\nthe sharing left, empty when the caller removed their own.","operationId":"remove_custom_agent_share_agent_custom__custom_agent_id__share_remove_post","parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomAgentShareRemoveRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetShareResponseOptimized"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/custom/{custom_agent_id}/share/prompt_assets":{"get":{"summary":"Get Custom Agent Prompt Assets Sharing","description":"Whether the assets the assistant's prompt names are shared with everyone\nthe assistant is shared with.\n\nA run reads each prompt asset as the person running it, so someone who\ncannot view one gets an assistant that cannot use it. This lists the\nassets missing a person, group or pending invite of the assistant (VIEW\neach), with who; ``in_sync`` is true when there are none. Needs the\nassistant shared with the caller.","operationId":"get_custom_agent_prompt_assets_sharing_agent_custom__custom_agent_id__share_prompt_assets_get","parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaSharing"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Share Custom Agent Prompt Assets","description":"Share the assets the assistant's prompt names, at VIEW, with everyone\nthe assistant is shared with.\n\nNeeds ``can_share`` on the assistant. Each asset follows the usual asset\nsharing rules: the caller must be able to share it, existing shares are\nnever lowered and never get ``can_share``. What cannot be granted is\nlisted in ``skipped`` rather than failing the call.","operationId":"share_custom_agent_prompt_assets_agent_custom__custom_agent_id__share_prompt_assets_post","parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaShareResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/custom/{custom_agent_id}/visibility":{"put":{"summary":"Set Custom Agent Visibility","operationId":"set_custom_agent_visibility_agent_custom__custom_agent_id__visibility_put","parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomAgentVisibilityRequest"}}}},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/custom/{custom_agent_id}/owner_labels":{"put":{"summary":"Set Custom Agent Owner Labels","description":"Replace the labels an author may set on their own assistant.\n\nHere rather than with the reviewer's ``/labels`` because this is the\nowner's half: it reaches only the vocabulary entries marked owner-settable,\nand replaces only those, so a reviewer's curation on the same assistant is\nnot something an author can drop by leaving it out.\n\nEvery entry must name a label from ``/label/list`` — an author picks from\nthe vocabulary rather than inventing an entry in it.","operationId":"set_custom_agent_owner_labels_agent_custom__custom_agent_id__owner_labels_put","parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APICustomAgentLabelsRequest"}}}},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/custom/label/list":{"get":{"summary":"Get Labels","description":"The label vocabulary.\n\nReadable by any signed-in user, unlike the routes that write it: an author\ncannot pick from a list they are not allowed to see. Two segments rather\nthan ``/labels`` so it can never be mistaken for an assistant id by the\n``/{custom_agent_id}`` routes.","operationId":"get_labels_agent_custom_label_list_get","parameters":[{"name":"set_by","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/LabelSetBy"},{"type":"null"}],"description":"Only labels this side may attach. OWNER is what an author can put on their own assistant.","title":"Set By"},"description":"Only labels this side may attach. OWNER is what an author can put on their own assistant."},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/APILabel"},"title":"Response Get Labels Agent Custom Label List Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/custom/list":{"get":{"summary":"Get Custom Agents","operationId":"get_custom_agents_agent_custom_list_get","parameters":[{"name":"with_public_access","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"With Public Access"}},{"name":"right","in":"query","required":false,"schema":{"$ref":"#/components/schemas/GroupRights","default":"READ"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","exclusiveMinimum":0,"default":20,"title":"Limit"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/APICustomAgentWithoutData"},"title":"Response Get Custom Agents Agent Custom List Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/custom/create":{"post":{"summary":"Create Custom Agent","operationId":"create_custom_agent_agent_custom_create_post","parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","title":"Name"}},{"name":"description","in":"query","required":true,"schema":{"type":"string","title":"Description"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/custom/likes":{"get":{"summary":"Get Liked Custom Agents","description":"Assistants the caller liked, most recently liked first.\n\nDeclared above ``/{custom_agent_id}`` so \"likes\" is not mistaken for\nan assistant id.\n\nReturns the *published* copy of each, which is what the user liked and the\nonly part of it that is theirs to see — the assistant behind it may be\nprivate. One that has since been unpublished drops out rather than coming\nback unopenable.","operationId":"get_liked_custom_agents_agent_custom_likes_get","parameters":[{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","exclusiveMinimum":0,"default":20,"title":"Limit"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/APICustomAgentWithoutData"},"title":"Response Get Liked Custom Agents Agent Custom Likes Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/custom/by_slug/{slug_id}":{"get":{"summary":"Get Custom Agent By Slug","description":"Resolve a published assistant's slug for a signed-in caller.\n\nDeclared above ``/{custom_agent_id}`` so \"by_slug\" is not mistaken for an\nassistant id.\n\nLands on the assistant itself when the caller can already see it — that is\nthe row carrying the prompt, the publication links and the rights the\nclient renders edit affordances from. Every other caller lands on the live\ncopy, exactly what ``/preview/agent/custom/by_slug/{slug_id}`` serves them,\nand an unknown slug or an assistant with nothing live is a 404 either way.","operationId":"get_custom_agent_by_slug_agent_custom_by_slug__slug_id__get","parameters":[{"name":"slug_id","in":"path","required":true,"schema":{"type":"string","title":"Slug Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APICustomAgent"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/custom/{custom_agent_id}":{"get":{"summary":"Get Custom Agent","operationId":"get_custom_agent_agent_custom__custom_agent_id__get","parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APICustomAgent"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Patch Custom Agent","operationId":"patch_custom_agent_agent_custom__custom_agent_id__patch","parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APICustomAgent"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"null","title":"Response Patch Custom Agent Agent Custom  Custom Agent Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Custom Agent","description":"Delete an assistant, or take a published copy down by deleting it.\n\nEvery row the delete touches is pushed to its ``/users/ws`` followers:\n\n* the addressed row, as a delete;\n* the copies that go with an assistant, also as deletes — Postgres\n  cascades them away, and nothing else would tell their followers;\n* the **assistant behind a copy**, as an update — deleting a copy is an\n  unpublish, so its posted/pending ids have just changed and a follower\n  still holding the old ones would keep offering a page that is gone.","operationId":"delete_custom_agent_agent_custom__custom_agent_id__delete","parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/custom/update":{"put":{"summary":"Update Custom Agent","operationId":"update_custom_agent_agent_custom_update_put","deprecated":true,"parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APICustomAgent"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"null","title":"Response Update Custom Agent Agent Custom Update Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/custom/{custom_agent_id}/publish":{"post":{"summary":"Publish Custom Agent","description":"Publish an assistant, returning the frozen copy submitted for review.\n\nThe copy is what reviewers and the public see; the assistant it was\npublished from stays editable. Only one copy can exist per assistant.\n\nEverything publishing does, in the order it has to happen: freeze the\ncopy, push both rows to their followers, then ping the review channel\nonce the write is committed.","operationId":"publish_custom_agent_agent_custom__custom_agent_id__publish_post","parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APICustomAgent"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/custom/{custom_agent_id}/unpublish":{"post":{"summary":"Unpublish Custom Agent","description":"Take a published assistant, or one of its copies, down.\n\nWhat comes down depends on which id is given, so the caller can be as\nbroad or as narrow as they need:\n\n* the **assistant's** id — everything: the live copy and any submission\n  still under review;\n* a **posted** copy's id — only the live one, leaving a pending\n  submission queued;\n* a **pending** copy's id — only the submission, withdrawing it while\n  the live version stays up.\n\nThe slug stays on the assistant either way, so publishing again reuses\nthe same public URL.","operationId":"unpublish_custom_agent_agent_custom__custom_agent_id__unpublish_post","parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/custom/{custom_agent_id}/vote":{"put":{"summary":"Vote Custom Agent","description":"Like or dislike an assistant. Idempotent — a second call just switches.\n\nAccepts a published copy's id too: the vote is recorded against the\nassistant behind it, so it survives an unpublish/republish.","operationId":"vote_custom_agent_agent_custom__custom_agent_id__vote_put","parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APICustomAgentVoteRequest"}}}},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Clear Custom Agent Vote","description":"Withdraw a vote. Succeeds whether or not one was there.","operationId":"clear_custom_agent_vote_agent_custom__custom_agent_id__vote_delete","parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/custom/{custom_agent_id}/assistant_asset/upload_url":{"post":{"summary":"Create Assistant Asset Upload Url","operationId":"create_assistant_asset_upload_url_agent_custom__custom_agent_id__assistant_asset_upload_url_post","parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantAssetUploadRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantAssetUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/custom/{custom_agent_id}/assistant_asset/{role}/upload_part_urls":{"post":{"summary":"Create Assistant Asset Part Urls","description":"Presign a small batch of part URLs for an in-flight multipart upload.\n\nCalled repeatedly as the upload progresses so URLs are always fresh and a\nfailed part can be retried with a newly minted URL.","operationId":"create_assistant_asset_part_urls_agent_custom__custom_agent_id__assistant_asset__role__upload_part_urls_post","parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"role","in":"path","required":true,"schema":{"$ref":"#/components/schemas/AssistantAssetRole"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantAssetPartUrlsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantAssetPartUrlsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/custom/{custom_agent_id}/assistant_asset/{role}/upload_complete":{"post":{"summary":"Complete Assistant Asset Upload","description":"Finalise a multipart upload and start optimisation.\n\nOptional: /process finalises a pending upload too, and the reconciliation\nsweep picks up anything neither call reached. Send no body (the common\ncase) and the parts are read from S3, which is authoritative;\nclient-supplied ETags are accepted but never required.","operationId":"complete_assistant_asset_upload_agent_custom__custom_agent_id__assistant_asset__role__upload_complete_post","parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"role","in":"path","required":true,"schema":{"$ref":"#/components/schemas/AssistantAssetRole"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/AssistantAssetCompleteRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/custom/{custom_agent_id}/assistant_asset/{role}/upload_abort":{"post":{"summary":"Abort Assistant Asset Upload","description":"Abort an in-flight multipart upload so S3 stops billing for its parts.","operationId":"abort_assistant_asset_upload_agent_custom__custom_agent_id__assistant_asset__role__upload_abort_post","parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"role","in":"path","required":true,"schema":{"$ref":"#/components/schemas/AssistantAssetRole"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/custom/{custom_agent_id}/assistant_asset/{role}/upload_status":{"get":{"summary":"Get Assistant Asset Upload Status","description":"Which parts S3 already holds, so an interrupted upload can resume.\n\nLets a client that lost its in-memory state (tab closed, reload) send only\nthe missing parts, without having persisted any ETags of its own.","operationId":"get_assistant_asset_upload_status_agent_custom__custom_agent_id__assistant_asset__role__upload_status_get","parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"role","in":"path","required":true,"schema":{"$ref":"#/components/schemas/AssistantAssetRole"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantAssetUploadStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/custom/{custom_agent_id}/assistant_asset/from_asset":{"post":{"summary":"Create Assistant Asset From Asset","operationId":"create_assistant_asset_from_asset_agent_custom__custom_agent_id__assistant_asset_from_asset_post","parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantAssetFromAssetRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIAssistantAsset"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/custom/{custom_agent_id}/assistant_asset/{role}/process":{"post":{"summary":"Process Assistant Asset","operationId":"process_assistant_asset_agent_custom__custom_agent_id__assistant_asset__role__process_post","parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"role","in":"path","required":true,"schema":{"$ref":"#/components/schemas/AssistantAssetRole"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIAssistantAsset"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent/custom/{custom_agent_id}/assistant_asset/{role}":{"delete":{"summary":"Delete Assistant Asset","operationId":"delete_assistant_asset_agent_custom__custom_agent_id__assistant_asset__role__delete","parameters":[{"name":"custom_agent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Custom Agent Id"}},{"name":"role","in":"path","required":true,"schema":{"$ref":"#/components/schemas/AssistantAssetRole"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/create_account":{"post":{"tags":["accepts-api-key"],"summary":"Create Account","description":"Create a Firebase + SQL account for an email. Admin only.\n\nCreates the user in Firebase Auth first (with the given or a random\npassword); the SQL user is created from the returned UID if it does not\nalready exist, after which the email is marked as verified in Firebase.\n\nThe route is idempotent: if the email already exists in Firebase, that\naccount is reused (no new Firebase user, password left unchanged), and if\nthe SQL user already exists it is left as-is. Either way the email is\nmarked as verified.","operationId":"create_account_admin_create_account_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAccountRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAccountResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/delete_account":{"post":{"tags":["accepts-api-key"],"summary":"Delete Account","description":"Delete an account everywhere it exists, streaming progress (SSE). Admin only.\n\nPurges, in order: the signup-history record (written first so a crash cannot\nhand the email a second free grant), Stripe subscriptions, the upload-post\nprofile, the user's assets and projects, their chats, the groups they solely\nown, the SQL user row, and finally the S3 objects and the Firebase account.\n\nThe Stripe *customer* is kept so invoices and tax records stay queryable —\nit is never reused anyway, since customers are resolved by\n``metadata.firebaseUID`` and a re-registration gets a fresh uid.\n\n**Firebase deletion only happens in production.** Staging points at the\nproduction Firebase project, so deleting there would destroy a real login;\noutside production the account is left alone and the reason is reported.","operationId":"delete_account_admin_delete_account_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteAccountRequest"}}}},"responses":{"200":{"description":"Server-sent events. `progress` events report each stage as it happens; the final `done` event is the object below — a summary of what was deleted, or, on a dry run, a `preview` of what would be.","content":{"text/event-stream":{"schema":{"type":"string","$ref":"#/components/schemas/DeleteAccountSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/signup_history":{"get":{"tags":["accepts-api-key"],"summary":"Get Signup History","description":"Report whether an email ever had an account, and its grant status. Admin only.\n\nThe history table is keyed by a SHA-256 hash of the email — it has to\noutlive the accounts it describes, so it stores no personal data. Look-ups\ntherefore go through this route, which hashes the email you supply.","operationId":"get_signup_history_admin_signup_history_get","parameters":[{"name":"email","in":"query","required":true,"schema":{"type":"string","description":"Email to look up","title":"Email"},"description":"Email to look up"},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/user_info":{"get":{"tags":["accepts-api-key"],"summary":"Get User Info","description":"Everything worth knowing about one account: files, tokens, plan, storage, social. Admin only.\n\nThe storage total is measured fresh rather than read from the cache — a\nsupport question about an account is exactly when a number an hour old is\nnot good enough.","operationId":"get_user_info_admin_user_info_get","parameters":[{"name":"email","in":"query","required":true,"schema":{"type":"string","description":"Email of the account to look up","title":"Email"},"description":"Email of the account to look up"},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUserInfoResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/upload_post":{"get":{"tags":["accepts-api-key"],"summary":"Get Upload Post Usage","description":"Upload-Post plan, profile slots used, and who has what connected. Admin only.\n\nAsked live from Upload-Post rather than read from our webhook mirror, which\nonly knows what the webhooks told it. Monthly upload credits are not\nhere: Upload-Post exposes them only on publish responses, never on a read.","operationId":"get_upload_post_usage_admin_upload_post_get","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUploadPostResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users_over_quota":{"get":{"tags":["accepts-api-key"],"summary":"Get Users Over Quota","description":"List the accounts storing more than their plan allows, worst first. Admin only.\n\nComputed live across every account rather than read from the cached totals.\nThe cache fills in by use, so an account nobody has touched has no row in\nit, and a report of who is over quota that quietly omits the dormant\naccounts is worse than no report — those are exactly the ones that will be\nsurprised when the block turns on.\n\nThat makes this the expensive call: it walks the asset and rendition tables.\nIt is admin-only and paged for that reason.\n\nOrdered by the overage in bytes, not by ratio: a free account 1 GB over\ncosts less than a paid one 400 GB over, however alarming the proportion.","operationId":"get_users_over_quota_admin_users_over_quota_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Maximum rows to return","default":100,"title":"Limit"},"description":"Maximum rows to return"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Rows to skip, for paging","default":0,"title":"Offset"},"description":"Rows to skip, for paging"},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminOverQuotaResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/tool_cost_history":{"get":{"tags":["accepts-api-key"],"summary":"Get Tool Cost History","description":"List recorded tool costs for admin estimation and analysis.","operationId":"get_tool_cost_history_admin_tool_cost_history_get","parameters":[{"name":"tool","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tool name to filter by","title":"Tool"},"description":"Tool name to filter by"},{"name":"created_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Return records created at or after this timestamp","title":"Created After"},"description":"Return records created at or after this timestamp"},{"name":"created_before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Return records created at or before this timestamp","title":"Created Before"},"description":"Return records created at or before this timestamp"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Maximum records to return","default":100,"title":"Limit"},"description":"Maximum records to return"},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ToolCostHistoryResponse"},"title":"Response Get Tool Cost History Admin Tool Cost History Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/rebuild_asset_readers":{"post":{"tags":["accepts-api-key"],"summary":"Rebuild Asset Readers","description":"Fill ``ta_asset_reader`` again from the folder tree (SSE).\n\nThe table holds who can see each asset -- the owner of it or of a folder\nabove it, and everyone a grant on it or above it reaches, directly or\nthrough a group's members (the Everyone group, which has none, is read\nfrom its grants instead) -- and database triggers keep it current. Run\nthis once after the release that installs them, and whenever the table\nmay have drifted. Safe to run again. Admin only.","operationId":"rebuild_asset_readers_admin_rebuild_asset_readers_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegacySharingRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"text/event-stream":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/restore_legacy_sharing":{"post":{"tags":["accepts-api-key"],"summary":"Restore Legacy Sharing","description":"Write owners and grants back into the legacy group mappings (SSE).\n\nRun it before rolling the sharing release back, so the previous release,\nwhich reads only the mappings, still finds what was created and shared\nsince: per-user groups for new accounts, an owner mapping for every asset\nwith none, every chat and assistant owner and grant. Asset grants are not\ncarried back. Adds only; safe to run again. Admin only.","operationId":"restore_legacy_sharing_admin_restore_legacy_sharing_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegacySharingRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"text/event-stream":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/backfill_signup_history":{"post":{"tags":["accepts-api-key"],"summary":"Backfill Signup History","description":"Seed signup history from existing users, streaming progress (SSE). Admin only.\n\nThe table ships empty, which would let every pre-existing user delete their\naccount and re-register for a second signup grant. This walks ``ta_user``\n(ordered by creation date) and inserts one history row per email, marked as\nalready granted.\n\nIdempotent and resumable: rows that exist are left untouched, so re-running\nis a no-op. Keep calling with the returned ``next_offset`` until ``scanned``\ncomes back as 0.","operationId":"backfill_signup_history_admin_backfill_signup_history_post","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"exclusiveMinimum":0,"default":500,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"batch_size","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"exclusiveMinimum":0,"default":200,"title":"Batch Size"}},{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","description":"Report what would be inserted without writing","default":false,"title":"Dry Run"},"description":"Report what would be inserted without writing"},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/audio/backfill_renditions":{"post":{"tags":["accepts-api-key"],"summary":"Backfill Audio Renditions","description":"Queue the playback and export copies for old audio assets. Admin only.\n\nAudio processed before those copies existed is served its MP3 everywhere.\nEach queued task downloads the asset's upload, writes the copies audio\nprocessing writes today, and restores the original rendition's mime type,\ncodec and size, which processing used to overwrite with the MP3's. The\nMP3, transcript and embeddings are left alone, so nothing is billed.\n\nResumable: keep calling with the returned ``next_after_id`` until it comes\nback null. Safe to re-run: an asset leaves the list once its playback copy\nis written, and a task for an asset that already has one does nothing, so\nstarting over only picks up what is still missing (including assets whose\ntask is still queued).","operationId":"backfill_audio_renditions_admin_audio_backfill_renditions_post","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"exclusiveMinimum":0,"default":200,"title":"Limit"}},{"name":"after_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Last asset id of the previous page; omit to start over","title":"After Id"},"description":"Last asset id of the previous page; omit to start over"},{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","description":"List the page without queuing tasks","default":false,"title":"Dry Run"},"description":"List the page without queuing tasks"},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BackfillAudioRenditionsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/grant":{"post":{"tags":["accepts-api-key"],"summary":"Grant Tokens","description":"Grant tokens to a user by email. Admin only.\n\nCreates a one-time grant of ``quantity`` tokens that expires\n``expiration_days`` days from today, returning the grant id and the\ncomputed expiration date.","operationId":"grant_tokens_admin_grant_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GrantTokensRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GrantTokensResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/resync_subscription":{"post":{"tags":["accepts-api-key"],"summary":"Resync Subscription","description":"Make a user's local subscription match Stripe, by email. Admin only.\n\nRe-resolves the Stripe customer (the stored id is kept only if Stripe still\nhas it, else the customer is found by its ``firebaseUID`` metadata), then\nupserts the newest active subscription the way the webhooks do, or clears a\nlocal subscription Stripe no longer has. Never grants tokens: those stay\ntied to paid invoices.","operationId":"resync_subscription_admin_resync_subscription_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResyncSubscriptionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResyncSubscriptionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/grant/{grant_id}":{"delete":{"tags":["accepts-api-key"],"summary":"Delete Grant","description":"Delete a grant by id, removing it from the database. Admin only.","operationId":"delete_grant_admin_grant__grant_id__delete","parameters":[{"name":"grant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Grant Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/enterprise_user_subscription":{"post":{"tags":["accepts-api-key"],"summary":"Add Enterprise User Subscription","description":"Put users on an enterprise subscription, outside Stripe. Admin only.\n\nEnterprise unlocks every feature and shows in the app as an Enterprise\nplan. Each user gets ``monthly_tokens`` now and every month after, a\n``storage_gb`` quota, and ``instant_tokens`` once, expiring after\n``instant_tokens_expiration_days``. The subscription ends by itself after\n``duration_months``.\n\nA user already on enterprise gets the new terms and period instead, with\nno new monthly tokens. Every email is handled on its own: one that can't be\n(no account, or a Stripe subscription to cancel first) is listed in\n``issues`` and the others still go through.","operationId":"add_enterprise_user_subscription_admin_enterprise_user_subscription_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnterpriseUserSubscriptionAddRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnterpriseUserSubscriptionAddResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/enterprise_user_subscription/remove":{"post":{"tags":["accepts-api-key"],"summary":"Remove Enterprise User Subscription","description":"Take users off their enterprise subscription now. Admin only.\n\nStorage goes back to the free quota; tokens already granted stay until they\nexpire. A Stripe subscription is never touched. Every email is handled on\nits own: one that can't be is listed in ``issues``.","operationId":"remove_enterprise_user_subscription_admin_enterprise_user_subscription_remove_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnterpriseUserSubscriptionRemoveRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnterpriseUserSubscriptionRemoveResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/video/downscale/{source_file_id}":{"post":{"tags":["accepts-api-key"],"summary":"Request Downscale Admin","description":"Request downscaling of a video asset. Admin only.\n\nMirrors ``POST /video/downscale/{source_file_id}`` but is gated solely by the\nadmin api-key/bearer guard, so no user token or WRITE access on the asset is\nrequired. The task is charged to the asset owner. Set force=true to\nregenerate the proxy even if a matching rendition already exists.","operationId":"request_downscale_admin_admin_video_downscale__source_file_id__post","parameters":[{"name":"source_file_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Source File Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DownscaleRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DownscaleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/chat/{chat_id}":{"get":{"tags":["accepts-api-key"],"summary":"Get Chat Info","description":"Report a chat's stored state, its OpenAI response ids and conversation id.\n\nAdmin only, and deliberately unfiltered by chat membership: it exists to\ndebug a chat reported by a user, so it reads the row directly instead of\ngoing through the permission-checked chat routes. It returns metadata and\nthe OpenAI identifiers, never the message contents.","operationId":"get_chat_info_admin_chat__chat_id__get","parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Chat Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatInfoResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/public/luts":{"post":{"tags":["accepts-api-key"],"summary":"Add Public Lut","description":"Publish a ``.cube`` LUT at ``/public/Tellers.ai/LUTs/<folders...>/<filename>``.\n\nThe asset has no owner, no creator and no group: ``is_public_read`` alone\nmakes it readable by every user. Its folders are public folders, created\nwhen missing, and ``/public/Tellers.ai`` is shared with Everyone (VIEW)\nunless it already is, so the library shows up in every user's \"Shared with\nme\". It is stored as a ``lut`` asset with nothing to preprocess, the same\nshape an uploaded ``.cube`` ends up in. The body is uploaded to the\nmatching key under ``public/Tellers.ai/LUTs/`` in the source-videos\nbucket inside the same transaction that records it, so a failed upload\nleaves no asset behind.\n\nA second call for the same file name fails with 409 unless ``replace`` is\nset, in which case the object and the metadata are overwritten in place and\nthe asset keeps its id.","operationId":"add_public_lut_admin_public_luts_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddPublicLutRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddPublicLutResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/assets/{asset_id}/share_everyone":{"put":{"tags":["accepts-api-key"],"summary":"Share Asset With Everyone","description":"Share a file or folder read-only with every user, or stop sharing it.\n\nThe grant goes to the Everyone group, which every user belongs to: the\nasset shows up in their \"Shared with me\" (except its owner's) and, for a\nfolder, everything in it is reached too. It never lets anyone share\nonward, and users cannot remove it or share with Everyone themselves. A\nsecond call replaces the right.","operationId":"share_asset_with_everyone_admin_assets__asset_id__share_everyone_put","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Asset Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareWithEveryoneRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareWithEveryoneResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/status":{"get":{"summary":"Internal Status","description":"Liveness/activity snapshot for the idle scaler.\n\nReturns how long the api has gone without a real HTTP request (health probes\nand this endpoint excluded) plus the number of live WebSocket connections.\nThe in-cluster ``idle-scaledown`` CronJob reads this (in-cluster, so it\nreaches this VPC-only router directly) and scales staging to zero once\n``idle_seconds`` crosses its threshold and the queues are drained.\n``active_websockets`` is informational only — a socket left open idle must\nnot keep staging alive — so it does not gate scale-down.","operationId":"internal_status_internal_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusResponse"}}}}}}},"/internal/cleanup_expired_multipart_uploads":{"post":{"summary":"Internal Cleanup Expired Multipart Uploads","description":"Internal-only maintenance endpoint.\n\nRun on a schedule by ``cron_job_hourly``; kept as its own route so it can be\ndriven by hand with different limits.\n\nExpose this router only via an internal ingress/LB (VPC-only).","operationId":"internal_cleanup_expired_multipart_uploads_internal_cleanup_expired_multipart_uploads_post","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","exclusiveMinimum":0,"default":200,"title":"Limit"}},{"name":"grace_seconds","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":3600,"title":"Grace Seconds"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CleanupExpiredMultipartUploadsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/dispatch_assistant_asset_uploads":{"post":{"summary":"Internal Dispatch Assistant Asset Uploads","description":"Internal-only maintenance endpoint (run hourly by ``cron_job_hourly``).\n\nOptimisation is normally dispatched by the API as soon as the client\nfinishes uploading; this reconciles the cases it never reached — a browser\nclosed mid-flow, or a client that never called upload_complete/process.\n\nIt also reclaims uploads that stopped making progress altogether (default:\nno new part for 24h), aborting the multipart so S3 stops charging for the\nparts already written.\n\nExpose this router only via an internal ingress/LB (VPC-only).","operationId":"internal_dispatch_assistant_asset_uploads_internal_dispatch_assistant_asset_uploads_post","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","exclusiveMinimum":0,"default":200,"title":"Limit"}},{"name":"grace_seconds","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":900,"title":"Grace Seconds"}},{"name":"abandon_after_seconds","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":86400,"title":"Abandon After Seconds"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DispatchAssistantAssetUploadsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/daily_cron":{"post":{"summary":"Internal Daily Cron","description":"Internal-only: billing maintenance. Runs, in order:\n\n1. Token grant expiration (``expires_at`` in the past → zero remaining).\n2. Yearly subscription monthly drips (``next_cron_grant <= today``).\n3. Storage quota reset to default for lapsed subscriptions (period ended and\n   status is not ``active`` / ``trialing``).\n4. Removal of enterprise subscriptions whose period has ended.\n\nAll steps share one DB transaction. Called once per day by\n``cron_job_daily``; kept as its own route so it can be driven by hand.\nIdempotent for expirations within a day; yearly drips advance\n``next_cron_grant`` so the same day does not double-grant.","operationId":"internal_daily_cron_internal_daily_cron_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DailyCronResponse"}}}}}}},"/internal/cron_job_daily":{"post":{"summary":"Internal Cron Job Daily","description":"Internal-only: the single entry point for daily scheduled work.\n\nCalled once a day by the ``cron-job-daily`` CronJob (see the api-chart\ntemplates). Today its only step is the billing maintenance described on\n``daily_cron``; a new daily job belongs here rather than getting its own\nendpoint and CronJob, so the cluster keeps one daily schedule to reason\nabout.\n\nSteps run in order and share the api pod's DB, so a step that raises fails\nthe CronJob — which is the signal we want — and stops the ones after it.\n\nExpose this router only via an internal ingress/LB (VPC-only).","operationId":"internal_cron_job_daily_internal_cron_job_daily_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DailyCronResponse"}}}}}}},"/internal/cron_job_hourly":{"post":{"summary":"Internal Cron Job Hourly","description":"Internal-only: the single entry point for hourly scheduled work.\n\nCalled every hour by the ``cron-job-hourly`` CronJob (see the api-chart\ntemplates). Runs, in order:\n\n1. The assistant asset upload sweep — dispatch what the client never handed\n   over, then reclaim what stopped making progress (``dispatch_assistant_asset_uploads``).\n2. Expired multipart upload cleanup, refunding the reserved credits\n   (``cleanup_expired_multipart_uploads``).\n3. Stale storage-usage recomputation (``refresh_storage_usage``), so the\n   gigabytes reported to a user catch up with what the workers wrote.\n\nDispatch runs before cleanup so a finished upload is claimed for processing\nrather than reclaimed. Each step already swallows per-row errors; a step\nthat raises outright fails the CronJob and stops the ones after it.\n\nExpose this router only via an internal ingress/LB (VPC-only).","operationId":"internal_cron_job_hourly_internal_cron_job_hourly_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HourlyCronResponse"}}}}}}},"/internal/export_html":{"get":{"summary":"Internal Export Html","description":"Internal-only: serve the video-player export page for a project.\n\nReturns HTML with bundle.js inlined and OTIO playlist (with presigned URLs)\nfor the given project and resolution. Same page as export-server.js /export-page\nbut with bundle inlined and project data baked in.\n\nResolution selects asset quality: 480p, 720p, 1080p, 4k.\n``track_id`` (repeatable) renders only those tracks, the others disabled;\n``frame_seconds`` renders the timeline at that time to a JPEG instead of\nencoding the MP4; ``frame_list`` (repeatable) renders each of its times\nto its own JPEG in one page load. ``start_seconds`` / ``end_seconds``\n(timeline seconds) encode only that part of the timeline, rebased to 0\nby the player.\n\nA segmented export loads the page once per part: ``start_frame`` /\n``end_frame`` (output frame indices, end exclusive) with ``audio=0`` for a\nvideo-only segment, or ``audio_only=m4a`` for its sound — of the whole\ntimeline, or of ``start_seconds`` / ``end_seconds`` for a ranged export.\nThe frame range excludes the audio-only render, the second-based range\nand the frame export above.\n\n``hdr`` (``hlg`` or ``pq``) encodes the video as HDR (the player's ``hdr``\nexport option); it applies to a video encode only.\nNo permission check: any project can be fetched by id (internal use only).","operationId":"internal_export_html_internal_export_html_get","parameters":[{"name":"project_id","in":"query","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"resolution","in":"query","required":false,"schema":{"enum":["480p","720p","1080p","4k"],"type":"string","default":"720p","title":"Resolution"}},{"name":"track_id","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Track Id"}},{"name":"frame_seconds","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Frame Seconds"}},{"name":"start_seconds","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Start Seconds"}},{"name":"end_seconds","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"End Seconds"}},{"name":"start_frame","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Start Frame"}},{"name":"end_frame","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"End Frame"}},{"name":"audio","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Audio"}},{"name":"audio_only","in":"query","required":false,"schema":{"anyOf":[{"const":"m4a","type":"string"},{"type":"null"}],"title":"Audio Only"}},{"name":"frame_list","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"number"}},{"type":"null"}],"title":"Frame List"}},{"name":"hdr","in":"query","required":false,"schema":{"anyOf":[{"enum":["hlg","pq"],"type":"string"},{"type":"null"}],"title":"Hdr"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/export_playlist":{"post":{"summary":"Internal Export Playlist","description":"Internal-only: the timeline in the body with its sources presigned again,\nthe way ``/internal/export_html`` presigned them for ``resolution``.\n\nAn export that outlives its source URLs pauses and posts back the\nplaylist its page was built with (the player's ``refreshMediaUrls``\nexport option). That timeline is re-signed, not the project as it is\nnow: the project may have been edited since, and media removed from it\nmeanwhile must still be readable for the render to finish. The page\ncalls it with its own query string; the parameters that only shape the\nrender (project, tracks, frames, ranges, audio, hdr) are ignored here.\nNothing is saved. No permission check (internal use only).","operationId":"internal_export_playlist_internal_export_playlist_post","parameters":[{"name":"resolution","in":"query","required":false,"schema":{"enum":["480p","720p","1080p","4k"],"type":"string","default":"720p","title":"Resolution"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Playlist"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/webhooks/upload-post":{"post":{"summary":"Upload Post Webhook","operationId":"upload_post_webhook_webhooks_upload_post_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadPostWebhookPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadPostWebhookResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/group/create":{"post":{"summary":"Create Group","operationId":"create_group_group_create_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGroupRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGroupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/group/list":{"get":{"summary":"List Groups","operationId":"list_groups_group_list_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/GroupResponse"},"title":"Response List Groups Group List Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/group/users":{"get":{"summary":"List Group Users","description":"The members of a group, for the people who manage it.","operationId":"list_group_users_group_users_get","parameters":[{"name":"group_id","in":"query","required":true,"schema":{"type":"string","title":"Group Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/GroupMemberResponse"},"title":"Response List Group Users Group Users Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/group/update":{"post":{"summary":"Update Group","operationId":"update_group_group_update_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGroupRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/group/users/add":{"post":{"summary":"Add Group Users","operationId":"add_group_users_group_users_add_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupUsersRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupUsersResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/group/users/remove":{"post":{"summary":"Remove Group Users","operationId":"remove_group_users_group_users_remove_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupUsersRemoveRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupUsersResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/access_request":{"post":{"summary":"Create Access Request","description":"Ask the owner of the target to share it with the caller.\n\nAlways answers 204, whether or not the target exists, so it cannot be used\nto learn what does. A request is only sent when the caller cannot already\nread the target, and only once.","operationId":"create_access_request_access_request_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAccessRequest"}}}},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/access_request/incoming":{"get":{"summary":"List Incoming Access Requests","description":"The requests waiting on the caller, newest first.","operationId":"list_incoming_access_requests_access_request_incoming_get","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AccessRequestResponse"},"title":"Response List Incoming Access Requests Access Request Incoming Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/access_request/incoming/count":{"get":{"summary":"Count Incoming Access Requests","description":"How many requests are waiting on the caller.","operationId":"count_incoming_access_requests_access_request_incoming_count_get","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessRequestCountResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/access_request/{request_id}/approve":{"post":{"summary":"Approve Access Request","description":"Share the requested file, folder, chat or assistant with the requester.","operationId":"approve_access_request_access_request__request_id__approve_post","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/access_request/{request_id}/decline":{"post":{"summary":"Decline Access Request","description":"Decline the request. Asking again will not reach the caller.","operationId":"decline_access_request_access_request__request_id__decline_post","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","title":"Request Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/.well-known/oauth-authorization-server":{"get":{"summary":"Oauth Authorization Server Metadata","operationId":"oauth_authorization_server_metadata__well_known_oauth_authorization_server_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Oauth Authorization Server Metadata  Well Known Oauth Authorization Server Get"}}}}}}},"/.well-known/openid-configuration":{"get":{"summary":"Openid Configuration","operationId":"openid_configuration__well_known_openid_configuration_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Openid Configuration  Well Known Openid Configuration Get"}}}}}}},"/.well-known/oauth-protected-resource":{"get":{"summary":"Oauth Protected Resource Metadata","operationId":"oauth_protected_resource_metadata__well_known_oauth_protected_resource_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Oauth Protected Resource Metadata  Well Known Oauth Protected Resource Get"}}}}}}},"/.well-known/oauth-protected-resource/{resource_path}":{"get":{"summary":"Oauth Protected Resource Metadata For Path","operationId":"oauth_protected_resource_metadata_for_path__well_known_oauth_protected_resource__resource_path__get","parameters":[{"name":"resource_path","in":"path","required":true,"schema":{"type":"string","title":"Resource Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Oauth Protected Resource Metadata For Path  Well Known Oauth Protected Resource  Resource Path  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/oauth/jwks.json":{"get":{"summary":"Jwks","operationId":"jwks_oauth_jwks_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array"},"type":"object","title":"Response Jwks Oauth Jwks Json Get"}}}}}}},"/oauth/firebase-config":{"get":{"summary":"Firebase Config","operationId":"firebase_config_oauth_firebase_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Firebase Config Oauth Firebase Config Get"}}}}}}},"/oauth/register":{"post":{"summary":"Register","description":"RFC 7591 dynamic client registration, open and unauthenticated.\n\nOpen registration is what MCP clients require: they have no way to be issued\na client_id out of band, and refuse to start the flow without this endpoint.\nIt grants nothing on its own -- no secret is issued, the caller still has to\nwalk a human through Google sign-in on the consent page, and every\nredirect_uri offered here is held to the same host allowlist the authorize\nendpoint enforces. So the worst a stranger can register is a callback that\nwas already allowed to receive codes.","operationId":"register_oauth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/oauth/authorize":{"get":{"summary":"Authorize","operationId":"authorize_oauth_authorize_get","parameters":[{"name":"response_type","in":"query","required":true,"schema":{"type":"string","title":"Response Type"}},{"name":"client_id","in":"query","required":true,"schema":{"type":"string","title":"Client Id"}},{"name":"redirect_uri","in":"query","required":true,"schema":{"type":"string","title":"Redirect Uri"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"code_challenge","in":"query","required":true,"schema":{"type":"string","title":"Code Challenge"}},{"name":"code_challenge_method","in":"query","required":false,"schema":{"type":"string","default":"S256","title":"Code Challenge Method"}},{"name":"resource","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resource"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/oauth/authorize/approve":{"post":{"summary":"Approve","operationId":"approve_oauth_authorize_approve_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApproveRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/oauth/token":{"post":{"summary":"Token","operationId":"token_oauth_token_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth/cancel":{"get":{"summary":"Cancel","operationId":"cancel_oauth_cancel_get","parameters":[{"name":"redirect_uri","in":"query","required":true,"schema":{"type":"string","title":"Redirect Uri"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/create":{"get":{"tags":["accepts-api-key"],"summary":"Create Agent Stream","description":"SSE stream for agent creation. GET with query params; same behavior as\nPOST /agent/response/json. Emits event: tellers.json_result (progressing, then done).","operationId":"create_agent_stream_create_get","parameters":[{"name":"prompt","in":"query","required":true,"schema":{"type":"string","description":"The message/prompt to send to the agent","title":"Prompt"},"description":"The message/prompt to send to the agent"},{"name":"tools","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Tool IDs to use. If omitted, defaults to available agent tools.","title":"Tools"},"description":"Tool IDs to use. If omitted, defaults to available agent tools."},{"name":"llm_model","in":"query","required":false,"schema":{"enum":["gpt-6-astra","gpt-6.1-sol","gpt-6.1-terra","gpt-6-sol","gpt-6-luna","gpt-5.6-sol","gpt-5.6-terra","gpt-5.6-luna","gpt-5.5-2026-04-23","gpt-5.5-pro-2026-04-23","gpt-5.4-pro-2026-03-05","gpt-5.4","gpt-5.4-mini","gpt-5.3-codex","gpt-5.2-2025-12-11","gpt-5-mini-2025-08-07","gpt-5-nano"],"type":"string","description":"The LLM model to use for the response.","default":"gpt-6-luna","title":"Llm Model"},"description":"The LLM model to use for the response."},{"name":"parallel_tool_calls","in":"query","required":false,"schema":{"type":"boolean","description":"Whether to allow parallel tool calls. Defaults to true.","default":true,"title":"Parallel Tool Calls"},"description":"Whether to allow parallel tool calls. Defaults to true."},{"name":"chat_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional chat ID for conversation tracking. Created if omitted.","title":"Chat Id"},"description":"Optional chat ID for conversation tracking. Created if omitted."},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/settings":{"get":{"tags":["accepts-api-key"],"summary":"Get Settings","operationId":"get_settings_settings_get","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppSettings"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/task/{task_id}":{"get":{"tags":["accepts-api-key"],"summary":"Get Task","operationId":"get_task_task__task_id__get","deprecated":true,"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/PendingTaskResponse"},{"$ref":"#/components/schemas/CompleteTaskResponse"},{"$ref":"#/components/schemas/FailedTaskResponse"}],"title":"Response Get Task Task  Task Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["accepts-api-key"],"summary":"Delete Task","operationId":"delete_task_task__task_id__delete","deprecated":true,"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelTaskResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/is-alive":{"get":{"summary":"Is Alive","operationId":"is_alive_is_alive_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Is Alive Is Alive Get"}}}}}}}},"components":{"schemas":{"APIAssistantAsset":{"properties":{"kind":{"$ref":"#/components/schemas/AssistantAssetKind"},"status":{"$ref":"#/components/schemas/AssistantAssetStatus"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height"},"duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Seconds"}},"type":"object","required":["kind","status"],"title":"APIAssistantAsset","description":"Web-optimised media (webp / faststart mp4) attached to an assistant.\n\nResponse-only: the client sets logo/demo through the dedicated\n``/assistant_asset`` endpoints, not by writing these fields back. The role\nis implied by the field/path it is returned under, and the internal row id\nis never exposed."},"APICustomAgent":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"last_edit":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Edit"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"logo_mime_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Mime Type"},"logo_status":{"anyOf":[{"$ref":"#/components/schemas/AssistantAssetStatus"},{"type":"null"}]},"demo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Demo Url"},"demo_mime_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Demo Mime Type"},"is_public_read":{"type":"boolean","title":"Is Public Read","default":false},"publication_status":{"$ref":"#/components/schemas/CustomAgentPublicationStatus","default":"ORIGINAL"},"needs_changes":{"type":"boolean","title":"Needs Changes","default":false},"slug_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug Id"},"created_from_custom_agent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created From Custom Agent Id"},"pending_custom_agent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pending Custom Agent Id"},"pending_needs_changes":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Pending Needs Changes"},"pending_reviewer_comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pending Reviewer Comment"},"posted_custom_agent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Posted Custom Agent Id"},"labels":{"items":{"type":"string"},"type":"array","title":"Labels","default":[]},"likes_count":{"type":"integer","title":"Likes Count","default":0},"dislikes_count":{"type":"integer","title":"Dislikes Count","default":0},"my_vote":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"My Vote"},"review":{"anyOf":[{"$ref":"#/components/schemas/APICustomAgentReview"},{"type":"null"}]},"role":{"items":{"$ref":"#/components/schemas/CustomAgentRole"},"type":"array","title":"Role","default":[]},"is_owner":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Owner"},"author_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author Email"},"data":{"$ref":"#/components/schemas/APICustomAgentData"}},"type":"object","required":["id","name","description","created_at","updated_at","logo_url","data"],"title":"APICustomAgent"},"APICustomAgentData":{"properties":{"prompt":{"type":"string","title":"Prompt","default":""},"preselected_tools":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Preselected Tools"},"available_tools":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Available Tools"},"demo_asset_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Demo Asset Url"},"demo_asset_mime_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Demo Asset Mime Type"},"demo_asset_thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Demo Asset Thumbnail Url"},"demo_asset_status":{"anyOf":[{"$ref":"#/components/schemas/AssistantAssetStatus"},{"type":"null"}]}},"additionalProperties":true,"type":"object","title":"APICustomAgentData"},"APICustomAgentForReview":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"last_edit":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Edit"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"logo_mime_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Mime Type"},"logo_status":{"anyOf":[{"$ref":"#/components/schemas/AssistantAssetStatus"},{"type":"null"}]},"demo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Demo Url"},"demo_mime_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Demo Mime Type"},"is_public_read":{"type":"boolean","title":"Is Public Read","default":false},"publication_status":{"$ref":"#/components/schemas/CustomAgentPublicationStatus","default":"ORIGINAL"},"needs_changes":{"type":"boolean","title":"Needs Changes","default":false},"slug_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug Id"},"created_from_custom_agent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created From Custom Agent Id"},"pending_custom_agent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pending Custom Agent Id"},"pending_needs_changes":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Pending Needs Changes"},"pending_reviewer_comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pending Reviewer Comment"},"posted_custom_agent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Posted Custom Agent Id"},"labels":{"items":{"type":"string"},"type":"array","title":"Labels","default":[]},"likes_count":{"type":"integer","title":"Likes Count","default":0},"dislikes_count":{"type":"integer","title":"Dislikes Count","default":0},"my_vote":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"My Vote"},"review":{"anyOf":[{"$ref":"#/components/schemas/APICustomAgentReview"},{"type":"null"}]},"role":{"items":{"$ref":"#/components/schemas/CustomAgentRole"},"type":"array","title":"Role","default":[]},"is_owner":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Owner"},"author_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author Email"},"data":{"$ref":"#/components/schemas/APICustomAgentData"},"owner_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Email"}},"type":"object","required":["id","name","description","created_at","updated_at","logo_url","data"],"title":"APICustomAgentForReview"},"APICustomAgentLabelsRequest":{"properties":{"labels":{"items":{"type":"string"},"type":"array","title":"Labels"}},"type":"object","required":["labels"],"title":"APICustomAgentLabelsRequest","description":"The assistant's complete label set — this replaces, it does not merge.\n\nSlugs from the vocabulary, not free text: one that names no label is a\nrefusal. On the owner-facing route the replacement is confined to the\nlabels an owner may set, so a reviewer's curation is not something an\nauthor can drop by omitting it."},"APICustomAgentReview":{"properties":{"status":{"$ref":"#/components/schemas/CustomAgentReviewStatus"},"reviewer_comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reviewer Comment"},"requested_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Requested At"},"reviewed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Reviewed At"}},"type":"object","required":["status"],"title":"APICustomAgentReview"},"APICustomAgentReviewApproveRequest":{"properties":{"comment":{"type":"string","title":"Comment","default":""}},"type":"object","title":"APICustomAgentReviewApproveRequest","description":"Optional note from the reviewer; approval needs no justification."},"APICustomAgentReviewAsset":{"properties":{"asset_id":{"type":"string","title":"Asset Id"},"path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Path"},"folder":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder"},"file_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Type"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"missing":{"type":"boolean","title":"Missing","default":false}},"type":"object","required":["asset_id"],"title":"APICustomAgentReviewAsset","description":"An asset a pending assistant's prompt refers to, ready to look at.\n\n``url`` is presigned for *viewing*: no filename is attached, so S3 sends\nno Content-Disposition and a browser renders it in place instead of\nsaving it. It is null for a folder, which has no bytes, and for an id the\nprompt names that no longer resolves — ``missing`` says which."},"APICustomAgentReviewDetail":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"last_edit":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Edit"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"logo_mime_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Mime Type"},"logo_status":{"anyOf":[{"$ref":"#/components/schemas/AssistantAssetStatus"},{"type":"null"}]},"demo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Demo Url"},"demo_mime_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Demo Mime Type"},"is_public_read":{"type":"boolean","title":"Is Public Read","default":false},"publication_status":{"$ref":"#/components/schemas/CustomAgentPublicationStatus","default":"ORIGINAL"},"needs_changes":{"type":"boolean","title":"Needs Changes","default":false},"slug_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug Id"},"created_from_custom_agent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created From Custom Agent Id"},"pending_custom_agent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pending Custom Agent Id"},"pending_needs_changes":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Pending Needs Changes"},"pending_reviewer_comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pending Reviewer Comment"},"posted_custom_agent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Posted Custom Agent Id"},"labels":{"items":{"type":"string"},"type":"array","title":"Labels","default":[]},"likes_count":{"type":"integer","title":"Likes Count","default":0},"dislikes_count":{"type":"integer","title":"Dislikes Count","default":0},"my_vote":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"My Vote"},"review":{"anyOf":[{"$ref":"#/components/schemas/APICustomAgentReview"},{"type":"null"}]},"role":{"items":{"$ref":"#/components/schemas/CustomAgentRole"},"type":"array","title":"Role","default":[]},"is_owner":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Owner"},"author_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author Email"},"data":{"$ref":"#/components/schemas/APICustomAgentData"},"owner_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Email"},"prompt_assets":{"items":{"$ref":"#/components/schemas/APICustomAgentReviewAsset"},"type":"array","title":"Prompt Assets","default":[]},"approve_url":{"type":"string","title":"Approve Url","default":""},"reject_with_comment_url":{"type":"string","title":"Reject With Comment Url","default":""}},"type":"object","required":["id","name","description","created_at","updated_at","logo_url","data"],"title":"APICustomAgentReviewDetail","description":"Everything a reviewer needs to judge one pending assistant.\n\nThe assistant itself — prompt included, unredacted, because a prompt that\ncannot be read cannot be reviewed — plus every asset that prompt refers\nto, in the order the prompt names them."},"APICustomAgentReviewRejectRequest":{"properties":{"comment":{"type":"string","minLength":1,"title":"Comment"}},"type":"object","required":["comment"],"title":"APICustomAgentReviewRejectRequest","description":"Rejecting requires a reason — the author has to know what to fix."},"APICustomAgentVoteRequest":{"properties":{"is_like":{"type":"boolean","title":"Is Like"}},"type":"object","required":["is_like"],"title":"APICustomAgentVoteRequest"},"APICustomAgentWithoutData":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"last_edit":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Edit"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"logo_mime_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Mime Type"},"logo_status":{"anyOf":[{"$ref":"#/components/schemas/AssistantAssetStatus"},{"type":"null"}]},"demo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Demo Url"},"demo_mime_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Demo Mime Type"},"is_public_read":{"type":"boolean","title":"Is Public Read","default":false},"publication_status":{"$ref":"#/components/schemas/CustomAgentPublicationStatus","default":"ORIGINAL"},"needs_changes":{"type":"boolean","title":"Needs Changes","default":false},"slug_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug Id"},"created_from_custom_agent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created From Custom Agent Id"},"pending_custom_agent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pending Custom Agent Id"},"pending_needs_changes":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Pending Needs Changes"},"pending_reviewer_comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pending Reviewer Comment"},"posted_custom_agent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Posted Custom Agent Id"},"labels":{"items":{"type":"string"},"type":"array","title":"Labels","default":[]},"likes_count":{"type":"integer","title":"Likes Count","default":0},"dislikes_count":{"type":"integer","title":"Dislikes Count","default":0},"my_vote":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"My Vote"},"review":{"anyOf":[{"$ref":"#/components/schemas/APICustomAgentReview"},{"type":"null"}]},"role":{"items":{"$ref":"#/components/schemas/CustomAgentRole"},"type":"array","title":"Role","default":[]},"is_owner":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Owner"},"author_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author Email"}},"type":"object","required":["id","name","description","created_at","updated_at","logo_url"],"title":"APICustomAgentWithoutData"},"APILabel":{"properties":{"id":{"type":"string","title":"Id"},"display_name":{"type":"string","title":"Display Name"},"set_by":{"$ref":"#/components/schemas/LabelSetBy"}},"type":"object","required":["id","display_name","set_by"],"title":"APILabel","description":"One entry in the label vocabulary."},"APILabelUpsertRequest":{"properties":{"display_name":{"type":"string","minLength":1,"title":"Display Name"},"set_by":{"$ref":"#/components/schemas/LabelSetBy","default":"REVIEWER"}},"type":"object","required":["display_name"],"title":"APILabelUpsertRequest","description":"Create a label, or rename one / change who may attach it.\n\nThe slug is the path parameter and is never rewritten by this: renaming is\na ``display_name`` change, because the slug is what every existing filter\nand attachment names."},"AafSequenceSourceStatus":{"properties":{"name":{"type":"string","title":"Name"},"umid":{"type":"string","title":"Umid"},"media_kind":{"type":"string","title":"Media Kind"},"locator_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locator Url"},"asset_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Id"},"in_app_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"In App Path"},"match":{"anyOf":[{"type":"string","enum":["user","umid","path","filename"]},{"type":"null"}],"title":"Match"},"candidates":{"items":{"$ref":"#/components/schemas/AafSourceCandidateModel"},"type":"array","title":"Candidates"}},"type":"object","required":["name","umid","media_kind","locator_url","asset_id","in_app_path","match","candidates"],"title":"AafSequenceSourceStatus","description":"One source file an AAF sequence references, and what it resolves to.\n\nA source is one media file, not one master clip: an Avid rush stored as\nOP-Atom is a picture file plus one file per audio track, and the edit uses\nthem separately, so each is listed and linked on its own. ``media_kind``\nsays which of them this is.\n\n``asset_id`` is filled only for a match certain enough to link without\nasking: the MXF file package UMID, or a single full-path hit. Otherwise\n``asset_id`` is null and the possibilities are listed in ``candidates``\nfor the user to pick from. Confirmed choices are sent back to\n``POST /project/original/{asset_id}/convert`` as ``source_assets``."},"AafSequenceSourcesResponse":{"properties":{"sequence_name":{"type":"string","title":"Sequence Name"},"edit_rate":{"type":"number","title":"Edit Rate"},"duration_frames":{"type":"integer","title":"Duration Frames"},"sources":{"items":{"$ref":"#/components/schemas/AafSequenceSourceStatus"},"type":"array","title":"Sources"},"missing_count":{"type":"integer","title":"Missing Count"},"unconfirmed_count":{"type":"integer","title":"Unconfirmed Count"}},"type":"object","required":["sequence_name","edit_rate","duration_frames","sources","missing_count","unconfirmed_count"],"title":"AafSequenceSourcesResponse"},"AafSourceCandidateModel":{"properties":{"asset_id":{"type":"string","title":"Asset Id"},"in_app_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"In App Path"},"original_file_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original File Path"},"match":{"type":"string","enum":["user","umid","path","filename"],"title":"Match"}},"type":"object","required":["asset_id","in_app_path","original_file_path","match"],"title":"AafSourceCandidateModel","description":"An asset a source file might be, with how it was matched."},"AafTargetUrlSource":{"type":"string","enum":["in_app_filename","in_app_path","original_path"],"title":"AafTargetUrlSource"},"AccessRequestCountResponse":{"properties":{"pending_count":{"type":"integer","title":"Pending Count"}},"type":"object","required":["pending_count"],"title":"AccessRequestCountResponse"},"AccessRequestResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"requester_email":{"type":"string","title":"Requester Email"},"target_type":{"type":"string","enum":["asset","chat","custom_agent"],"title":"Target Type"},"target_id":{"type":"string","format":"uuid","title":"Target Id"},"target_name":{"type":"string","title":"Target Name"},"target_file_type":{"anyOf":[{"$ref":"#/components/schemas/FileType"},{"type":"null"}]},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","requester_email","target_type","target_id","target_name","target_file_type","created_at"],"title":"AccessRequestResponse"},"AddPublicLutRequest":{"properties":{"filename":{"type":"string","maxLength":255,"minLength":1,"title":"Filename","description":"File name the LUT is stored under in ``/public/Tellers.ai/LUTs``, ``.cube`` extension included. No directories: use ``folders``."},"folders":{"items":{"type":"string"},"type":"array","maxItems":8,"title":"Folders","description":"Sub-folders of ``/public/Tellers.ai/LUTs`` to store the LUT in, outermost first, e.g. ``[\"Sony\", \"FX3\"]`` or ``[\"Fun\"]``. Missing folders are created. Empty stores it at the top of the library."},"content":{"type":"string","minLength":1,"title":"Content","description":"The .cube file body, verbatim (the format is plain text)."},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"Display title of the asset; defaults to the file name without extension."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Free-text description of the look the LUT applies."},"keywords":{"items":{"type":"string"},"type":"array","title":"Keywords","description":"Search keywords stored on the asset."},"replace":{"type":"boolean","title":"Replace","description":"When a LUT already exists at this path, overwrite its object and metadata instead of failing with 409.","default":false}},"type":"object","required":["filename","content"],"title":"AddPublicLutRequest"},"AddPublicLutResponse":{"properties":{"asset_id":{"type":"string","title":"Asset Id"},"in_app_path":{"type":"string","title":"In App Path"},"file_s3_bucket":{"type":"string","title":"File S3 Bucket"},"file_s3_path":{"type":"string","title":"File S3 Path"},"file_size":{"type":"integer","title":"File Size"},"mime_type":{"type":"string","title":"Mime Type"},"replaced":{"type":"boolean","title":"Replaced","description":"True when an existing LUT at this path was overwritten."}},"type":"object","required":["asset_id","in_app_path","file_s3_bucket","file_s3_path","file_size","mime_type","replaced"],"title":"AddPublicLutResponse"},"AdminOverQuotaResponse":{"properties":{"users":{"items":{"$ref":"#/components/schemas/AdminOverQuotaUser"},"type":"array","title":"Users"},"returned_count":{"type":"integer","title":"Returned Count","description":"How many rows this page holds. A full page means there may be more — ask again with a larger offset."}},"type":"object","required":["users","returned_count"],"title":"AdminOverQuotaResponse"},"AdminOverQuotaUser":{"properties":{"user_id":{"type":"string","format":"uuid","title":"User Id"},"email":{"type":"string","title":"Email"},"file_count":{"type":"integer","title":"File Count"},"used_byte_size":{"type":"integer","title":"Used Byte Size"},"used_gb":{"type":"number","title":"Used Gb"},"quota_gb":{"type":"integer","title":"Quota Gb"},"over_by_byte_size":{"type":"integer","title":"Over By Byte Size"},"over_by_gb":{"type":"number","title":"Over By Gb","description":"What would have to go for them to come back under"},"subscription_type":{"type":"string","title":"Subscription Type","description":"\"Monthly\", \"Yearly\", or \"Free\" for no active subscription"}},"type":"object","required":["user_id","email","file_count","used_byte_size","used_gb","quota_gb","over_by_byte_size","over_by_gb","subscription_type"],"title":"AdminOverQuotaUser"},"AdminSocialAccount":{"properties":{"platform":{"type":"string","title":"Platform"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"\"connected\", \"disconnected\" or \"reauth_required\""}},"type":"object","required":["platform"],"title":"AdminSocialAccount"},"AdminUploadPostProfile":{"properties":{"username":{"type":"string","title":"Username","description":"Upload-Post profile name (a Firebase uid)"},"user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"User Id","description":"The Tellers account it belongs to, or null when no user has that Firebase uid — a profile left behind by a deleted account still takes a slot."},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"connected_accounts":{"items":{"$ref":"#/components/schemas/AdminUploadPostSocialAccount"},"type":"array","title":"Connected Accounts"}},"type":"object","required":["username","connected_accounts"],"title":"AdminUploadPostProfile"},"AdminUploadPostResponse":{"properties":{"plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan"},"profile_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Profile Limit","description":"Profiles the Upload-Post plan allows"},"profile_count":{"type":"integer","title":"Profile Count"},"profiles_remaining":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Profiles Remaining"},"connected_profile_count":{"type":"integer","title":"Connected Profile Count","description":"Profiles with at least one social account connected"},"profiles":{"items":{"$ref":"#/components/schemas/AdminUploadPostProfile"},"type":"array","title":"Profiles"}},"type":"object","required":["profile_count","connected_profile_count","profiles"],"title":"AdminUploadPostResponse"},"AdminUploadPostSocialAccount":{"properties":{"platform":{"type":"string","title":"Platform"},"handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Handle"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"reauth_required":{"type":"boolean","title":"Reauth Required","default":false}},"type":"object","required":["platform"],"title":"AdminUploadPostSocialAccount"},"AdminUserInfoResponse":{"properties":{"user_id":{"type":"string","format":"uuid","title":"User Id"},"email":{"type":"string","title":"Email"},"firebase_uid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Firebase Uid"},"credits":{"type":"number","title":"Credits","description":"Spendable tellers-token balance, from the grant ledger"},"subscription":{"anyOf":[{"$ref":"#/components/schemas/ApiUserSubscription"},{"type":"null"}],"description":"The active subscription, or null for a free account. A lapsed or unpaid one reads as null here, because that is what it buys."},"storage":{"$ref":"#/components/schemas/AdminUserStorage"},"upload_post":{"$ref":"#/components/schemas/AdminUserUploadPost"}},"type":"object","required":["user_id","email","credits","storage","upload_post"],"title":"AdminUserInfoResponse"},"AdminUserStorage":{"properties":{"file_count":{"type":"integer","title":"File Count","description":"Files this user created, folders excluded. Counted from the asset rows, so a stock clip the library lists but stores nothing for is a file here and no bytes below."},"used_byte_size":{"type":"integer","title":"Used Byte Size","description":"Bytes their assets and renditions occupy, each stored object counted once. Keyframes are not counted: they record no size."},"used_gb":{"type":"number","title":"Used Gb","description":"``used_byte_size`` in GB, 2 decimals"},"quota_gb":{"type":"integer","title":"Quota Gb","description":"What their plan allows, in GB"},"computed_at":{"type":"string","format":"date-time","title":"Computed At","description":"When the total was measured"}},"type":"object","required":["file_count","used_byte_size","used_gb","quota_gb","computed_at"],"title":"AdminUserStorage"},"AdminUserUploadPost":{"properties":{"has_access":{"type":"boolean","title":"Has Access","description":"Whether their subscription lets them publish. Paid-only: a trialing subscription does not carry it."},"profile_created":{"type":"boolean","title":"Profile Created","description":"Whether they hold an Upload-Post profile — the unit Upload-Post bills us on, so it takes one of the plan's profile slots."},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username","description":"Their Upload-Post profile name (their Firebase uid)"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"connected_accounts":{"items":{"$ref":"#/components/schemas/AdminSocialAccount"},"type":"array","title":"Connected Accounts","description":"As last reported by the Upload-Post webhook. GET /admin/upload_post asks the provider live."},"last_webhook_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Webhook At"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["has_access","profile_created","connected_accounts"],"title":"AdminUserUploadPost"},"AgentMessageRequest":{"properties":{"message":{"type":"string","title":"Message","description":"The message to send to the agent"},"chat_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chat Id","description":"Optional chat ID for conversation tracking"},"previous_response_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous Response Id","description":"The ID of the previous response to the model. Use this to create multi-turn conversations."},"llm_verbosity":{"type":"string","enum":["low","medium","high"],"title":"Llm Verbosity","description":"Range of number of tokens that can be generated by the LLM, higher values yield more verbose responses. A value the chosen model does not advertise in `available_llm_models` is ignored.","default":"low"},"llm_reasoning_effort":{"anyOf":[{"type":"string","enum":["none","minimal","low","medium","high","xhigh","max"]},{"type":"null"}],"title":"Llm Reasoning Effort","description":"Controls reasoning effort: higher values yield more precise but slower responses. A value the chosen model does not advertise in `available_llm_models` is ignored.","default":"high"},"priority":{"anyOf":[{"type":"string","enum":["low","default","high","ultra"]},{"type":"null"}],"title":"Priority","description":"Priority level for the response: 'low' (cheaper/slower), 'default' (standard), 'high' (premium/low-latency), or 'ultra' (OpenAI Ultrafast: several times faster output at about 3x the 'high' price). Only levels in the chosen model's `available_priorities` (see GET /) take effect; others fall back to 'default'.","default":"default"},"context":{"anyOf":[{"$ref":"#/components/schemas/AppContext"},{"type":"null"}],"description":"The app context when the response is sent."},"llm_model":{"type":"string","enum":["gpt-6-astra","gpt-6.1-sol","gpt-6.1-terra","gpt-6-sol","gpt-6-luna","gpt-5.6-sol","gpt-5.6-terra","gpt-5.6-luna","gpt-5.5-2026-04-23","gpt-5.5-pro-2026-04-23","gpt-5.4-pro-2026-03-05","gpt-5.4","gpt-5.4-mini","gpt-5.3-codex","gpt-5.2-2025-12-11","gpt-5-mini-2025-08-07","gpt-5-nano"],"title":"Llm Model","description":"The model to use to generate the response.","default":"gpt-6-luna"},"tools":{"items":{"type":"string"},"type":"array","title":"Tools","description":"The tools to use to generate the response. Defaults to the same as GET /settings (AVAILABLE_AGENT_TOOLS if set, else all tools)."},"custom_agent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Agent Id","description":"The ID of the custom agent to use to generate the response. If not provided, the default custom agent will be used."},"parallel_tool_calls":{"type":"boolean","title":"Parallel Tool Calls","description":"Whether to allow parallel tool calls. Defaults to true. If True, the tool calls will be executed in parallel. If False, the tool calls will be executed sequentially.","default":true},"compaction":{"type":"boolean","title":"Compaction","description":"Whether to enable automatic context cleanup when the selected model supports it. This keeps long conversations manageable.","default":true},"prefer_compaction":{"anyOf":[{"type":"integer","minimum":20000.0},{"type":"null"}],"title":"Prefer Compaction","description":"Preferred input-token size to compact the conversation at, when `compaction` is enabled and the model supports it. A preference, not a guarantee: it is capped at the chosen model's own threshold (`compaction_threshold` in `available_llm_models`), which is also what is used when this is unset, because past that point compaction is what keeps the request inside the context window. Lower it to have long conversations compacted earlier."},"override_llm_verbosity":{"anyOf":[{"type":"string","enum":["low","medium","high"]},{"type":"null"}],"title":"Override Llm Verbosity","description":"Override the verbosity of the LLM, range of number of tokens that can be generated by the LLM, higher values yield more verbose responses."},"override_llm_reasoning_effort":{"anyOf":[{"type":"string","enum":["none","minimal","low","medium","high","xhigh","max"]},{"type":"null"}],"title":"Override Llm Reasoning Effort","description":"Override the reasoning effort of the LLM, controls reasoning effort: higher values yield more precise but slower responses."},"tool_exposure":{"$ref":"#/components/schemas/ToolExposure","description":"How much of each tool the model is shown up front. 'flat_search' (default) defers the parameter schemas behind the model's tool_search tool but keeps every tool name and description visible, because a deferred top-level function still shows both — roughly 10k tokens up front. 'search' groups deferred tools into namespaces, showing only namespace descriptions up front. 'flat' defers nothing — every schema up front as a plain function list, no tool_search, roughly 45k tokens — and is how you rule out tool discovery entirely when the agent does not call a tool you expect it to. Both deferring values fall back to 'flat' on models without tool_search.","default":"flat_search"},"max_tellers_token":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Max Tellers Token","description":"Maximum cumulative Tellers Token budget for the agent run."},"no_interaction":{"type":"boolean","title":"No Interaction","description":"Whether to disable interaction with the agent. If True, the agent will try to generate a response without interacting with the user.","default":false}},"additionalProperties":false,"type":"object","required":["message"],"title":"AgentMessageRequest"},"AgentMessageRequestWithoutNoInteraction":{"properties":{"message":{"type":"string","title":"Message","description":"The message to send to the agent"},"chat_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chat Id","description":"Optional chat ID for conversation tracking"},"previous_response_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous Response Id","description":"The ID of the previous response to the model. Use this to create multi-turn conversations."},"llm_verbosity":{"type":"string","enum":["low","medium","high"],"title":"Llm Verbosity","description":"Range of number of tokens that can be generated by the LLM, higher values yield more verbose responses. A value the chosen model does not advertise in `available_llm_models` is ignored.","default":"low"},"llm_reasoning_effort":{"anyOf":[{"type":"string","enum":["none","minimal","low","medium","high","xhigh","max"]},{"type":"null"}],"title":"Llm Reasoning Effort","description":"Controls reasoning effort: higher values yield more precise but slower responses. A value the chosen model does not advertise in `available_llm_models` is ignored.","default":"high"},"priority":{"anyOf":[{"type":"string","enum":["low","default","high","ultra"]},{"type":"null"}],"title":"Priority","description":"Priority level for the response: 'low' (cheaper/slower), 'default' (standard), 'high' (premium/low-latency), or 'ultra' (OpenAI Ultrafast: several times faster output at about 3x the 'high' price). Only levels in the chosen model's `available_priorities` (see GET /) take effect; others fall back to 'default'.","default":"default"},"context":{"anyOf":[{"$ref":"#/components/schemas/AppContext"},{"type":"null"}],"description":"The app context when the response is sent."},"llm_model":{"type":"string","enum":["gpt-6-astra","gpt-6.1-sol","gpt-6.1-terra","gpt-6-sol","gpt-6-luna","gpt-5.6-sol","gpt-5.6-terra","gpt-5.6-luna","gpt-5.5-2026-04-23","gpt-5.5-pro-2026-04-23","gpt-5.4-pro-2026-03-05","gpt-5.4","gpt-5.4-mini","gpt-5.3-codex","gpt-5.2-2025-12-11","gpt-5-mini-2025-08-07","gpt-5-nano"],"title":"Llm Model","description":"The model to use to generate the response.","default":"gpt-6-luna"},"tools":{"items":{"type":"string"},"type":"array","title":"Tools","description":"The tools to use to generate the response. Defaults to the same as GET /settings (AVAILABLE_AGENT_TOOLS if set, else all tools)."},"custom_agent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Agent Id","description":"The ID of the custom agent to use to generate the response. If not provided, the default custom agent will be used."},"parallel_tool_calls":{"type":"boolean","title":"Parallel Tool Calls","description":"Whether to allow parallel tool calls. Defaults to true. If True, the tool calls will be executed in parallel. If False, the tool calls will be executed sequentially.","default":true},"compaction":{"type":"boolean","title":"Compaction","description":"Whether to enable automatic context cleanup when the selected model supports it. This keeps long conversations manageable.","default":true},"prefer_compaction":{"anyOf":[{"type":"integer","minimum":20000.0},{"type":"null"}],"title":"Prefer Compaction","description":"Preferred input-token size to compact the conversation at, when `compaction` is enabled and the model supports it. A preference, not a guarantee: it is capped at the chosen model's own threshold (`compaction_threshold` in `available_llm_models`), which is also what is used when this is unset, because past that point compaction is what keeps the request inside the context window. Lower it to have long conversations compacted earlier."},"override_llm_verbosity":{"anyOf":[{"type":"string","enum":["low","medium","high"]},{"type":"null"}],"title":"Override Llm Verbosity","description":"Override the verbosity of the LLM, range of number of tokens that can be generated by the LLM, higher values yield more verbose responses."},"override_llm_reasoning_effort":{"anyOf":[{"type":"string","enum":["none","minimal","low","medium","high","xhigh","max"]},{"type":"null"}],"title":"Override Llm Reasoning Effort","description":"Override the reasoning effort of the LLM, controls reasoning effort: higher values yield more precise but slower responses."},"tool_exposure":{"$ref":"#/components/schemas/ToolExposure","description":"How much of each tool the model is shown up front. 'flat_search' (default) defers the parameter schemas behind the model's tool_search tool but keeps every tool name and description visible, because a deferred top-level function still shows both — roughly 10k tokens up front. 'search' groups deferred tools into namespaces, showing only namespace descriptions up front. 'flat' defers nothing — every schema up front as a plain function list, no tool_search, roughly 45k tokens — and is how you rule out tool discovery entirely when the agent does not call a tool you expect it to. Both deferring values fall back to 'flat' on models without tool_search.","default":"flat_search"},"max_tellers_token":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Max Tellers Token","description":"Maximum cumulative Tellers Token budget for the agent run."}},"additionalProperties":false,"type":"object","required":["message"],"title":"AgentMessageRequestWithoutNoInteraction"},"AgentMessageSubmitResponse":{"properties":{"chat_id":{"type":"string","title":"Chat Id"},"pending_id":{"type":"string","title":"Pending Id","description":"Id of this message in the chat's ``tellers.user_message`` events, which say when it is applied, started, or dropped."},"mode":{"type":"string","enum":["started","queued"],"title":"Mode","description":"``started``: the chat was idle and a turn started with this message. ``queued``: a turn is running; the message is handed to it at the next tool call (``tellers.user_message`` status ``applied``), or opens the next turn when this one ends first (status ``started``)."},"stream_cursor":{"type":"string","title":"Stream Cursor","description":"Stream entry id to subscribe from (``subscribe_chat`` ``after`` on the user websocket, or ``last_event_id`` on ``GET /agent/response``) to see every event of this message's run without a gap."}},"type":"object","required":["chat_id","pending_id","mode","stream_cursor"],"title":"AgentMessageSubmitResponse","description":"Where a message sent to a chat went."},"AgentToolCatalogEntry":{"properties":{"id":{"type":"string","title":"Id"},"description":{"type":"string","title":"Description"},"displayName":{"type":"string","title":"Displayname"},"displayDescription":{"type":"string","title":"Displaydescription"},"displayCostModel":{"type":"string","title":"Displaycostmodel"},"inputSchema":{"additionalProperties":true,"type":"object","title":"Inputschema"},"outputSchema":{"additionalProperties":true,"type":"object","title":"Outputschema"}},"type":"object","required":["id","description","displayName","displayDescription","displayCostModel","inputSchema","outputSchema"],"title":"AgentToolCatalogEntry"},"AnalysisConfigAsset":{"properties":{"asset_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Id"},"in_app_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"In App Path"}},"type":"object","required":["asset_id","in_app_path"],"title":"AnalysisConfigAsset"},"AnalysisConfigOverrideRequest":{"properties":{"config":{"$ref":"#/components/schemas/TellersConfigFile","description":"The configuration to analyse under, as a config file's own contents — not the id of a stored one. It forces itself: it replaces whatever the folder tree resolves rather than merging over it, so nothing inherited survives, including entities the tree contributed. A field left unset falls back to your preferences and then the app defaults, exactly as an unset field in a stored config does — sending only a prompt asks for that prompt at default reasoning, not at some folder's reasoning. merge_strategy is not read here: it says how a stored config combines with its parent folders, and this one has no parents."}},"additionalProperties":false,"type":"object","required":["config"],"title":"AnalysisConfigOverrideRequest","description":"A tellers-config supplied with the request instead of read from a folder."},"AnalysisPreflightResponse":{"properties":{"asset_id":{"type":"string","title":"Asset Id"},"in_app_path":{"type":"string","title":"In App Path"},"is_folder":{"type":"boolean","title":"Is Folder"},"description_asset_count":{"type":"integer","title":"Description Asset Count"},"transcript_asset_count":{"type":"integer","title":"Transcript Asset Count"},"config":{"$ref":"#/components/schemas/TellersConfigFile"},"config_assets":{"items":{"$ref":"#/components/schemas/AnalysisConfigAsset"},"type":"array","title":"Config Assets"},"overriding_config_assets":{"items":{"$ref":"#/components/schemas/AnalysisConfigAsset"},"type":"array","title":"Overriding Config Assets"},"overriding_config_assets_truncated":{"type":"boolean","title":"Overriding Config Assets Truncated"}},"type":"object","required":["asset_id","in_app_path","is_folder","description_asset_count","transcript_asset_count","config","config_assets","overriding_config_assets","overriding_config_assets_truncated"],"title":"AnalysisPreflightResponse"},"ApiMediaChunk":{"properties":{"description_id":{"type":"string","title":"Description Id"},"description":{"type":"string","title":"Description"},"time_range":{"$ref":"#/components/schemas/TimeRange"}},"type":"object","required":["description_id","description","time_range"],"title":"ApiMediaChunk"},"ApiProjectOtio":{"properties":{"right":{"$ref":"#/components/schemas/GroupRights"},"authors_ids":{"items":{"type":"string"},"type":"array","title":"Authors Ids"},"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"updated_at":{"type":"number","title":"Updated At"},"created_at":{"type":"number","title":"Created At"},"data":{"additionalProperties":true,"type":"object","title":"Data"},"image_id":{"type":"string","title":"Image Id"},"can_edit":{"type":"boolean","title":"Can Edit"},"is_public_read":{"type":"boolean","title":"Is Public Read","deprecated":true}},"type":"object","required":["right","authors_ids","id","title","description","updated_at","created_at","data","image_id","can_edit","is_public_read"],"title":"ApiProjectOtio"},"ApiPromoOffer":{"properties":{"kind":{"$ref":"#/components/schemas/ApiPromoOfferKind","description":"Which offer applies."},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At","description":"UTC ISO-8601 end of the offer; null for `top_up_tokens` and `top_up_storage`, which have no window."},"bonus_token_percent":{"type":"integer","title":"Bonus Token Percent","description":"Extra tokens granted with the first invoice, as a percent of the chosen plan's monthly tokens.","default":0},"discount_percent":{"type":"integer","title":"Discount Percent","description":"Percent off the first invoice of the plan change.","default":0},"pricing_tiers":{"items":{"type":"string"},"type":"array","title":"Pricing Tiers","description":"Catalog plan `tier_id`s the offer applies to."}},"type":"object","required":["kind"],"title":"ApiPromoOffer"},"ApiPromoOfferKind":{"type":"string","enum":["new_user","low_balance","monthly_to_yearly","yearly_upgrade","top_up_tokens","top_up_storage"],"title":"ApiPromoOfferKind"},"ApiPromoOfferResponse":{"properties":{"offer":{"anyOf":[{"$ref":"#/components/schemas/ApiPromoOffer"},{"type":"null"}],"description":"The user's current offer, or null when none applies."}},"type":"object","title":"ApiPromoOfferResponse"},"ApiTimeBasedMediaDescription":{"properties":{"chunks":{"items":{"$ref":"#/components/schemas/ApiMediaChunk"},"type":"array","title":"Chunks","default":[]}},"type":"object","title":"ApiTimeBasedMediaDescription"},"ApiUser":{"properties":{"firebase_uid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Firebase Uid"},"email":{"type":"string","title":"Email"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"job_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Title"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"},"profile_pic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile Pic"},"created_at_str":{"type":"string","title":"Created At Str","description":"``created_at`` as UTC ISO-8601 ending in Z (e.g. for debugging / clients)."},"last_seen_at_str":{"type":"string","title":"Last Seen At Str","description":"``last_seen_at`` as UTC ISO-8601 ending in Z."},"updated_at_str":{"type":"string","title":"Updated At Str","description":"``updated_at`` as UTC ISO-8601 ending in Z."},"credits":{"type":"number","title":"Credits","description":"Spendable balance from grants (`get_token`), not legacy columns."},"storage_quota_gb":{"type":"integer","title":"Storage Quota Gb","description":"Total storage quota available to the user in GB."},"storage_used_gb":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Storage Used Gb","description":"Gigabytes this user's assets and their renditions occupy, counting each stored object once and rounded to two decimals. The same unit as ``storage_quota_gb``, so the pair reads directly as \"3.4 of 5 GB\". Null when no total has been computed for the account yet. Read from a cache refreshed hourly, so it can lag a worker that has just written a proxy."},"subscription":{"anyOf":[{"$ref":"#/components/schemas/ApiUserSubscription"},{"type":"null"}]},"role":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Role","description":"Role flags for roles held by the user. Missing roles are omitted."},"user_preferences":{"$ref":"#/components/schemas/UserPreferences","description":"Persisted user preferences returned with the user profile."}},"type":"object","required":["firebase_uid","email","company","first_name","job_title","last_name","profile_pic","created_at_str","last_seen_at_str","updated_at_str","credits","storage_quota_gb","subscription","user_preferences"],"title":"ApiUser"},"ApiUserSubscription":{"properties":{"type":{"type":"string","enum":["Monthly","Yearly","Enterprise"],"title":"Type","description":"User-facing subscription cadence label. Enterprise is a plan set up by the Tellers team, billed outside the app: it unlocks every feature and cannot be changed or cancelled from the app."},"tier":{"$ref":"#/components/schemas/SubscriptionTier","description":"Subscription tier. Subscriptions that predate tiers are reported as basic."},"pricing_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pricing Tier","description":"Billing catalog plan `tier_id` the subscription is on (for example `monthly` or `pro_yearly`), including existing subscribers on retired prices; null when it matches no catalog plan."},"can_configure_tokens":{"type":"boolean","title":"Can Configure Tokens","description":"True when the user can buy extra tokens on top of the plan (expert only)."},"monthly_tokens":{"type":"number","title":"Monthly Tokens","description":"Subscription token amount available each month."},"storage_quota_gb":{"type":"integer","title":"Storage Quota Gb","description":"Total storage quota available to the user in GB."},"pricing":{"items":{"$ref":"#/components/schemas/ApiUserSubscriptionPricingLine"},"type":"array","title":"Pricing","description":"Current Stripe subscription price lines with price id and quantity."},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency","description":"Lowercase ISO 4217 code the subscription is billed in. Stripe can't change it, so plan changes are priced in it. Null for a subscription not synced since this was added."},"cancel_at_period_end":{"type":"boolean","title":"Cancel At Period End","description":"True when Stripe will cancel the subscription at period end.","default":false},"cancel_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cancel At","description":"UTC ISO-8601 time when Stripe will cancel the subscription."},"current_period_end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Period End","description":"UTC ISO-8601 end of the current subscription period."},"tokens_renew_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tokens Renew At","description":"UTC ISO-8601 time the plan's monthly tokens are next granted: the renewal for a monthly plan, the next monthly drop for a yearly one. Null when no further grant is due (e.g. the subscription is set to cancel first)."},"latest_payment_issue":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Latest Payment Issue","description":"When set, an invoice needs payment or customer action (e.g. 3DS). Fields may include invoice_id, invoice_status, hosted_invoice_url, customer_action_url."}},"type":"object","required":["type","tier","can_configure_tokens","monthly_tokens","storage_quota_gb"],"title":"ApiUserSubscription"},"ApiUserSubscriptionPricingLine":{"properties":{"id":{"type":"string","title":"Id","description":"Stripe price id for this subscription line."},"quantity":{"type":"integer","title":"Quantity","description":"Quantity for this Stripe price line."}},"type":"object","required":["id","quantity"],"title":"ApiUserSubscriptionPricingLine"},"AppContext":{"properties":{"current_playback_time":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Current Playback Time","description":"The current playback time in the project when the response is sent."},"on_screen_asset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"On Screen Asset","description":"The id of the asset on screen when the response is sent."},"on_screen_project":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"On Screen Project","description":"The id of the project on screen when the response is sent."},"selected_clips":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Selected Clips","description":"The ids of the clips selected when the response is sent."},"selected_assets":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Selected Assets","description":"The ids of the assets selected when the response is sent."},"selected_projects":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Selected Projects","description":"The ids of the projects selected when the response is sent."}},"additionalProperties":false,"type":"object","title":"AppContext"},"AppSettings":{"properties":{"maintenance_mode":{"type":"boolean","title":"Maintenance Mode"},"cost_wan_ai_hd_generation":{"type":"number","title":"Cost Wan Ai Hd Generation"},"cost_wan_ai_sd_generation":{"type":"number","title":"Cost Wan Ai Sd Generation"},"social_publishing_platforms":{"items":{"$ref":"#/components/schemas/SocialPublishingPlatformSetting"},"type":"array","title":"Social Publishing Platforms"},"project_aspect_ratios":{"items":{"$ref":"#/components/schemas/AspectRatio"},"type":"array","title":"Project Aspect Ratios"},"available_agent_tools":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Available Agent Tools"},"available_llm_models":{"items":{"$ref":"#/components/schemas/AvailableModel"},"type":"array","title":"Available Llm Models"},"llm_model_tiers":{"$ref":"#/components/schemas/LlmModelTier"},"presets":{"items":{"$ref":"#/components/schemas/TellersPreset"},"type":"array","title":"Presets"},"default_preset":{"type":"string","title":"Default Preset","description":"Name of the preset in `presets` that a request with no LLM settings runs under. Seed a fresh chat from this preset rather than hard-coding a copy of its values: a copy is what drifts off the default when the preset changes."},"parallel_tool_calls":{"type":"boolean","title":"Parallel Tool Calls"},"disabled_effects":{"items":{"type":"string"},"type":"array","title":"Disabled Effects","description":"Timeline effects the user may not pick, as the agent may not add them: an effect name (`Stabilize`) or one parameter of one (`Transform.follow`). Leave them out of the effect pickers; one already on a clip or track still shows and can be configured, disabled or deleted."}},"type":"object","required":["maintenance_mode","cost_wan_ai_hd_generation","cost_wan_ai_sd_generation","social_publishing_platforms","project_aspect_ratios","available_agent_tools","available_llm_models","llm_model_tiers","presets","default_preset","parallel_tool_calls","disabled_effects"],"title":"AppSettings"},"ApproveRequest":{"properties":{"id_token":{"type":"string","minLength":1,"title":"Id Token"},"client_id":{"type":"string","minLength":1,"title":"Client Id"},"redirect_uri":{"type":"string","minLength":1,"title":"Redirect Uri"},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"},"code_challenge":{"type":"string","minLength":43,"title":"Code Challenge"},"code_challenge_method":{"type":"string","title":"Code Challenge Method","default":"S256"},"resource":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resource"}},"type":"object","required":["id_token","client_id","redirect_uri","code_challenge"],"title":"ApproveRequest"},"AspectRatio":{"type":"string","enum":["16_9","9_16","4_5","1_1","2_3","1.91_1","1.43_1"],"title":"AspectRatio"},"AssetAnalysisSettings":{"properties":{"reasoning":{"anyOf":[{"type":"string","enum":["low","medium","high"]},{"type":"null"}],"title":"Reasoning"},"fps":{"anyOf":[{"type":"number","maximum":24.0,"minimum":1.0},{"type":"null"}],"title":"Fps"},"entity_quality":{"anyOf":[{"type":"string","enum":["low","medium","high"]},{"type":"null"}],"title":"Entity Quality"},"asset_quality":{"anyOf":[{"type":"string","enum":["low","medium","high"]},{"type":"null"}],"title":"Asset Quality"},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt"},"long_video":{"anyOf":[{"$ref":"#/components/schemas/LongVideoAnalysisSettings"},{"type":"null"}],"description":"Overrides for describing long videos. The fields above apply to short videos, and to long ones when this is disabled."}},"additionalProperties":false,"type":"object","title":"AssetAnalysisSettings"},"AssetComment":{"properties":{"id":{"type":"string","title":"Id"},"author_id":{"type":"string","title":"Author Id","description":"The author's user id."},"author_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author Email","description":"The author's email; null once their account is gone."},"text":{"type":"string","title":"Text"},"created_at":{"type":"string","title":"Created At","description":"ISO 8601, UTC."},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At","description":"ISO 8601, UTC; null until the author edits it."},"timecode_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Timecode Seconds","description":"Where in the media the comment points, if anywhere."},"is_mine":{"type":"boolean","title":"Is Mine","description":"Whether the caller wrote it."}},"type":"object","required":["id","author_id","text","created_at","is_mine"],"title":"AssetComment","description":"One comment on an asset."},"AssetCommentCreateRequest":{"properties":{"text":{"type":"string","maxLength":10000,"minLength":1,"title":"Text"},"timecode_seconds":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Timecode Seconds"}},"type":"object","required":["text"],"title":"AssetCommentCreateRequest"},"AssetCommentUpdateRequest":{"properties":{"text":{"anyOf":[{"type":"string","maxLength":10000,"minLength":1},{"type":"null"}],"title":"Text"},"timecode_seconds":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Timecode Seconds"}},"type":"object","title":"AssetCommentUpdateRequest"},"AssetDescriptionGenerationMetadataResponse":{"properties":{"description_id":{"type":"string","title":"Description Id"},"asset_id":{"type":"string","title":"Asset Id"},"start_time_ms":{"type":"integer","title":"Start Time Ms"},"end_time_ms":{"type":"integer","title":"End Time Ms"},"generation_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Generation Metadata"}},"type":"object","required":["description_id","asset_id","start_time_ms","end_time_ms","generation_metadata"],"title":"AssetDescriptionGenerationMetadataResponse"},"AssetDetails":{"properties":{"info":{"$ref":"#/components/schemas/AssetInfo"},"transcription":{"anyOf":[{"$ref":"#/components/schemas/TimedTranscript"},{"type":"null"}]},"chunked_descriptions":{"anyOf":[{"$ref":"#/components/schemas/ApiTimeBasedMediaDescription"},{"type":"null"}]}},"type":"object","required":["info"],"title":"AssetDetails"},"AssetDownloadUrlBatchItem":{"properties":{"asset_id":{"type":"string","title":"Asset Id"},"error":{"type":"boolean","title":"Error"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"download":{"anyOf":[{"$ref":"#/components/schemas/AssetDownloadUrlResponse"},{"type":"null"}]}},"type":"object","required":["asset_id","error"],"title":"AssetDownloadUrlBatchItem","description":"Resolved download payload for one asset in a batch request."},"AssetDownloadUrlBatchRequest":{"properties":{"asset_ids":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Asset Ids","description":"Asset IDs to resolve."},"quality":{"type":"string","enum":["480p","720p","1080p","original","highest","lowest","thumbnail"],"title":"Quality","default":"720p"},"player_compatible":{"type":"boolean","title":"Player Compatible","default":true},"frame_time":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Frame Time"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id"}},"type":"object","required":["asset_ids"],"title":"AssetDownloadUrlBatchRequest","description":"Request body for resolving multiple asset download URLs."},"AssetDownloadUrlBatchResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AssetDownloadUrlBatchItem"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"AssetDownloadUrlBatchResponse"},"AssetDownloadUrlResponse":{"properties":{"url":{"type":"string","title":"Url"},"expiredIn":{"type":"integer","title":"Expiredin","description":"Seconds the URL is expected to work: matches S3 presign expiry when applicable; for Pexels/CDN links this is a recommended refresh interval, not a hard protocol expiry."},"current_time":{"type":"string","format":"date-time","title":"Current Time","description":"The current time when the URL was generated"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"The request ID when the URL was generated"}},"type":"object","required":["url","expiredIn"],"title":"AssetDownloadUrlResponse","description":"Media URL and how long it should remain valid (for refresh / UrlSource lifecycle)."},"AssetFileUrlBatchItem":{"properties":{"asset_id":{"type":"string","title":"Asset Id"},"error":{"type":"boolean","title":"Error"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"file":{"anyOf":[{"$ref":"#/components/schemas/AssetFileUrlResponse"},{"type":"null"}]}},"type":"object","required":["asset_id","error"],"title":"AssetFileUrlBatchItem"},"AssetFileUrlBatchRequest":{"properties":{"asset_ids":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Asset Ids","description":"IDs of text, PDF, LUT or font assets to resolve."}},"type":"object","required":["asset_ids"],"title":"AssetFileUrlBatchRequest"},"AssetFileUrlBatchResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AssetFileUrlBatchItem"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"AssetFileUrlBatchResponse"},"AssetFileUrlResponse":{"properties":{"url":{"type":"string","title":"Url"},"expired_in":{"type":"integer","title":"Expired In","description":"Seconds the presigned URL stays valid."},"file_type":{"$ref":"#/components/schemas/FileType"},"mime_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mime Type"},"filename":{"type":"string","title":"Filename","description":"The asset's file name, for saving the download under."}},"type":"object","required":["url","expired_in","file_type","filename"],"title":"AssetFileUrlResponse","description":"Presigned URL to an asset's uploaded file."},"AssetFrameRef":{"properties":{"asset_id":{"type":"string","title":"Asset Id","description":"The asset to take the frame from."},"timestamp_seconds":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Timestamp Seconds","description":"Which frame to take, in seconds, when the asset is a video. Ignored if `is_last_frame` is true. Defaults to the first frame."},"is_last_frame":{"type":"boolean","title":"Is Last Frame","description":"Take the asset's final frame, ignoring `timestamp_seconds`.","default":false},"crop":{"anyOf":[{"$ref":"#/components/schemas/AssetImageCropRef"},{"type":"null"}],"description":"Optional edge insets to crop before sending the frame to a model."}},"additionalProperties":false,"type":"object","required":["asset_id"],"title":"AssetFrameRef","description":"A single frame of an asset — mirrors the tools' ``AssetFrame``."},"AssetImageCropRef":{"properties":{"crop_l":{"anyOf":[{"type":"number","exclusiveMaximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Crop L"},"crop_r":{"anyOf":[{"type":"number","exclusiveMaximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Crop R"},"crop_t":{"anyOf":[{"type":"number","exclusiveMaximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Crop T"},"crop_b":{"anyOf":[{"type":"number","exclusiveMaximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Crop B"}},"additionalProperties":false,"type":"object","title":"AssetImageCropRef","description":"Optional edge insets — mirrors the tools' ``AssetImageCrop``."},"AssetInfo":{"properties":{"provider":{"$ref":"#/components/schemas/AssetProvider"},"authors":{"items":{"type":"string"},"type":"array","title":"Authors"},"id":{"type":"string","title":"Id"},"path":{"type":"string","title":"Path"},"description":{"type":"string","title":"Description"},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt"},"file_type":{"$ref":"#/components/schemas/FileType"},"mime_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mime Type"},"duration_seconds":{"type":"number","title":"Duration Seconds"},"framerate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Framerate"},"has_audio_track":{"type":"boolean","title":"Has Audio Track"},"linked_assets":{"items":{"$ref":"#/components/schemas/LinkedAsset"},"type":"array","title":"Linked Assets"},"available_download_qualities":{"items":{"type":"string","enum":["480p","720p","1080p","original"]},"type":"array","title":"Available Download Qualities"},"asset_status":{"$ref":"#/components/schemas/AssetStatus"},"processing_status":{"type":"string","enum":["ready","pending","running","failed"],"title":"Processing Status"},"is_processed":{"type":"boolean","title":"Is Processed"},"processing_task":{"anyOf":[{"$ref":"#/components/schemas/AssetProcessingTask"},{"type":"null"}]},"can_edit":{"type":"boolean","title":"Can Edit","default":false},"can_delete":{"type":"boolean","title":"Can Delete","default":false},"can_share":{"type":"boolean","title":"Can Share","default":false},"read_by_chat_ids":{"items":{"type":"string"},"type":"array","title":"Read By Chat Ids"},"edited_by_chat_ids":{"items":{"type":"string"},"type":"array","title":"Edited By Chat Ids"},"preview_frames":{"anyOf":[{"items":{"$ref":"#/components/schemas/PreviewFrame"},"type":"array"},{"type":"null"}],"title":"Preview Frames"}},"type":"object","required":["provider","id","path","description","file_type","duration_seconds","has_audio_track","linked_assets","asset_status","processing_status","is_processed"],"title":"AssetInfo"},"AssetInfosBatchItem":{"properties":{"asset_id":{"type":"string","title":"Asset Id"},"error":{"type":"boolean","title":"Error"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"info":{"anyOf":[{"$ref":"#/components/schemas/AssetMinimalInfoResponse"},{"type":"null"}]}},"type":"object","required":["asset_id","error"],"title":"AssetInfosBatchItem"},"AssetInfosBatchRequest":{"properties":{"asset_ids":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Asset Ids","description":"Asset IDs to fetch minimal info for."}},"type":"object","required":["asset_ids"],"title":"AssetInfosBatchRequest"},"AssetInfosBatchResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AssetInfosBatchItem"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"AssetInfosBatchResponse"},"AssetMinimalInfoResponse":{"properties":{"source_name":{"type":"string","title":"Source Name"},"path":{"type":"string","title":"Path"},"duration_second":{"type":"number","title":"Duration Second"},"file_type":{"$ref":"#/components/schemas/FileType"}},"type":"object","required":["source_name","path","duration_second","file_type"],"title":"AssetMinimalInfoResponse"},"AssetPatchRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"destination_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Destination Id","description":"Folder to move the asset into. The library root has no asset row: use the nil UUID 00000000-0000-0000-0000-000000000000 to move to the root."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"authors":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Authors","description":"Who made the media, as credited. Replaces the whole list; pass [] to clear it. Blank names are dropped."},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url","description":"Page the media came from (e.g. its Pexels page). An http(s) URL; pass \"\" to clear it."}},"type":"object","title":"AssetPatchRequest","description":"Partial update: provide at least one.\n\nname: rename; destination_id: move; description: the asset's own text;\nauthors and source_url: who made the media and where it came from."},"AssetPeriodRef":{"properties":{"asset_id":{"type":"string","title":"Asset Id","description":"The asset to take the range from."},"start_time":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Start Time","description":"Range start in seconds. Defaults to 0."},"end_time":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"End Time","description":"Range end in seconds. Ignored if `till_the_end` is true. Defaults to the end of the asset."},"till_the_end":{"type":"boolean","title":"Till The End","description":"Extend to the end of the asset, ignoring `end_time`.","default":false}},"additionalProperties":false,"type":"object","required":["asset_id"],"title":"AssetPeriodRef","description":"A time range within an asset — mirrors the tools' ``AssetPeriod``."},"AssetProcessingTask":{"properties":{"task_type":{"type":"string","title":"Task Type"},"status":{"type":"string","enum":["pending","running","failed"],"title":"Status"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["task_type","status"],"title":"AssetProcessingTask"},"AssetProvider":{"properties":{"name":{"type":"string","title":"Name"},"url":{"type":"string","title":"Url"},"icon_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon Url"}},"type":"object","required":["name","url"],"title":"AssetProvider"},"AssetSceneDescriptionCreateRequest":{"properties":{"start_time_ms":{"type":"integer","minimum":0.0,"title":"Start Time Ms"},"end_time_ms":{"type":"integer","exclusiveMinimum":0.0,"title":"End Time Ms"},"description":{"type":"string","minLength":1,"title":"Description"}},"type":"object","required":["start_time_ms","end_time_ms","description"],"title":"AssetSceneDescriptionCreateRequest"},"AssetSceneDescriptionUpdateRequest":{"properties":{"description":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Description"},"start_time_ms":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Start Time Ms"},"end_time_ms":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"End Time Ms"}},"type":"object","title":"AssetSceneDescriptionUpdateRequest","description":"Partial update: provide at least one. An omitted bound keeps its value."},"AssetSceneDescriptionUpdateResponse":{"properties":{"description_id":{"type":"string","title":"Description Id"},"task_id":{"type":"string","title":"Task Id"}},"type":"object","required":["description_id","task_id"],"title":"AssetSceneDescriptionUpdateResponse"},"AssetSearchResult":{"properties":{"asset_id":{"type":"string","title":"Asset Id"},"score":{"type":"number","title":"Score"},"description":{"type":"string","title":"Description"},"start_time_seconds":{"type":"number","title":"Start Time Seconds"},"end_time_seconds":{"type":"number","title":"End Time Seconds"}},"additionalProperties":false,"type":"object","required":["asset_id","score","description","start_time_seconds","end_time_seconds"],"title":"AssetSearchResult"},"AssetShareResponseOptimized":{"properties":{"groups":{"items":{"$ref":"#/components/schemas/GroupShareInfo"},"type":"array","title":"Groups","default":[]},"validated_users":{"items":{"$ref":"#/components/schemas/ValidatedUserInfo"},"type":"array","title":"Validated Users","default":[]},"pending_invites":{"items":{"$ref":"#/components/schemas/ValidatedUserInfo"},"type":"array","title":"Pending Invites","description":"Emails this was shared with before they had an account. Each becomes a validated user once someone signs in with it."},"is_public_read":{"type":"boolean","title":"Is Public Read","default":false},"can_share":{"type":"boolean","title":"Can Share","default":false}},"type":"object","title":"AssetShareResponseOptimized","description":"Optimized share config: groups and validated_users with rights, plus flags.\n\n``can_share`` is whether the caller may manage sharing: ADMIN, or a share\nwith ``can_share``."},"AssetStatus":{"type":"string","enum":["UPLOADING","UPLOADED","EXPORTING","UPLOAD_FAILED","EXPORT_FAILED"],"title":"AssetStatus"},"AssetTextContentRequest":{"properties":{"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content","description":"The file's complete new text, UTF-8: the body of a text or Markdown file, or the full markup of an SVG. Replaces the whole body. Give this or `diff`, not both."},"diff":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Diff","description":"A standard unified diff against the file as stored, the format `git diff` prints: each hunk starts with its own '@@ -start,count +start,count @@' line, then a leading space for context, '-' to remove, '+' to add; the '--- a/file' and '+++ b/file' header lines are optional. Hunks are placed by line number and their context must match the file exactly, so read the file first. A hunk that does not match is refused with 409 and the error says which line missed. For a long file this is far smaller than resending the whole body. Give this or `content`, not both."}},"additionalProperties":false,"type":"object","title":"AssetTextContentRequest","description":"Exactly one of ``content`` or ``diff``."},"AssetTextContentResponse":{"properties":{"asset_id":{"type":"string","title":"Asset Id"},"byte_size":{"type":"integer","title":"Byte Size"}},"type":"object","required":["asset_id","byte_size"],"title":"AssetTextContentResponse"},"AssetUploadRequest":{"properties":{"content_length":{"type":"integer","title":"Content Length","description":"The content length of the asset in bytes"},"upload_id":{"type":"string","title":"Upload Id"},"source_file":{"$ref":"#/components/schemas/SourceFileInfo"},"file_type":{"$ref":"#/components/schemas/FileType","default":"video"},"parent_asset_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Asset Id","description":"Optional asset_id of a folder to upload into. When set, the file's inAppPath is treated as relative to this folder and the user must have write access to it."},"multipart":{"type":"boolean","title":"Multipart","description":"If true, returns presigned multipart upload URLs instead of a single PUT URL.","default":false},"multipart_part_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Multipart Part Size","description":"Optional multipart part size in bytes (min 5 MiB). If omitted, the server picks one from content_length: 16 MiB, growing for very large files. Read the chosen size from multipart_part_size in the response."}},"type":"object","required":["content_length","upload_id","source_file"],"title":"AssetUploadRequest"},"AssetUploadResponse":{"properties":{"upload_id":{"type":"string","title":"Upload Id"},"asset_id":{"type":"string","format":"uuid","title":"Asset Id"},"presigned_put_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Presigned Put Url"},"presigned_put_urls":{"items":{"type":"string"},"type":"array","title":"Presigned Put Urls"},"multipart_upload_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Multipart Upload Id"},"multipart_part_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Multipart Part Size"},"multipart_part_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Multipart Part Count"}},"type":"object","required":["upload_id","asset_id"],"title":"AssetUploadResponse"},"AssetVisibilityRequest":{"properties":{"is_public_read":{"type":"boolean","title":"Is Public Read"}},"type":"object","required":["is_public_read"],"title":"AssetVisibilityRequest"},"AssistantAssetCompleteRequest":{"properties":{"parts":{"anyOf":[{"items":{"$ref":"#/components/schemas/AssistantAssetCompletedPart"},"type":"array"},{"type":"null"}],"title":"Parts","description":"Optional. Omit (or send no body) to let the server read the uploaded parts from S3, which is authoritative — a client-held ETag goes stale as soon as its part is re-uploaded."}},"type":"object","title":"AssistantAssetCompleteRequest"},"AssistantAssetCompletedPart":{"properties":{"part_number":{"type":"integer","title":"Part Number"},"etag":{"type":"string","title":"Etag"}},"type":"object","required":["part_number","etag"],"title":"AssistantAssetCompletedPart"},"AssistantAssetFromAssetRequest":{"properties":{"role":{"$ref":"#/components/schemas/AssistantAssetRole"},"asset_id":{"type":"string","format":"uuid","title":"Asset Id"}},"type":"object","required":["role","asset_id"],"title":"AssistantAssetFromAssetRequest"},"AssistantAssetKind":{"type":"string","enum":["IMAGE","VIDEO"],"title":"AssistantAssetKind"},"AssistantAssetPartUrl":{"properties":{"part_number":{"type":"integer","title":"Part Number"},"url":{"type":"string","title":"Url"}},"type":"object","required":["part_number","url"],"title":"AssistantAssetPartUrl"},"AssistantAssetPartUrlsRequest":{"properties":{"part_numbers":{"items":{"type":"integer"},"type":"array","maxItems":100,"minItems":1,"title":"Part Numbers","description":"1-based part numbers to presign. Request them in small batches as the upload progresses instead of all at once, so URLs cannot expire mid-upload and can be re-minted on retry."}},"type":"object","required":["part_numbers"],"title":"AssistantAssetPartUrlsRequest"},"AssistantAssetPartUrlsResponse":{"properties":{"urls":{"items":{"$ref":"#/components/schemas/AssistantAssetPartUrl"},"type":"array","title":"Urls"},"expires_in":{"type":"integer","title":"Expires In"}},"type":"object","required":["urls","expires_in"],"title":"AssistantAssetPartUrlsResponse"},"AssistantAssetRole":{"type":"string","enum":["LOGO","DEMO"],"title":"AssistantAssetRole"},"AssistantAssetStatus":{"type":"string","enum":["PROCESSING","READY","OPTIMIZED","FAILED"],"title":"AssistantAssetStatus"},"AssistantAssetUploadRequest":{"properties":{"role":{"$ref":"#/components/schemas/AssistantAssetRole"},"kind":{"$ref":"#/components/schemas/AssistantAssetKind"},"content_length":{"type":"integer","title":"Content Length"},"mime_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mime Type"},"prefer_multipart":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Prefer Multipart","description":"Advisory. Leave unset to let the server choose from content_length. True requests multipart even for a small file (e.g. for resumability on a flaky connection). False is only a preference: uploads too large for a single PUT are sent as multipart anyway. The mode actually used is returned as `multipart`."},"multipart_part_size":{"anyOf":[{"type":"integer","minimum":5242880.0},{"type":"null"}],"title":"Multipart Part Size","description":"Part size in bytes (min 5 MiB, S3's floor for non-final parts). Defaults to a size that keeps the part count within S3's limit."}},"type":"object","required":["role","kind","content_length"],"title":"AssistantAssetUploadRequest"},"AssistantAssetUploadResponse":{"properties":{"assistant_asset_id":{"type":"string","title":"Assistant Asset Id"},"role":{"$ref":"#/components/schemas/AssistantAssetRole"},"multipart":{"type":"boolean","title":"Multipart"},"presigned_put_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Presigned Put Url"},"multipart_upload_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Multipart Upload Id"},"multipart_part_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Multipart Part Size"},"multipart_part_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Multipart Part Count"}},"type":"object","required":["assistant_asset_id","role","multipart"],"title":"AssistantAssetUploadResponse"},"AssistantAssetUploadStatusResponse":{"properties":{"assistant_asset_id":{"type":"string","title":"Assistant Asset Id"},"multipart_upload_id":{"type":"string","title":"Multipart Upload Id"},"part_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Part Size"},"part_count":{"type":"integer","title":"Part Count"},"uploaded_parts":{"items":{"$ref":"#/components/schemas/AssistantAssetUploadedPart"},"type":"array","title":"Uploaded Parts"}},"type":"object","required":["assistant_asset_id","multipart_upload_id","part_count","uploaded_parts"],"title":"AssistantAssetUploadStatusResponse","description":"What S3 has received so far, for resuming an interrupted upload.\n\nETags are deliberately not returned: the client never needs them, and not\nexposing them keeps clients from caching values that go stale on retry."},"AssistantAssetUploadedPart":{"properties":{"part_number":{"type":"integer","title":"Part Number"},"size":{"type":"integer","title":"Size"}},"type":"object","required":["part_number","size"],"title":"AssistantAssetUploadedPart"},"AudioCapability":{"properties":{"models":{"items":{"$ref":"#/components/schemas/AudioModelCapability"},"type":"array","title":"Models"}},"additionalProperties":false,"type":"object","required":["models"],"title":"AudioCapability"},"AudioModelCapability":{"properties":{"id":{"type":"string","title":"Id","description":"Value to pass as `model`."},"tool_id":{"type":"string","title":"Tool Id","description":"The agent tool backing this model. Join to `available_agent_tools` in GET /settings for its display name, description and pricing — kept there rather than duplicated here so there is one source of truth. Several models can share a tool."},"required":{"items":{"type":"string"},"type":"array","title":"Required","description":"Request fields this model cannot do without. Everything else in the request schema is optional."},"min":{"type":"number","title":"Min","description":"Shortest `duration_seconds` accepted, in seconds."},"max":{"type":"number","title":"Max","description":"Longest `duration_seconds` accepted, in seconds."},"max_char":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Char","description":"Longest `prompt` accepted, in characters. None = unbounded."}},"additionalProperties":false,"type":"object","required":["id","tool_id","required","min","max"],"title":"AudioModelCapability","description":"What one audio model accepts, as published by ``GET /tools/models``.\n\nAudio has no spatial dimensions — the only per-model constraint is the\nduration range, and the two models differ by more than an order of\nmagnitude, which a flat request schema cannot express."},"AvailableModel":{"properties":{"name":{"type":"string","title":"Name"},"codename":{"type":"string","title":"Codename"},"compatible_models":{"items":{"type":"string"},"type":"array","title":"Compatible Models"},"options":{"$ref":"#/components/schemas/TellersAvailableOptions"},"available_priorities":{"items":{"type":"string","enum":["low","default","high","ultra"]},"type":"array","title":"Available Priorities"},"pricing_level":{"type":"integer","enum":[1,2,3,4,5],"title":"Pricing Level"},"required_subscription_tier":{"anyOf":[{"$ref":"#/components/schemas/SubscriptionTier"},{"type":"null"}],"description":"Lowest subscription tier that can use this model; null for all."},"subscription_locked":{"type":"boolean","title":"Subscription Locked","description":"True when the caller's plan is below `required_subscription_tier`: show the model as an upgrade, a request with it is refused (402).","default":false},"priority_required_subscription_tiers":{"additionalProperties":{"$ref":"#/components/schemas/SubscriptionTier"},"propertyNames":{"enum":["low","default","high","ultra"]},"type":"object","title":"Priority Required Subscription Tiers","description":"Lowest subscription tier for each of `available_priorities` that needs one (e.g. `ultra`); priorities not listed are open to all."},"locked_priorities":{"items":{"type":"string","enum":["low","default","high","ultra"]},"type":"array","title":"Locked Priorities","description":"Entries of `available_priorities` the caller's plan cannot use: show them as an upgrade, a request with one is refused (402)."}},"type":"object","required":["name","codename","compatible_models","options","available_priorities","pricing_level"],"title":"AvailableModel"},"BackfillAudioRenditionsResponse":{"properties":{"asset_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Asset Ids","description":"Audio assets in this page with no playback copy, ascending. A task was queued for each unless dry_run was set."},"next_after_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Next After Id","description":"Pass as after_id to get the next page. Null once the page came back short, which means the end was reached."},"dry_run":{"type":"boolean","title":"Dry Run"}},"type":"object","required":["asset_ids","dry_run"],"title":"BackfillAudioRenditionsResponse"},"BillingCatalog":{"properties":{"plans":{"items":{"oneOf":[{"$ref":"#/components/schemas/CatalogPlanOneOff"},{"$ref":"#/components/schemas/CatalogPlanSubscription"}],"discriminator":{"propertyName":"kind","mapping":{"one_off_tokens":"#/components/schemas/CatalogPlanOneOff","subscription":"#/components/schemas/CatalogPlanSubscription"}}},"type":"array","title":"Plans"}},"additionalProperties":false,"type":"object","required":["plans"],"title":"BillingCatalog"},"Body_convert_project_original_project_original__asset_id__convert_post":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Title of the created project; defaults to the sequence name"},"source_assets":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"object"},{"type":"null"}],"title":"Source Assets","description":"One-off overrides, as {source UMID or file name: asset id}, for this conversion only. Choices saved through PUT /project/original/{asset_id}/sources are applied anyway; use null to leave a source unlinked."}},"type":"object","title":"Body_convert_project_original_project_original__asset_id__convert_post"},"Body_set_project_original_sources_project_original__asset_id__sources_put":{"properties":{"source_assets":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"object","title":"Source Assets","description":"The asset each source file stands for, as {source UMID or file name: asset id}. Pass null as the asset id to drop a saved choice. Sources left out keep whatever was saved before."}},"type":"object","required":["source_assets"],"title":"Body_set_project_original_sources_project_original__asset_id__sources_put"},"CancelTaskResponse":{"properties":{"task_id":{"type":"string","title":"Task Id"},"previous_state":{"$ref":"#/components/schemas/TaskStatus"},"description":{"type":"string","title":"Description"}},"type":"object","required":["task_id","previous_state","description"],"title":"CancelTaskResponse"},"CatalogCurrencyAmount":{"properties":{"currency":{"type":"string","title":"Currency","description":"Lowercase ISO currency code."},"unit_amount_cents":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Unit Amount Cents","description":"Unit price in cents per displayed unit in this currency; null for tiered prices (see `tiers`)."},"tiers":{"items":{"$ref":"#/components/schemas/CatalogCurrencyTier"},"type":"array","title":"Tiers","description":"Quantity bands in this currency (empty unless the price is tiered)."},"tax_included":{"type":"boolean","title":"Tax Included","description":"True when the amount already includes tax (e.g. EUR with VAT); false when tax is added at checkout (e.g. USD, CAD)."}},"additionalProperties":false,"type":"object","required":["currency","tax_included"],"title":"CatalogCurrencyAmount","description":"What a Stripe price charges in one currency."},"CatalogCurrencyTier":{"properties":{"min_quantity":{"type":"integer","title":"Min Quantity"},"max_quantity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Quantity"},"unit_amount_cents":{"type":"number","title":"Unit Amount Cents","description":"Unit price in cents per displayed unit for this band."}},"additionalProperties":false,"type":"object","required":["min_quantity","unit_amount_cents"],"title":"CatalogCurrencyTier","description":"One quantity band of a tiered price, in one currency."},"CatalogFeature":{"properties":{"text":{"type":"string","title":"Text","description":"User-facing feature/highlight text."},"icon_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon Key","description":"Optional semantic icon key that frontend maps to an icon."}},"additionalProperties":false,"type":"object","required":["text"],"title":"CatalogFeature","description":"Frontend-facing feature/highlight with optional semantic icon key."},"CatalogHighlight":{"properties":{"number":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Number","description":"Optional numeric value to display prominently."},"stripe_price_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Price Id","description":"Optional Stripe price id used by UI when refreshing highlight values."},"text":{"type":"string","title":"Text","description":"Label displayed under/next to the number."}},"additionalProperties":false,"type":"object","required":["text"],"title":"CatalogHighlight","description":"Frontend-facing compact metric shown as number + label."},"CatalogPlanOneOff":{"properties":{"tier_id":{"type":"string","title":"Tier Id"},"display_name":{"type":"string","title":"Display Name","description":"Human-readable plan name for frontend display."},"subtitle":{"type":"string","title":"Subtitle","description":"Optional short subtitle/description displayed under the plan name.","default":""},"cta_text":{"type":"string","title":"Cta Text","description":"Optional call-to-action label shown on the plan button.","default":""},"highlights":{"items":{"$ref":"#/components/schemas/CatalogHighlight"},"type":"array","maxItems":2,"title":"Highlights","description":"Up to two compact highlights for frontend display (number + text)."},"features":{"items":{"$ref":"#/components/schemas/CatalogFeature"},"type":"array","title":"Features","description":"Human-readable feature bullets for this plan (frontend display)."},"enabled":{"type":"boolean","title":"Enabled","default":true},"currencies":{"items":{"type":"string"},"type":"array","title":"Currencies","description":"Lowercase currencies every price of this plan can be charged in; valid values for the checkout `currency` parameter."},"default_items":{"items":{"$ref":"#/components/schemas/PlanLineItem"},"type":"array","title":"Default Items","description":"Suggested default cart rows (empty list when not applicable)."},"pricing":{"$ref":"#/components/schemas/PlanPricing","description":"Priced lines used for preview and checkout."},"kind":{"type":"string","const":"one_off_tokens","title":"Kind","default":"one_off_tokens"}},"additionalProperties":false,"type":"object","required":["tier_id","display_name","default_items","pricing"],"title":"CatalogPlanOneOff","description":"Prepaid token pack."},"CatalogPlanSubscription":{"properties":{"tier_id":{"type":"string","title":"Tier Id"},"display_name":{"type":"string","title":"Display Name","description":"Human-readable plan name for frontend display."},"subtitle":{"type":"string","title":"Subtitle","description":"Optional short subtitle/description displayed under the plan name.","default":""},"cta_text":{"type":"string","title":"Cta Text","description":"Optional call-to-action label shown on the plan button.","default":""},"highlights":{"items":{"$ref":"#/components/schemas/CatalogHighlight"},"type":"array","maxItems":2,"title":"Highlights","description":"Up to two compact highlights for frontend display (number + text)."},"features":{"items":{"$ref":"#/components/schemas/CatalogFeature"},"type":"array","title":"Features","description":"Human-readable feature bullets for this plan (frontend display)."},"enabled":{"type":"boolean","title":"Enabled","default":true},"currencies":{"items":{"type":"string"},"type":"array","title":"Currencies","description":"Lowercase currencies every price of this plan can be charged in; valid values for the checkout `currency` parameter."},"default_items":{"items":{"$ref":"#/components/schemas/PlanLineItem"},"type":"array","title":"Default Items","description":"Suggested default cart rows (empty list when not applicable)."},"pricing":{"$ref":"#/components/schemas/PlanPricing","description":"Priced lines used for preview and checkout."},"kind":{"type":"string","const":"subscription","title":"Kind","default":"subscription"},"tier":{"$ref":"#/components/schemas/SubscriptionTier","description":"Subscription tier this plan belongs to.","default":"basic"},"legacy_price_ids":{"items":{"type":"string"},"type":"array","title":"Legacy Price Ids","description":"Retired Stripe prices that existing subscribers on this plan are still billed on."},"interval":{"anyOf":[{"type":"string","enum":["month","year"]},{"type":"null"}],"title":"Interval"},"interval_upgrade_cta":{"type":"string","title":"Interval Upgrade Cta","description":"Optional call-to-action label for switching subscription interval, e.g. monthly to yearly.","default":""},"quantity_update_cta":{"type":"string","title":"Quantity Update Cta","description":"Optional call-to-action label for changing subscription item quantities.","default":""}},"additionalProperties":false,"type":"object","required":["tier_id","display_name","default_items","pricing"],"title":"CatalogPlanSubscription"},"CatalogPricingLine":{"properties":{"stripe_price_id":{"type":"string","title":"Stripe Price Id"},"display_name":{"type":"string","title":"Display Name","description":"Human-readable label for this Stripe price line (frontend display).","default":""},"unit_amount_cents":{"type":"number","title":"Unit Amount Cents","description":"Effective unit price in cents per displayed unit (e.g. per token). For Stripe prices configured per pack/group, this is normalized using Stripe transform quantity metadata.","default":0.0},"min_quantity":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Min Quantity","description":"Checkout minimum quantity for this price (one-off packs)."},"max_quantity":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Max Quantity","description":"Checkout maximum quantity for this price (one-off packs)."},"tier_pricing_from_stripe":{"type":"boolean","title":"Tier Pricing From Stripe","description":"If true, replace this price line with tier bands fetched from Stripe (subscription only).","default":false},"tiers_mode":{"anyOf":[{"type":"string","enum":["graduated","volume"]},{"type":"null"}],"title":"Tiers Mode","description":"For Stripe tiered prices: `graduated` vs `volume` (Stripe Price `tiers_mode`). Set on each band when `tier_pricing_from_stripe` lines are expanded from Stripe."},"user_can_modify_at_checkout":{"type":"boolean","title":"User Can Modify At Checkout","description":"False when the line is fixed: it must be submitted at its default quantity (e.g. the plan's base price). True when the user picks the quantity within min_quantity/max_quantity.","default":true},"currency_amounts":{"items":{"$ref":"#/components/schemas/CatalogCurrencyAmount"},"type":"array","title":"Currency Amounts","description":"The whole Stripe price in each currency it supports (the fields above stay in the price's main currency)."}},"additionalProperties":false,"type":"object","required":["stripe_price_id"],"title":"CatalogPricingLine","description":"One billable Stripe price on the plan."},"ChatHistoryResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"custom_agent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Agent Id"},"total_tokens":{"type":"number","title":"Total Tokens"},"is_running":{"type":"boolean","title":"Is Running"},"last_read_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Read At","description":"The `created_at` of the newest message the caller has read in this chat. Null when the caller has never read it; such a chat counts as read."},"is_unread":{"type":"boolean","title":"Is Unread","description":"Whether the agent has written a message newer than `last_read_at`. The caller's own messages never make a chat unread. Reading the newest page of `GET /chat/{chat_id}/messages` or calling `POST /chat/{chat_id}/read` clears it.","default":false},"can_write":{"type":"boolean","title":"Can Write","description":"Whether the caller may send messages in the chat, rename it or delete it. False when the chat was only shared with them to view.","default":true},"parent_chat_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Chat Id","description":"For a sub-chat, the main chat that started it; null for a main chat. Sub-chats are not in `GET /chats/list`: list them with `GET /chat/{chat_id}/sub_chats` on their main chat."},"sub_chat_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sub Chat Index","description":"For a sub-chat started from a CSV, the row it works on (0 = first row under the header); null otherwise."},"sub_chat_count":{"type":"integer","title":"Sub Chat Count","description":"How many sub-chats this chat has started.","default":0},"running_sub_chat_count":{"type":"integer","title":"Running Sub Chat Count","description":"How many of this chat's sub-chats are running now.","default":0}},"type":"object","required":["id","name","created_at","updated_at","custom_agent_id","total_tokens","is_running"],"title":"ChatHistoryResponse"},"ChatInfoResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"start_running_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Running At","description":"Set while a turn is running; a stale value means the turn died without clearing it"},"openai_conversation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Openai Conversation Id","description":"OpenAI conversation the chat is continued under. Null for chats that predate conversations or never reached the model."},"llm_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Model"},"total_tokens":{"type":"number","title":"Total Tokens","description":"Tellers tokens charged to the chat so far"},"max_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Tokens"},"max_tokens_per_tour":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Tokens Per Tour"},"is_public_read":{"type":"boolean","title":"Is Public Read"},"assistant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Assistant Id"},"custom_agent_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Custom Agent Id"},"message_count":{"type":"integer","title":"Message Count","description":"Number of rows in the chat's message history"},"members":{"items":{"$ref":"#/components/schemas/ChatMemberEntry"},"type":"array","title":"Members","description":"Users who can reach the chat, with their best right: the owner as ADMIN, people it is shared with, and members of groups it is shared with"},"response_ids":{"items":{"$ref":"#/components/schemas/ChatResponseIdEntry"},"type":"array","title":"Response Ids","description":"Distinct OpenAI response ids on the chat's messages, oldest first. Messages stored before the id was recorded carry none and are not reported here."}},"type":"object","required":["id","total_tokens","is_public_read","message_count","members","response_ids"],"title":"ChatInfoResponse"},"ChatMemberEntry":{"properties":{"email":{"type":"string","title":"Email","description":"Email of a user who can reach the chat"},"right":{"type":"string","title":"Right","description":"Right the chat's group grants them: ADMIN, WRITE or READ"}},"type":"object","required":["email","right"],"title":"ChatMemberEntry"},"ChatMessageAgentResponse":{"properties":{"type":{"type":"string","const":"agent","title":"Type","default":"agent"},"id":{"type":"string","title":"Id"},"agent_message":{"additionalProperties":true,"type":"object","title":"Agent Message"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","agent_message","created_at"],"title":"ChatMessageAgentResponse"},"ChatMessageUserResponse":{"properties":{"type":{"type":"string","const":"user","title":"Type","default":"user"},"id":{"type":"string","title":"Id"},"user_message":{"type":"string","title":"User Message"},"enabled_tools":{"items":{"type":"string"},"type":"array","title":"Enabled Tools"},"verbosity":{"type":"string","title":"Verbosity"},"reasoning_effort":{"type":"string","title":"Reasoning Effort"},"pricing_level":{"type":"integer","enum":[1,2,3,4,5],"title":"Pricing Level"},"llm_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Model"},"priority":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Priority"},"parallel_tool_calls":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Parallel Tool Calls"},"max_tellers_token":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Tellers Token"},"prefer_compaction":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Prefer Compaction","description":"The preferred compaction threshold the message was sent with, as `prefer_compaction` in the agent message request. Null when it was sent without one -- the model's own threshold applied -- and on messages written before the settings were recorded at all."},"llm_settings":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Llm Settings","description":"The LLM settings the message was sent with that have no field of their own above -- `tool_exposure`, `compaction` and the like -- keyed by their name in the agent message request. Restoring the composer means the fields above plus this. It holds no value that is already a field, so nothing here can disagree with them. Null on messages written before the column existed, which ran under whatever these settings defaulted to at the time."},"context":{"additionalProperties":true,"type":"object","title":"Context"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","user_message","enabled_tools","verbosity","reasoning_effort","pricing_level","llm_model","priority","parallel_tool_calls","max_tellers_token","context","created_at"],"title":"ChatMessageUserResponse"},"ChatResponseIdEntry":{"properties":{"response_id":{"type":"string","title":"Response Id","description":"OpenAI response id recorded on the chat's messages"},"first_seen_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Seen At","description":"Creation time of the oldest message carrying this id"},"last_seen_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Seen At","description":"Creation time of the newest message carrying this id"},"message_count":{"type":"integer","title":"Message Count","description":"Number of chat messages stored under this response id"}},"type":"object","required":["response_id","message_count"],"title":"ChatResponseIdEntry"},"ChatShareRequest":{"properties":{"group_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Group Id"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"}},"type":"object","title":"ChatShareRequest","description":"One grantee of a chat: exactly one of ``group_id`` or ``email``."},"ChatToolUsage":{"properties":{"tool_name":{"type":"string","title":"Tool Name"},"calls":{"type":"integer","title":"Calls"},"tokens_used":{"type":"number","title":"Tokens Used"}},"type":"object","required":["tool_name","calls","tokens_used"],"title":"ChatToolUsage"},"ChatUsageBreakdown":{"properties":{"llm_calls":{"type":"integer","title":"Llm Calls","default":0},"input_tokens_uncached":{"type":"integer","title":"Input Tokens Uncached","default":0},"input_tokens_cached":{"type":"integer","title":"Input Tokens Cached","default":0},"cache_write_tokens":{"type":"integer","title":"Cache Write Tokens","default":0},"output_tokens":{"type":"integer","title":"Output Tokens","default":0},"reasoning_tokens":{"type":"integer","title":"Reasoning Tokens","default":0},"system_prompt_tokens":{"type":"integer","title":"System Prompt Tokens","default":0},"assistant_prompt_tokens":{"type":"integer","title":"Assistant Prompt Tokens","default":0},"project_state_tokens":{"type":"integer","title":"Project State Tokens","default":0},"conversation_history_tokens":{"type":"integer","title":"Conversation History Tokens","default":0},"user_message_tokens":{"type":"integer","title":"User Message Tokens","default":0},"tool_result_tokens":{"type":"integer","title":"Tool Result Tokens","default":0},"tool_schema_tokens":{"type":"integer","title":"Tool Schema Tokens","default":0},"timeline_mutations":{"type":"integer","title":"Timeline Mutations","default":0},"llm_calls_per_timeline_mutation":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Llm Calls Per Timeline Mutation"},"complete":{"type":"boolean","title":"Complete","default":true}},"type":"object","title":"ChatUsageBreakdown","description":"Where a chat's tokens went, as raw model tokens rather than charges.\n\nThe first four counts come from OpenAI; the ``*_tokens`` counts below them\nare our own tiktoken measurements of the parts we compose the prompt from,\nwhich is the only way to attribute a cost to tool schemas, project state or\nreplayed history — the API reports the input as one number.\n\n``complete`` is false when the chat contains calls made before these counts\nwere recorded. The numbers are then a floor for the chat, not its total."},"ChatUsageResponse":{"properties":{"chat_id":{"type":"string","title":"Chat Id"},"chat_tokens_used":{"type":"number","title":"Chat Tokens Used"},"tools_tokens_used":{"type":"number","title":"Tools Tokens Used"},"sub_chats_tokens_used":{"type":"number","title":"Sub Chats Tokens Used","description":"What this chat's sub-chats spent, agent and tools together. Already counted in `total_tokens_used`; `chat_tokens_used`, `tools` and `breakdown` cover this chat only.","default":0.0},"sub_chat_count":{"type":"integer","title":"Sub Chat Count","description":"How many sub-chats this chat has started.","default":0},"total_tokens_used":{"type":"number","title":"Total Tokens Used","description":"This chat's spend plus its sub-chats'."},"tools":{"items":{"$ref":"#/components/schemas/ChatToolUsage"},"type":"array","title":"Tools"},"breakdown":{"$ref":"#/components/schemas/ChatUsageBreakdown"}},"type":"object","required":["chat_id","chat_tokens_used","tools_tokens_used","total_tokens_used","tools"],"title":"ChatUsageResponse"},"CleanupExpiredMultipartUploadsResponse":{"properties":{"cleaned_count":{"type":"integer","title":"Cleaned Count"}},"type":"object","required":["cleaned_count"],"title":"CleanupExpiredMultipartUploadsResponse"},"CompleteTaskResponse":{"properties":{"status":{"type":"string","const":"COMPLETE","title":"Status","default":"COMPLETE"},"result":{"anyOf":[{},{"type":"null"}],"title":"Result"}},"type":"object","required":["result"],"title":"CompleteTaskResponse"},"CouponCheckDiscount":{"properties":{"percent_off":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Percent Off","description":"Percent off each eligible line (e.g. 20 for 20%)."},"amount_off_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Amount Off Cents","description":"Fixed amount off the eligible lines' total, in cents of `currency`. Set instead of `percent_off`."},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency","description":"Lowercase ISO currency of `amount_off_cents`."},"duration":{"anyOf":[{"type":"string","enum":["once","repeating","forever"]},{"type":"null"}],"title":"Duration","description":"How many invoices it discounts: the first only, the first `duration_in_months` months, or every one."},"duration_in_months":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration In Months"},"applies_to_price_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Applies To Price Ids","description":"Stripe price ids from GET /billing/catalog this coupon discounts; null when it discounts every line. An empty list means none of the catalog's lines are eligible."}},"type":"object","title":"CouponCheckDiscount","description":"What a valid coupon takes off, to price it the way checkout will."},"CouponCheckResponse":{"properties":{"coupon_code":{"type":"string","title":"Coupon Code"},"is_valid":{"type":"boolean","title":"Is Valid"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"discount":{"anyOf":[{"$ref":"#/components/schemas/CouponCheckDiscount"},{"type":"null"}],"description":"Set when the coupon is valid and its discount is known."},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At","description":"UTC time after which the code can no longer be redeemed (the earlier of the promotion code's expiry and the coupon's `redeem_by`); null when it doesn't expire. Also set, with nothing else, when the code has expired. Clients show it in the user's own time zone."},"is_expired":{"type":"boolean","title":"Is Expired","description":"True when the code exists but has expired (`expires_at` says when); `is_valid` is then false and no other detail is given.","default":false}},"type":"object","required":["coupon_code","is_valid","name","description"],"title":"CouponCheckResponse"},"CreateAccessRequest":{"properties":{"target_type":{"type":"string","enum":["asset","chat","custom_agent"],"title":"Target Type"},"target_id":{"type":"string","title":"Target Id"}},"type":"object","required":["target_type","target_id"],"title":"CreateAccessRequest"},"CreateAccountRequest":{"properties":{"email":{"type":"string","title":"Email"},"password":{"anyOf":[{"type":"string","minLength":6},{"type":"null"}],"title":"Password","description":"Password for the new account; a random one is generated if omitted"}},"type":"object","required":["email"],"title":"CreateAccountRequest"},"CreateAccountResponse":{"properties":{"firebase_uid":{"type":"string","title":"Firebase Uid"},"email":{"type":"string","title":"Email"},"created":{"type":"boolean","title":"Created","description":"True if a new Firebase user was created, False if it existed"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password","description":"Password set on the newly created account; null when the Firebase account already existed (its password is left unchanged)"}},"type":"object","required":["firebase_uid","email","created"],"title":"CreateAccountResponse"},"CreateEntityRequest":{"properties":{"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description","default":""},"directory_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Directory Id"}},"type":"object","required":["name"],"title":"CreateEntityRequest"},"CreateFolderRequest":{"properties":{"path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Path"},"parent_asset_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Parent Asset Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},"type":"object","title":"CreateFolderRequest","description":"Either provide path (create at path) or parent_asset_id + name (create under parent)."},"CreateFolderResponse":{"properties":{"id":{"type":"string","title":"Id"},"path":{"type":"string","title":"Path"}},"type":"object","required":["id","path"],"title":"CreateFolderResponse"},"CreateGroupRequest":{"properties":{"name":{"type":"string","title":"Name"}},"type":"object","required":["name"],"title":"CreateGroupRequest"},"CreateGroupResponse":{"properties":{"id":{"type":"string","title":"Id"}},"type":"object","required":["id"],"title":"CreateGroupResponse"},"CustomAgentPublicationStatus":{"type":"string","enum":["ORIGINAL","PENDING","POSTED"],"title":"CustomAgentPublicationStatus","description":"Where a ``ta_custom_agent`` row sits in the publication flow.\n\nAn assistant is ORIGINAL and stays editable for its whole life. Publishing\nfreezes a copy of it as PENDING; approving that copy makes it POSTED and\nretires whichever copy was POSTED before. An assistant can therefore have\na live copy and a copy under review at the same time — which is the point,\nsince otherwise submitting an update would mean taking the live one down."},"CustomAgentReviewStatus":{"type":"string","enum":["REVIEW_PENDING","REVIEW_APPROVED","REVIEW_CHANGE_REQUESTED"],"title":"CustomAgentReviewStatus"},"CustomAgentRole":{"type":"string","enum":["can_read","can_edit","can_share_anyone","can_share_to_users","can_delete"],"title":"CustomAgentRole","description":"What the requesting user is allowed to do with a custom assistant.\n\nReturned as the ``role`` array on assistant responses so the client does not\nhave to re-derive permissions. Mapped from the user's effective group right\n(READ < WRITE < ADMIN), their ``can_share`` and ownership:\n\n- ``can_read``           -> READ (also granted by ownership or public-read)\n- ``can_edit``           -> WRITE/ADMIN\n- ``can_share_anyone``   -> can_share (toggle public-read visibility)\n- ``can_share_to_users`` -> can_share (manage per-user/group shares)\n- ``can_delete``         -> ADMIN (also publish and unpublish)\n\n``can_share`` is ADMIN, or a grant with ``can_share``, as on assets.\n\nA published copy is frozen, so it never carries the write or share roles\nno matter what right the user holds on it: the publisher gets\n``can_read`` and ``can_delete`` (deleting it is how unpublishing works)\nand nothing else."},"CustomAgentShareAddRequest":{"properties":{"group_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Group Id"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"right":{"$ref":"#/components/schemas/GroupRights","description":"READ uses the assistant, WRITE also edits it and sees its prompt, ADMIN also shares and deletes it. VIEW counts as READ. An existing grant to the same group or person is set to this right.","default":"READ"},"can_share":{"type":"boolean","title":"Can Share","description":"Lets the grantee share the assistant onward and make it public, below ADMIN. Publishing still takes ADMIN. Only an ADMIN can grant it. An existing grant is set to this value.","default":false}},"type":"object","title":"CustomAgentShareAddRequest","description":"Grant access to one group (``group_id``) or one person (``email``)."},"CustomAgentShareRemoveRequest":{"properties":{"group_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Group Id"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"}},"type":"object","title":"CustomAgentShareRemoveRequest","description":"Remove the grant to one group (``group_id``) or one person (``email``)."},"CustomAgentVisibilityRequest":{"properties":{"is_public_read":{"type":"boolean","title":"Is Public Read"}},"type":"object","required":["is_public_read"],"title":"CustomAgentVisibilityRequest"},"DailyCronResponse":{"properties":{"grants_expired":{"type":"integer","title":"Grants Expired"},"yearly_grants_applied":{"type":"integer","title":"Yearly Grants Applied"},"storage_quota_resets":{"type":"integer","title":"Storage Quota Resets"},"enterprise_user_subscriptions_ended":{"type":"integer","title":"Enterprise User Subscriptions Ended"}},"type":"object","required":["grants_expired","yearly_grants_applied","storage_quota_resets","enterprise_user_subscriptions_ended"],"title":"DailyCronResponse"},"DeleteAccountPreview":{"properties":{"email":{"type":"string","title":"Email"},"firebase_uid":{"type":"string","title":"Firebase Uid"},"assets":{"type":"integer","title":"Assets","description":"Every asset, project and folder this user created — wherever it lives — with its renditions, keyframes and S3 objects"},"assets_kept_not_created_by_user":{"type":"integer","title":"Assets Kept Not Created By User","description":"Assets somebody else created that sit in the groups being deleted: untouched, but about to lose their last group mapping"},"chats":{"type":"integer","title":"Chats","description":"Chats this user owns. A chat whose creator could not be determined has no owner, and is neither counted nor deleted"},"agents":{"type":"integer","title":"Agents","description":"Assistants this user authored that would be deleted, published copies included, with their logo and demo media"},"groups":{"type":"integer","title":"Groups","description":"Groups that would be deleted: those the user is the sole member of. Groups shared with somebody else are never counted, and never deleted."},"upload_post_profile":{"type":"boolean","title":"Upload Post Profile","description":"True if a linked upload-post profile would be deleted"},"stripe_customer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Customer Id","description":"The Stripe customer that would keep its invoices; null when the user has none"},"stripe_subscriptions":{"items":{"type":"string"},"type":"array","title":"Stripe Subscriptions","description":"Ids of the still-billing subscriptions that would be cancelled"},"stripe_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Error","description":"Why the subscriptions could not be listed; when set, stripe_subscriptions is incomplete rather than empty"},"firebase_account_deleted":{"type":"boolean","title":"Firebase Account Deleted","description":"True if the Firebase login would be deleted too"},"firebase_skip_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Firebase Skip Reason","description":"Why the Firebase account would be left alone"},"signup_grant_lost_on_recreate":{"type":"boolean","title":"Signup Grant Lost On Recreate","description":"True if this email already received the free signup grant: the signup history outlives the account, so registering again with the same address would earn no second grant"}},"type":"object","required":["email","firebase_uid","assets","assets_kept_not_created_by_user","chats","agents","groups","upload_post_profile","firebase_account_deleted","signup_grant_lost_on_recreate"],"title":"DeleteAccountPreview","description":"What a real delete *would* remove, as counted by a dry run.\n\nOnly populated on a dry run: once the purge actually runs, the same\ninformation is in the ``*_deleted`` counters of the summary itself."},"DeleteAccountRequest":{"properties":{"email":{"type":"string","title":"Email","description":"Email of the account to delete"},"confirm_email":{"type":"string","title":"Confirm Email","description":"Must repeat ``email`` exactly (case-insensitive); the request is rejected otherwise. Deletion is irreversible."},"dry_run":{"type":"boolean","title":"Dry Run","description":"Defaults to **true**: the request previews and deletes nothing. Send `false` to actually delete the account. Same default as `DELETE /users/me`, and the same `done` event either way — check its `dry_run` field to see which you got.","default":true}},"type":"object","required":["email","confirm_email"],"title":"DeleteAccountRequest"},"DeleteAccountSummary":{"properties":{"dry_run":{"type":"boolean","title":"Dry Run","default":false},"preview":{"anyOf":[{"$ref":"#/components/schemas/DeleteAccountPreview"},{"type":"null"}],"description":"What would have been deleted; set only on a dry run, where every counter below stays 0 because nothing was touched"},"assets_deleted":{"type":"integer","title":"Assets Deleted","default":0},"chats_deleted":{"type":"integer","title":"Chats Deleted","default":0},"agents_deleted":{"type":"integer","title":"Agents Deleted","default":0},"assistant_media_handed_over":{"type":"integer","title":"Assistant Media Handed Over","description":"Assistant logos/demos this user uploaded that serve somebody else's assistant, re-authored to that assistant's owner instead of being deleted with the account","default":0},"groups_deleted":{"type":"integer","title":"Groups Deleted","default":0},"s3_objects_deleted":{"type":"integer","title":"S3 Objects Deleted","default":0},"s3_multipart_uploads_aborted":{"type":"integer","title":"S3 Multipart Uploads Aborted","default":0},"stripe_subscriptions_cancelled":{"type":"integer","title":"Stripe Subscriptions Cancelled","default":0},"stripe_customer_kept":{"type":"boolean","title":"Stripe Customer Kept","default":false},"firebase_deleted":{"type":"boolean","title":"Firebase Deleted","default":false},"firebase_skip_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Firebase Skip Reason","description":"Why the Firebase account was left alone; null when it was deleted"},"signup_history_recorded":{"type":"boolean","title":"Signup History Recorded","default":false},"user_deleted":{"type":"boolean","title":"User Deleted","default":false}},"type":"object","title":"DeleteAccountSummary","description":"What a completed purge removed — the ``done`` event, as a typed model."},"DispatchAssistantAssetUploadsResponse":{"properties":{"dispatched_count":{"type":"integer","title":"Dispatched Count"},"cleaned_count":{"type":"integer","title":"Cleaned Count"}},"type":"object","required":["dispatched_count","cleaned_count"],"title":"DispatchAssistantAssetUploadsResponse"},"DownscaleRequest":{"properties":{"new_min_dimension":{"type":"integer","enum":[360,480,720,1080,1440,2160],"title":"New Min Dimension","default":720},"max_framerate":{"type":"integer","maximum":60.0,"minimum":5.0,"title":"Max Framerate","default":30},"fast":{"type":"boolean","title":"Fast","default":false},"force":{"type":"boolean","title":"Force","default":false}},"type":"object","title":"DownscaleRequest"},"DownscaleResponse":{"properties":{"task_id":{"type":"string","title":"Task Id"},"estimated_duration_seconds":{"type":"number","title":"Estimated Duration Seconds","default":60.0}},"type":"object","required":["task_id"],"title":"DownscaleResponse"},"DuplicateAssetResponse":{"properties":{"id":{"type":"string","title":"Id"},"skipped_count":{"type":"integer","title":"Skipped Count","description":"Items of a duplicated folder left out of the copy: group and master clips, and files still uploading. Always 0 for a file.","default":0}},"type":"object","required":["id"],"title":"DuplicateAssetResponse","description":"New asset id after a successful duplicate."},"ElevenLabsVoice":{"properties":{"voice_id":{"type":"string","title":"Voice Id","description":"The ElevenLabs voice ID."},"name":{"type":"string","title":"Name","description":"Display name of the voice."},"accent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accent","description":"Accent of the voice, if provided."},"gender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gender","description":"Gender of the voice, if provided."},"age":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Age","description":"Age descriptor of the voice, if provided."},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language","description":"Primary language of the voice, if provided."},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category","description":"Voice category (generated, cloned, premade, professional, famous, high_quality)."},"descriptive":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Descriptive","description":"Short descriptive text for the voice, if provided."},"use_case":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Use Case","description":"Primary use-case of the voice, if provided."},"preview_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview Url","description":"Preview audio URL for the voice, if provided."}},"additionalProperties":false,"type":"object","required":["voice_id","name"],"title":"ElevenLabsVoice"},"EmailNotVerifiedDetail":{"properties":{"code":{"type":"string","title":"Code","description":"Always `EMAIL_NOT_VERIFIED`."},"message":{"type":"string","title":"Message","description":"What the user should do next."}},"type":"object","required":["code","message"],"title":"EmailNotVerifiedDetail"},"EmailNotVerifiedErrorBody":{"properties":{"detail":{"$ref":"#/components/schemas/EmailNotVerifiedDetail"}},"type":"object","required":["detail"],"title":"EmailNotVerifiedErrorBody"},"EnterpriseUserSubscriptionAddRequest":{"properties":{"emails":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Emails","description":"Emails of the users to put on the enterprise subscription"},"monthly_tokens":{"type":"number","minimum":0.0,"title":"Monthly Tokens","description":"Tokens each user gets every month, the first month on being added. Each month's tokens expire after one month."},"storage_gb":{"type":"integer","minimum":5.0,"title":"Storage Gb","description":"Storage quota of each user, in GB"},"duration_months":{"type":"integer","maximum":120.0,"minimum":1.0,"title":"Duration Months","description":"Months from now the subscription lasts. For a user already on enterprise, the period is reset to end this many months from now."},"instant_tokens":{"type":"number","minimum":0.0,"title":"Instant Tokens","description":"One-off tokens granted to each user now, on top; 0 for none"},"instant_tokens_expiration_days":{"type":"integer","exclusiveMinimum":0.0,"title":"Instant Tokens Expiration Days","description":"Days from today after which the one-off tokens expire"}},"type":"object","required":["emails","monthly_tokens","storage_gb","duration_months","instant_tokens","instant_tokens_expiration_days"],"title":"EnterpriseUserSubscriptionAddRequest"},"EnterpriseUserSubscriptionAddResponse":{"properties":{"members":{"items":{"$ref":"#/components/schemas/EnterpriseUserSubscriptionMember"},"type":"array","title":"Members","description":"Users put on, or kept on, the enterprise subscription"},"issues":{"items":{"$ref":"#/components/schemas/EnterpriseUserSubscriptionIssue"},"type":"array","title":"Issues","description":"Emails left unchanged, each with the reason"}},"type":"object","required":["members","issues"],"title":"EnterpriseUserSubscriptionAddResponse"},"EnterpriseUserSubscriptionIssue":{"properties":{"email":{"type":"string","title":"Email","description":"Email as sent, trimmed and lowercased"},"detail":{"type":"string","title":"Detail","description":"Why nothing was done for this email"}},"type":"object","required":["email","detail"],"title":"EnterpriseUserSubscriptionIssue"},"EnterpriseUserSubscriptionMember":{"properties":{"email":{"type":"string","title":"Email","description":"Email of the user"},"action":{"type":"string","enum":["added","updated"],"title":"Action","description":"added: the user was put on enterprise and got this month's tokens; updated: the user was already on it and only the terms changed"},"instant_grant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Instant Grant Id","description":"Id of the one-off grant, null when none was made"},"subscription":{"anyOf":[{"$ref":"#/components/schemas/ApiUserSubscription"},{"type":"null"}],"description":"The user's subscription after the change"}},"type":"object","required":["email","action","instant_grant_id","subscription"],"title":"EnterpriseUserSubscriptionMember"},"EnterpriseUserSubscriptionRemoveRequest":{"properties":{"emails":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Emails","description":"Emails of the users to take off the enterprise subscription"}},"type":"object","required":["emails"],"title":"EnterpriseUserSubscriptionRemoveRequest"},"EnterpriseUserSubscriptionRemoveResponse":{"properties":{"removed":{"items":{"type":"string"},"type":"array","title":"Removed","description":"Emails whose enterprise subscription was ended"},"issues":{"items":{"$ref":"#/components/schemas/EnterpriseUserSubscriptionIssue"},"type":"array","title":"Issues","description":"Emails left unchanged, each with the reason"}},"type":"object","required":["removed","issues"],"title":"EnterpriseUserSubscriptionRemoveResponse"},"EntityAssetsRequest":{"properties":{"entity_id":{"type":"string","format":"uuid","title":"Entity Id"},"asset_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Asset Ids"}},"type":"object","required":["entity_id","asset_ids"],"title":"EntityAssetsRequest","description":"Request body to add multiple assets (or folders) to an entity."},"EntityResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"image_ids":{"items":{"type":"string"},"type":"array","title":"Image Ids","default":[]},"audio_ids":{"items":{"type":"string"},"type":"array","title":"Audio Ids","default":[]}},"type":"object","required":["id","name","description"],"title":"EntityResponse"},"ExportAssetRenditionStatus":{"properties":{"asset_id":{"type":"string","title":"Asset Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"file_type":{"anyOf":[{"$ref":"#/components/schemas/FileType"},{"type":"null"}]},"state":{"type":"string","enum":["ready","needs_rendition","generating","source_limited","missing","not_applicable"],"title":"State"},"selected_width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Selected Width"},"selected_height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Selected Height"},"selected_is_original":{"type":"boolean","title":"Selected Is Original","default":false},"uses_2k_input":{"type":"boolean","title":"Uses 2K Input","default":false},"suggested_min_dimension":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Suggested Min Dimension"},"estimated_cost_tellers_tokens":{"type":"number","title":"Estimated Cost Tellers Tokens","default":0.0}},"type":"object","required":["asset_id","state"],"title":"ExportAssetRenditionStatus","description":"What one project asset would contribute to one export rendition."},"ExportCostEstimateResponse":{"properties":{"rendition":{"type":"string","enum":["480p","720p","1080p","4k"],"title":"Rendition"},"duration_seconds":{"type":"number","title":"Duration Seconds"},"estimated_cost_tellers_tokens":{"type":"number","title":"Estimated Cost Tellers Tokens"},"detail_duration":{"type":"number","title":"Detail Duration"},"total_estimate_duration":{"type":"number","title":"Total Estimate Duration"},"duration_exported_file":{"type":"number","title":"Duration Exported File"},"duration_rendering_file":{"items":{"$ref":"#/components/schemas/ExportRenderingDurationResponse"},"type":"array","title":"Duration Rendering File"}},"type":"object","required":["rendition","duration_seconds","estimated_cost_tellers_tokens","detail_duration","total_estimate_duration","duration_exported_file","duration_rendering_file"],"title":"ExportCostEstimateResponse"},"ExportPreflightResponse":{"properties":{"project_id":{"type":"string","title":"Project Id"},"duration_seconds":{"type":"number","title":"Duration Seconds"},"asset_count":{"type":"integer","title":"Asset Count"},"renditions":{"items":{"$ref":"#/components/schemas/ExportRenditionPreflight"},"type":"array","title":"Renditions"},"renditions_needed_for_optimum_export":{"type":"integer","title":"Renditions Needed For Optimum Export"},"estimated_rendition_cost_tellers_tokens":{"type":"number","title":"Estimated Rendition Cost Tellers Tokens"}},"type":"object","required":["project_id","duration_seconds","asset_count","renditions","renditions_needed_for_optimum_export","estimated_rendition_cost_tellers_tokens"],"title":"ExportPreflightResponse"},"ExportProjectResponse":{"properties":{"task_id":{"type":"string","title":"Task Id"},"asset_id":{"type":"string","title":"Asset Id"}},"type":"object","required":["task_id","asset_id"],"title":"ExportProjectResponse","description":"Response for POST /project/{project_id}/export: task_id and the new export asset_id."},"ExportRenderingDurationResponse":{"properties":{"asset_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Id"},"estimated_time":{"type":"number","title":"Estimated Time"}},"type":"object","required":["asset_id","estimated_time"],"title":"ExportRenderingDurationResponse"},"ExportRenditionPreflight":{"properties":{"rendition":{"type":"string","enum":["480p","720p","1080p","4k"],"title":"Rendition"},"min_dimension":{"type":"integer","title":"Min Dimension"},"has_all_renditions":{"type":"boolean","title":"Has All Renditions"},"uses_2k_input":{"type":"boolean","title":"Uses 2K Input"},"needs_rendition_count":{"type":"integer","title":"Needs Rendition Count"},"generating_count":{"type":"integer","title":"Generating Count"},"source_limited_count":{"type":"integer","title":"Source Limited Count"},"missing_count":{"type":"integer","title":"Missing Count"},"estimated_rendition_cost_tellers_tokens":{"type":"number","title":"Estimated Rendition Cost Tellers Tokens"},"assets":{"items":{"$ref":"#/components/schemas/ExportAssetRenditionStatus"},"type":"array","title":"Assets"}},"type":"object","required":["rendition","min_dimension","has_all_renditions","uses_2k_input","needs_rendition_count","generating_count","source_limited_count","missing_count","estimated_rendition_cost_tellers_tokens","assets"],"title":"ExportRenditionPreflight","description":"Preflight verdict for one export resolution."},"ExportTimelineFile":{"properties":{"asset_id":{"type":"string","title":"Asset Id"},"filename":{"type":"string","title":"Filename"}},"type":"object","required":["asset_id","filename"],"title":"ExportTimelineFile"},"ExportTimelineFilesResponse":{"properties":{"files":{"items":{"$ref":"#/components/schemas/ExportTimelineFile"},"type":"array","title":"Files"}},"type":"object","required":["files"],"title":"ExportTimelineFilesResponse"},"FailedTaskResponse":{"properties":{"status":{"type":"string","const":"FAILED","title":"Status","default":"FAILED"},"result":{"anyOf":[{},{"type":"null"}],"title":"Result"}},"type":"object","title":"FailedTaskResponse"},"FileReference":{"properties":{"file_name":{"type":"string","title":"File Name"},"is_folder":{"type":"boolean","title":"Is Folder"},"file_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Id"},"file_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Type"},"mime_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mime Type"},"duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Seconds"},"last_edit":{"type":"string","format":"date-time","title":"Last Edit"},"right":{"anyOf":[{"$ref":"#/components/schemas/GroupRights"},{"type":"null"}]},"preview_frames":{"anyOf":[{"items":{"$ref":"#/components/schemas/PreviewFrame"},"type":"array"},{"type":"null"}],"title":"Preview Frames"}},"type":"object","required":["file_name","is_folder","file_id","file_type","last_edit"],"title":"FileReference"},"FileType":{"type":"string","enum":["video","audio","image","text","pdf","lut","font","placeholder","group_clip","master_clip","aaf","proj_original","folder","project","entity","teller_config"],"title":"FileType"},"GenerateAudioRequest":{"properties":{"prompt":{"type":"string","title":"Prompt","description":"Text prompt describing the audio."},"model":{"type":"string","enum":["music","sfx"],"title":"Model","description":"'music' for a composed track, 'sfx' for a sound effect.","default":"music"},"duration_seconds":{"type":"number","title":"Duration Seconds","description":"Requested length. Accepted range differs per model — music takes 10-300s and sfx 0.5-30s. See GET /tools/models.","default":30.0},"output_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Path","description":"Optional library path for the generated audio file."},"reference_audio":{"anyOf":[{"$ref":"#/components/schemas/AssetPeriodRef"},{"type":"null"}],"description":"Optional audio range to use for ElevenLabs music inpainting. Only supported when model='music'."}},"additionalProperties":false,"type":"object","required":["prompt"],"title":"GenerateAudioRequest"},"GenerateAudioResponse":{"properties":{"asset_id":{"type":"string","title":"Asset Id"},"duration_seconds":{"type":"number","title":"Duration Seconds"}},"additionalProperties":false,"type":"object","required":["asset_id","duration_seconds"],"title":"GenerateAudioResponse"},"GenerateDescriptionResponse":{"properties":{"task_id":{"type":"string","title":"Task Id"},"needs_downscale":{"type":"boolean","title":"Needs Downscale"}},"type":"object","required":["task_id","needs_downscale"],"title":"GenerateDescriptionResponse"},"GenerateImageRequest":{"properties":{"prompt":{"type":"string","title":"Prompt","description":"Text prompt for image generation."},"model":{"type":"string","enum":["p-image","ideogram","gpt-image","gpt-image-2.5-sunburst","gpt-image-2.5-flare","gpt-image-2","banana","banana-pro","banana-flash","seedream","seedream-pro"],"title":"Model","description":"Model to use.","default":"p-image"},"format":{"anyOf":[{"type":"string","enum":["16:9","9:16","1:1","3:2","2:3","4:3","3:4"]},{"type":"null"}],"title":"Format","description":"Aspect ratio. Defaults to 16:9. Left unset so an explicit choice can be told from the default — a model that would ignore it rejects it rather than silently producing another shape."},"resolution":{"anyOf":[{"type":"string","enum":["1k","1.5k","2k","4k"]},{"type":"null"}],"title":"Resolution","description":"Output resolution. Used by gpt-image (maps to pixel dimensions) and banana models (1k / 2k / 4k). Ignored by p-image."},"width":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Width","description":"Custom output width in pixels for Seedream. Must be supplied together with height."},"height":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Height","description":"Custom output height in pixels for Seedream. Must be supplied together with width."},"input_frame":{"anyOf":[{"type":"string"},{"$ref":"#/components/schemas/AssetFrameRef"},{"type":"null"}],"title":"Input Frame","description":"Source image, enabling edit/compose mode. An asset id, or an object pinning `timestamp_seconds` / `is_last_frame` when the asset is a video — see GET /tools/models."}},"additionalProperties":false,"type":"object","required":["prompt"],"title":"GenerateImageRequest"},"GenerateImageResponse":{"properties":{"asset_id":{"type":"string","title":"Asset Id"}},"additionalProperties":false,"type":"object","required":["asset_id"],"title":"GenerateImageResponse"},"GenerateMissingRenditionResult":{"properties":{"asset_id":{"type":"string","title":"Asset Id"},"min_dimension":{"type":"integer","title":"Min Dimension"},"status":{"type":"string","enum":["queued","already_running","not_allowed"],"title":"Status"},"task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Id"},"estimated_cost_tellers_tokens":{"type":"number","title":"Estimated Cost Tellers Tokens","default":0.0}},"type":"object","required":["asset_id","min_dimension","status"],"title":"GenerateMissingRenditionResult","description":"What happened to one asset when its export master was requested."},"GenerateMissingRenditionsResponse":{"properties":{"project_id":{"type":"string","title":"Project Id"},"queued_count":{"type":"integer","title":"Queued Count"},"skipped_count":{"type":"integer","title":"Skipped Count"},"estimated_cost_tellers_tokens":{"type":"number","title":"Estimated Cost Tellers Tokens"},"assets":{"items":{"$ref":"#/components/schemas/GenerateMissingRenditionResult"},"type":"array","title":"Assets"}},"type":"object","required":["project_id","queued_count","skipped_count","estimated_cost_tellers_tokens","assets"],"title":"GenerateMissingRenditionsResponse"},"GenerateTranscriptResponse":{"properties":{"task_id":{"type":"string","title":"Task Id"}},"type":"object","required":["task_id"],"title":"GenerateTranscriptResponse"},"GenerateTtsRequest":{"properties":{"prompt":{"type":"string","minLength":1,"title":"Prompt","description":"Text to speak. Named `prompt` for consistency with the other generate routes; the underlying model calls it `text`."},"voice_id":{"type":"string","minLength":1,"title":"Voice Id","description":"ElevenLabs voice id — obtain one from POST /tools/search/voices."},"model":{"type":"string","enum":["elevenlabs-v3","elevenlabs-v4","elevenlabs-v4-turbo","gemini-3.1-flash-tts"],"title":"Model","description":"Model to use.","default":"elevenlabs-v3"},"output_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Path","description":"Optional library path for the generated audio file."}},"additionalProperties":false,"type":"object","required":["prompt","voice_id"],"title":"GenerateTtsRequest"},"GenerateTtsResponse":{"properties":{"asset_id":{"type":"string","title":"Asset Id"},"duration_seconds":{"type":"number","title":"Duration Seconds"},"voice_id":{"type":"string","title":"Voice Id"}},"additionalProperties":false,"type":"object","required":["asset_id","duration_seconds","voice_id"],"title":"GenerateTtsResponse"},"GenerateVideoRequest":{"properties":{"prompt":{"type":"string","title":"Prompt","description":"Text prompt describing the video to generate."},"model":{"type":"string","enum":["p-video","p-video-2","kling","kling-pro","runway","wan","ltx","seedance","minimax-h3-max"],"title":"Model","description":"Model to use.","default":"p-video"},"format":{"anyOf":[{"type":"string","enum":["16:9","9:16"]},{"type":"null"}],"title":"Format","description":"Aspect ratio. Defaults to 16:9. Left unset so an explicit choice can be told from the default — a model that would ignore it rejects it rather than silently producing another shape."},"resolution":{"anyOf":[{"type":"string","enum":["480p","720p","768p","1080p"]},{"type":"null"}],"title":"Resolution","description":"Output resolution. Supported values vary by model: p-video supports 720p/1080p; wan/seedance support 480p/720p; minimax-h3-max supports 480p/768p; kling/runway ignore this field."},"input_frame":{"anyOf":[{"type":"string"},{"$ref":"#/components/schemas/AssetFrameRef"},{"type":"null"}],"title":"Input Frame","description":"Start (first) frame. An asset id for the default frame, or an object pinning `timestamp_seconds` / `is_last_frame`."},"output_frame":{"anyOf":[{"type":"string"},{"$ref":"#/components/schemas/AssetFrameRef"},{"type":"null"}],"title":"Output Frame","description":"End (last) frame. An asset id for the default frame, or an object pinning `timestamp_seconds` / `is_last_frame`. Not every model accepts an end frame — see GET /tools/models."},"input_audio":{"anyOf":[{"type":"string"},{"$ref":"#/components/schemas/AssetPeriodRef"},{"type":"null"}],"title":"Input Audio","description":"Audio reference. An asset id for the whole asset, or an object pinning `start_time` / `end_time`. Not every model accepts audio, and only some accept a range — see GET /tools/models."},"output_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Path","description":"Where to save the video in the library: a file path ('Folder/name.mp4') or a folder ending with '/' ('Folder/'). Defaults to the model's own folder."}},"additionalProperties":false,"type":"object","required":["prompt"],"title":"GenerateVideoRequest"},"GenerateVideoResponse":{"properties":{"asset_id":{"type":"string","title":"Asset Id"},"duration_seconds":{"type":"number","title":"Duration Seconds"}},"additionalProperties":false,"type":"object","required":["asset_id","duration_seconds"],"title":"GenerateVideoResponse"},"GrantTokensRequest":{"properties":{"email":{"type":"string","title":"Email","description":"Email of the user to grant tokens to"},"quantity":{"type":"number","exclusiveMinimum":0.0,"title":"Quantity","description":"Number of tokens to grant"},"expiration_days":{"type":"integer","exclusiveMinimum":0.0,"title":"Expiration Days","description":"Number of days from today after which the grant expires"}},"type":"object","required":["email","quantity","expiration_days"],"title":"GrantTokensRequest"},"GrantTokensResponse":{"properties":{"grant_id":{"type":"string","format":"uuid","title":"Grant Id","description":"Id of the created grant"},"expiration_date":{"type":"string","format":"date","title":"Expiration Date","description":"Date on which the grant expires"}},"type":"object","required":["grant_id","expiration_date"],"title":"GrantTokensResponse"},"GroupMemberResponse":{"properties":{"email":{"type":"string","title":"Email"},"right":{"$ref":"#/components/schemas/GroupRights"},"pending":{"type":"boolean","title":"Pending"}},"type":"object","required":["email","right","pending"],"title":"GroupMemberResponse","description":"Someone in a group. ``pending`` is an email invited without an account\nyet: it joins when someone signs in with it."},"GroupResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"last_edit":{"type":"string","format":"date-time","title":"Last Edit"},"is_reference":{"type":"boolean","title":"Is Reference"}},"type":"object","required":["id","name","last_edit","is_reference"],"title":"GroupResponse"},"GroupRights":{"type":"string","enum":["ADMIN","READ","WRITE","VIEW"],"title":"GroupRights","description":"A right on an asset, a chat or an assistant, weakest first:\nVIEW < READ < WRITE < ADMIN.\n\nOn an asset, VIEW sees the file and everything about it except its\ncomments, which READ adds. Chats and assistants have nothing READ adds, so\nVIEW opens what READ does there. Group memberships start at READ."},"GroupShareInfo":{"properties":{"group_id":{"type":"string","title":"Group Id"},"group_name":{"type":"string","title":"Group Name"},"right":{"type":"string","title":"Right"},"can_share":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Can Share","description":"Whether the group may share onward: ADMIN, or a share with can_share. Null for chats, which cannot be shared onward."}},"type":"object","required":["group_id","group_name","right"],"title":"GroupShareInfo","description":"Group with its right on the asset."},"GroupUsersRemoveRequest":{"properties":{"group_id":{"type":"string","title":"Group Id"},"user_ids":{"items":{"type":"string"},"type":"array","title":"User Ids","default":[]},"emails":{"items":{"type":"string"},"type":"array","title":"Emails","default":[]}},"type":"object","required":["group_id"],"title":"GroupUsersRemoveRequest"},"GroupUsersRequest":{"properties":{"group_id":{"type":"string","title":"Group Id"},"user_ids":{"items":{"type":"string"},"type":"array","title":"User Ids","default":[]},"emails":{"items":{"type":"string"},"type":"array","title":"Emails","default":[]},"right":{"$ref":"#/components/schemas/GroupRights","default":"READ"}},"type":"object","required":["group_id"],"title":"GroupUsersRequest"},"GroupUsersResponse":{"properties":{"user_ids":{"items":{"type":"string"},"type":"array","title":"User Ids"},"not_found":{"items":{"type":"string"},"type":"array","title":"Not Found"}},"type":"object","required":["user_ids","not_found"],"title":"GroupUsersResponse","description":"The ``user_ids`` asked for that were found and those that were not.\n\nEmails are never listed in either: the reply must not tell which have a\nTellers account. An email without one is invited and joins the group when\nsomeone signs in with it."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HourlyCronResponse":{"properties":{"assistant_assets_dispatched":{"type":"integer","title":"Assistant Assets Dispatched"},"assistant_assets_cleaned":{"type":"integer","title":"Assistant Assets Cleaned"},"multipart_uploads_cleaned":{"type":"integer","title":"Multipart Uploads Cleaned"},"storage_usage_refreshed":{"type":"integer","title":"Storage Usage Refreshed"}},"type":"object","required":["assistant_assets_dispatched","assistant_assets_cleaned","multipart_uploads_cleaned","storage_usage_refreshed"],"title":"HourlyCronResponse"},"ImageCapability":{"properties":{"models":{"items":{"$ref":"#/components/schemas/ImageModelCapability"},"type":"array","title":"Models"}},"additionalProperties":false,"type":"object","required":["models"],"title":"ImageCapability"},"ImageModelCapability":{"properties":{"id":{"type":"string","title":"Id","description":"Value to pass as `model`."},"tool_id":{"type":"string","title":"Tool Id","description":"The agent tool backing this model. Join to `available_agent_tools` in GET /settings for its display name, description and pricing — kept there rather than duplicated here so there is one source of truth. Several models can share a tool."},"required":{"items":{"type":"string"},"type":"array","title":"Required","description":"Request fields this model cannot do without. Everything else in the request schema is optional."},"formats":{"items":{"type":"string"},"type":"array","title":"Formats","description":"Aspect ratios acted on. Empty = field ignored."},"resolutions":{"items":{"type":"string"},"type":"array","title":"Resolutions","description":"Resolutions acted on. Empty = field ignored."},"supports_input_frame":{"type":"boolean","title":"Supports Input Frame","description":"Whether `input_frame` (source image) is used."},"supports_frame_timestamp":{"type":"boolean","title":"Supports Frame Timestamp","description":"Whether `input_frame` may pin a `timestamp_seconds` / `is_last_frame`. False means only a bare asset id is accepted."},"max_char":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Char","description":"Longest `prompt` accepted, in characters. None = unbounded."}},"additionalProperties":false,"type":"object","required":["id","tool_id","required","formats","resolutions","supports_input_frame","supports_frame_timestamp"],"title":"ImageModelCapability","description":"What one image model accepts, as published by ``GET /tools/models``.\n\n``formats`` / ``resolutions`` list the values the model actually *acts on*.\nAn empty list means the field is ignored — gpt-image derives its dimensions\nfrom ``resolution`` and pays no attention to ``format``, while p-image is\nthe reverse."},"LabelSetBy":{"type":"string","enum":["OWNER","REVIEWER"],"title":"LabelSetBy","description":"Who may *attach* a label to an assistant.\n\nCreating one is reviewer-only either way: the vocabulary is curated, and an\nowner picks from it rather than inventing an entry — which is the whole\nreason nothing here has to screen what a label is called. OWNER says an\nauthor may put this label on their own assistant; REVIEWER reserves it,\nwhich is what keeps a ``featured`` from being self-awarded."},"LegacySharingRequest":{"properties":{"apply_changes":{"type":"boolean","title":"Apply Changes","description":"When false, run every step in one transaction and roll it back: the counts are what a real run would do. Set true to keep them; each step then commits on its own.","default":false}},"type":"object","title":"LegacySharingRequest"},"LineItem":{"properties":{"price_id":{"type":"string","title":"Price Id"},"quantity":{"type":"integer","minimum":0.0,"title":"Quantity","description":"Default quantity for this price."}},"additionalProperties":false,"type":"object","required":["price_id","quantity"],"title":"LineItem","description":"Reusable cart line item (used by checkout defaults)."},"LinkedAsset":{"properties":{"id":{"type":"string","title":"Id"},"path":{"type":"string","title":"Path"},"file_type":{"$ref":"#/components/schemas/FileType"},"mime_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mime Type"},"link_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link Type"},"link_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link Name"},"addition_datetime":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Addition Datetime"}},"type":"object","required":["id","path","file_type"],"title":"LinkedAsset"},"ListFilesResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/FileReference"},"type":"array","title":"Items"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"}},"type":"object","required":["items"],"title":"ListFilesResponse"},"LlmModelTier":{"properties":{"low":{"anyOf":[{"type":"string","enum":["gpt-6-astra","gpt-6.1-sol","gpt-6.1-terra","gpt-6-sol","gpt-6-luna","gpt-5.6-sol","gpt-5.6-terra","gpt-5.6-luna","gpt-5.5-2026-04-23","gpt-5.5-pro-2026-04-23","gpt-5.4-pro-2026-03-05","gpt-5.4","gpt-5.4-mini","gpt-5.3-codex","gpt-5.2-2025-12-11","gpt-5-mini-2025-08-07","gpt-5-nano"]},{"type":"null"}],"title":"Low"},"medium":{"anyOf":[{"type":"string","enum":["gpt-6-astra","gpt-6.1-sol","gpt-6.1-terra","gpt-6-sol","gpt-6-luna","gpt-5.6-sol","gpt-5.6-terra","gpt-5.6-luna","gpt-5.5-2026-04-23","gpt-5.5-pro-2026-04-23","gpt-5.4-pro-2026-03-05","gpt-5.4","gpt-5.4-mini","gpt-5.3-codex","gpt-5.2-2025-12-11","gpt-5-mini-2025-08-07","gpt-5-nano"]},{"type":"null"}],"title":"Medium"},"high":{"anyOf":[{"type":"string","enum":["gpt-6-astra","gpt-6.1-sol","gpt-6.1-terra","gpt-6-sol","gpt-6-luna","gpt-5.6-sol","gpt-5.6-terra","gpt-5.6-luna","gpt-5.5-2026-04-23","gpt-5.5-pro-2026-04-23","gpt-5.4-pro-2026-03-05","gpt-5.4","gpt-5.4-mini","gpt-5.3-codex","gpt-5.2-2025-12-11","gpt-5-mini-2025-08-07","gpt-5-nano"]},{"type":"null"}],"title":"High"}},"type":"object","title":"LlmModelTier"},"LlmSubscriptionRequiredDetail":{"properties":{"code":{"type":"string","title":"Code"},"message":{"type":"string","title":"Message"},"required_subscription_tier":{"$ref":"#/components/schemas/SubscriptionTier"}},"type":"object","required":["code","message","required_subscription_tier"],"title":"LlmSubscriptionRequiredDetail"},"LlmSubscriptionRequiredErrorBody":{"properties":{"detail":{"$ref":"#/components/schemas/LlmSubscriptionRequiredDetail"}},"type":"object","required":["detail"],"title":"LlmSubscriptionRequiredErrorBody"},"LongVideoAnalysisSettings":{"properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled","description":"Whether videos longer than 'min_duration_s' use these settings. When false, every video is described like a short one (static frame sampling, 5-minute chunks)."},"min_duration_s":{"anyOf":[{"type":"integer","minimum":60.0},{"type":"null"}],"title":"Min Duration S","description":"Videos longer than this many seconds count as long."},"processing":{"anyOf":[{"type":"string","enum":["static","agentic"]},{"type":"null"}],"title":"Processing","description":"'agentic' lets Gemini pick which frames to look at (cheaper on long footage); 'static' samples at the configured fps."},"split_duration_s":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Split Duration S","description":"Length in seconds of each Gemini call a long video is split into. 0 sends the whole video in one call."}},"additionalProperties":false,"type":"object","title":"LongVideoAnalysisSettings","description":"How descriptions of long videos differ from short ones.\n\nOnly scene-description generation reads this; ``video_analyse_gemini``\ntakes its processing mode as a tool argument instead. Every field is\noptional so a folder config can override one of them and inherit the rest."},"MediaAccessNeed":{"properties":{"asset_id":{"type":"string","title":"Asset Id"},"name":{"type":"string","title":"Name"},"file_type":{"anyOf":[{"$ref":"#/components/schemas/FileType"},{"type":"null"}]},"requested":{"type":"boolean","title":"Requested","description":"A request for it is already with its owner (pending or declined), so asking again does nothing."}},"type":"object","required":["asset_id","name","requested"],"title":"MediaAccessNeed","description":"A medium the caller cannot read on their own, only view through the\nproject, and may ask its owner for."},"MediaChunk":{"properties":{"description":{"type":"string","title":"Description","description":"The description of the chunk."},"time_range":{"$ref":"#/components/schemas/TimeRange","description":"Time bounds for this chunk on the full target media timeline, using playback position rather than timecode overlays or spoken times."}},"additionalProperties":false,"type":"object","required":["description","time_range"],"title":"MediaChunk"},"MediaGap":{"properties":{"asset_id":{"type":"string","title":"Asset Id"},"name":{"type":"string","title":"Name"},"file_type":{"anyOf":[{"$ref":"#/components/schemas/FileType"},{"type":"null"}]},"can_share":{"type":"boolean","title":"Can Share","description":"Whether the caller may share it."},"missing":{"items":{"$ref":"#/components/schemas/MediaGrantee"},"type":"array","title":"Missing"}},"type":"object","required":["asset_id","name","can_share","missing"],"title":"MediaGap","description":"A medium not shared with everyone its project or assistant is."},"MediaGrantee":{"properties":{"group_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group Id","description":"Set for a group."},"group_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group Name"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","description":"Set for a person, or a pending invite."},"pending":{"type":"boolean","title":"Pending","description":"An invite to an email that has no account yet.","default":false},"right":{"$ref":"#/components/schemas/GroupRights","description":"The right they should hold."},"current_right":{"anyOf":[{"$ref":"#/components/schemas/GroupRights"},{"type":"null"}],"description":"What they hold on the medium on their own, below ``right``; null when nothing."}},"type":"object","required":["right"],"title":"MediaGrantee","description":"Someone a project or assistant is shared with, and the right they\nshould hold on the media it uses."},"MediaShareResult":{"properties":{"shared_asset_ids":{"items":{"type":"string"},"type":"array","title":"Shared Asset Ids","description":"Media that got at least one new or raised grant."},"skipped":{"items":{"$ref":"#/components/schemas/MediaShareSkip"},"type":"array","title":"Skipped"},"sharing":{"$ref":"#/components/schemas/MediaSharing","description":"The state afterwards."}},"type":"object","required":["shared_asset_ids","skipped","sharing"],"title":"MediaShareResult","description":"What sharing the media of a project or assistant did."},"MediaShareSkip":{"properties":{"asset_id":{"type":"string","title":"Asset Id"},"name":{"type":"string","title":"Name"},"grantee":{"$ref":"#/components/schemas/MediaGrantee"},"reason":{"type":"string","title":"Reason","description":"cannot_share: the caller may not share this medium. right_above_yours: the right is above what the caller holds on it. group_not_managed: the caller does not manage the group. no_email: the person has no email to share with. not_allowed: the sharing rules refused it otherwise."}},"type":"object","required":["asset_id","name","grantee","reason"],"title":"MediaShareSkip","description":"A grant the caller could not make on one medium."},"MediaSharing":{"properties":{"in_sync":{"type":"boolean","title":"In Sync","description":"Everyone it is shared with holds at least the expected right on every medium it uses."},"can_share":{"type":"boolean","title":"Can Share","description":"Whether the caller may share the project or assistant."},"media":{"items":{"$ref":"#/components/schemas/MediaGap"},"type":"array","title":"Media","description":"The media missing someone, and who."},"lacking_for_me":{"items":{"$ref":"#/components/schemas/MediaAccessNeed"},"type":"array","title":"Lacking For Me","description":"The media the caller cannot read on their own, with an owner they can ask for access. Projects only; empty for assistants."}},"type":"object","required":["in_sync","can_share","media"],"title":"MediaSharing","description":"How the media a project or assistant uses are shared, against its own\nshares."},"MultipartAbortRequest":{"properties":{"asset_id":{"type":"string","title":"Asset Id"},"multipart_upload_id":{"type":"string","title":"Multipart Upload Id"}},"type":"object","required":["asset_id","multipart_upload_id"],"title":"MultipartAbortRequest"},"MultipartCompletePart":{"properties":{"part_number":{"type":"integer","title":"Part Number"},"etag":{"type":"string","title":"Etag"}},"type":"object","required":["part_number","etag"],"title":"MultipartCompletePart"},"MultipartCompleteRequest":{"properties":{"asset_id":{"type":"string","title":"Asset Id"},"multipart_upload_id":{"type":"string","title":"Multipart Upload Id"},"parts":{"items":{"$ref":"#/components/schemas/MultipartCompletePart"},"type":"array","title":"Parts"}},"type":"object","required":["asset_id","multipart_upload_id","parts"],"title":"MultipartCompleteRequest"},"MultipartPartUrl":{"properties":{"part_number":{"type":"integer","title":"Part Number"},"url":{"type":"string","title":"Url"}},"type":"object","required":["part_number","url"],"title":"MultipartPartUrl"},"MultipartPartUrlsRequest":{"properties":{"asset_id":{"type":"string","title":"Asset Id"},"multipart_upload_id":{"type":"string","title":"Multipart Upload Id"},"part_numbers":{"items":{"type":"integer"},"type":"array","maxItems":100,"minItems":1,"title":"Part Numbers","description":"1-based part numbers to presign. Request them as the upload progresses instead of relying on the URLs returned by upload_urls: those are signed with temporary credentials, so they can expire long before a large upload reaches its last parts."}},"type":"object","required":["asset_id","multipart_upload_id","part_numbers"],"title":"MultipartPartUrlsRequest"},"MultipartPartUrlsResponse":{"properties":{"urls":{"items":{"$ref":"#/components/schemas/MultipartPartUrl"},"type":"array","title":"Urls"}},"type":"object","required":["urls"],"title":"MultipartPartUrlsResponse"},"PendingTaskResponse":{"properties":{"status":{"type":"string","const":"PENDING","title":"Status","default":"PENDING"},"progress":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Progress"},"result":{"anyOf":[{},{"type":"null"}],"title":"Result"}},"type":"object","title":"PendingTaskResponse"},"PlanLineItem":{"properties":{"price_id":{"type":"string","title":"Price Id"},"quantity":{"type":"integer","minimum":0.0,"title":"Quantity","description":"Default quantity for this price."},"quantity_step":{"type":"integer","minimum":1.0,"title":"Quantity Step","description":"Checkout quantity step for this item."},"units_per_quantity":{"type":"number","exclusiveMinimum":0.0,"title":"Units Per Quantity","description":"Multiplier to convert checkout quantity into displayed units for this item.","default":1}},"additionalProperties":false,"type":"object","required":["price_id","quantity","quantity_step"],"title":"PlanLineItem","description":"Reusable cart line item (used by checkout defaults)."},"PlanPricing":{"properties":{"lines":{"items":{"$ref":"#/components/schemas/CatalogPricingLine"},"type":"array","title":"Lines","description":"Priced Stripe lines (one for typical one-off; two for subscription)."}},"additionalProperties":false,"type":"object","required":["lines"],"title":"PlanPricing","description":"Pricing-only blob for Rust ``pricing_preview_json`` (``lines`` only).\n\nDefault starter quantities live on the plan as ``default_items``."},"PresignedUrl":{"properties":{"url":{"type":"string","title":"Url"},"expiration":{"type":"integer","title":"Expiration"}},"type":"object","required":["url","expiration"],"title":"PresignedUrl"},"PreviewAssetListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PublicAssetInfo"},"type":"array","title":"Items"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"}},"type":"object","required":["items"],"title":"PreviewAssetListResponse"},"PreviewAssetResponse":{"properties":{"file_type":{"$ref":"#/components/schemas/FileType"},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"$ref":"#/components/schemas/PresignedUrl"}],"title":"Data"},"description":{"type":"string","title":"Description"},"transcription":{"$ref":"#/components/schemas/TimedTranscript"},"chunked_descriptions":{"$ref":"#/components/schemas/TimeBasedMediaDescription"},"title":{"type":"string","title":"Title","default":""},"user_id":{"type":"string","title":"User Id","default":""},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"}},"type":"object","required":["file_type","data","description","transcription","chunked_descriptions"],"title":"PreviewAssetResponse"},"PreviewCustomAgentListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/APICustomAgentWithoutData"},"type":"array","title":"Items"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"}},"type":"object","required":["items"],"title":"PreviewCustomAgentListResponse"},"PreviewFrame":{"properties":{"asset_id":{"type":"string","title":"Asset Id"},"frame_time":{"type":"number","title":"Frame Time"}},"type":"object","required":["asset_id","frame_time"],"title":"PreviewFrame"},"PreviewGroupListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/GroupResponse"},"type":"array","title":"Items"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"}},"type":"object","required":["items"],"title":"PreviewGroupListResponse"},"PreviewInfoCounts":{"properties":{"total_count_user":{"type":"integer","title":"Total Count User"},"total_count_public_user":{"type":"integer","title":"Total Count Public User"},"total_count_asset":{"type":"integer","title":"Total Count Asset"},"total_count_public_asset":{"type":"integer","title":"Total Count Public Asset"},"total_count_custom_agent":{"type":"integer","title":"Total Count Custom Agent"},"total_count_public_custom_agent":{"type":"integer","title":"Total Count Public Custom Agent"},"total_count_entity":{"type":"integer","title":"Total Count Entity"},"total_count_project":{"type":"integer","title":"Total Count Project"},"total_count_public_project":{"type":"integer","title":"Total Count Public Project"}},"type":"object","required":["total_count_user","total_count_public_user","total_count_asset","total_count_public_asset","total_count_custom_agent","total_count_public_custom_agent","total_count_entity","total_count_project","total_count_public_project"],"title":"PreviewInfoCounts"},"PreviewToolInfo":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"deactivated":{"type":"boolean","title":"Deactivated"}},"type":"object","required":["id","name","description","deactivated"],"title":"PreviewToolInfo"},"PreviewUserListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PublicUserInfo"},"type":"array","title":"Items"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"}},"type":"object","required":["items"],"title":"PreviewUserListResponse"},"ProcessAssetsRequest":{"properties":{"assets":{"items":{"$ref":"#/components/schemas/AssetUploadResponse"},"type":"array","title":"Assets"},"version":{"anyOf":[{"$ref":"#/components/schemas/VersionReference"},{"type":"null"}]},"cutter_sensitivity":{"type":"number","title":"Cutter Sensitivity","default":0.5},"generate_time_based_media_description":{"type":"boolean","title":"Generate Time Based Media Description","default":false,"deprecated":true},"override_entity_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Override Entity Ids","deprecated":true},"generate_proxy":{"items":{"type":"string","enum":["360","480","720","1080","2160"]},"type":"array","title":"Generate Proxy","default":["720"]}},"type":"object","required":["assets","version"],"title":"ProcessAssetsRequest"},"PublicAssetInfo":{"properties":{"id":{"type":"string","title":"Id"},"in_app_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"In App Path"},"file_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Type"},"last_edit":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Edit"},"is_public_read":{"type":"boolean","title":"Is Public Read","default":true}},"type":"object","required":["id"],"title":"PublicAssetInfo","description":"Public asset list item."},"PublicCustomAgentBatchResponse":{"properties":{"assistants":{"items":{"$ref":"#/components/schemas/APICustomAgent"},"type":"array","title":"Assistants"}},"type":"object","required":["assistants"],"title":"PublicCustomAgentBatchResponse"},"PublicCustomAgentPageResponse":{"properties":{"assistants":{"items":{"$ref":"#/components/schemas/APICustomAgent"},"type":"array","title":"Assistants"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"}},"type":"object","required":["assistants"],"title":"PublicCustomAgentPageResponse"},"PublicUserInfo":{"properties":{"id":{"type":"string","title":"Id"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"profile_pic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile Pic"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"job_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Title"},"last_edit":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Edit"}},"type":"object","required":["id"],"title":"PublicUserInfo"},"PublishedCustomAgentSearchResult":{"properties":{"name":{"type":"string","title":"Name","description":"The published custom agent name."},"description":{"type":"string","title":"Description","description":"The published custom agent description."},"app_url":{"type":"string","title":"App Url","description":"Tellers app link for opening this custom agent."}},"additionalProperties":false,"type":"object","required":["name","description","app_url"],"title":"PublishedCustomAgentSearchResult"},"RegisterRequest":{"properties":{"redirect_uris":{"items":{"type":"string"},"type":"array","title":"Redirect Uris"},"client_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Name"},"scope":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope"},"grant_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Grant Types"},"response_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Response Types"},"token_endpoint_auth_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token Endpoint Auth Method"}},"type":"object","required":["redirect_uris"],"title":"RegisterRequest"},"RequestTaskResponse":{"properties":{"task_id":{"type":"string","title":"Task Id"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["task_id"],"title":"RequestTaskResponse"},"ResyncSubscriptionRequest":{"properties":{"email":{"type":"string","title":"Email","description":"Email of the user whose subscription to resync"}},"type":"object","required":["email"],"title":"ResyncSubscriptionRequest"},"ResyncSubscriptionResponse":{"properties":{"email":{"type":"string","title":"Email","description":"Email of the resynced user"},"stripe_customer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Customer Id","description":"Stripe customer the user is linked to, null if none exists"},"stripe_customer_updated":{"type":"boolean","title":"Stripe Customer Updated","description":"True if the stored Stripe customer id was changed"},"action":{"type":"string","enum":["upserted","cleared","unchanged"],"title":"Action","description":"upserted: the local subscription now mirrors Stripe; cleared: a stale local subscription was removed; unchanged: nothing to do"},"subscription":{"anyOf":[{"$ref":"#/components/schemas/ApiUserSubscription"},{"type":"null"}],"description":"The user's subscription after the resync, null if none"}},"type":"object","required":["email","stripe_customer_id","stripe_customer_updated","action","subscription"],"title":"ResyncSubscriptionResponse"},"SearchAssetsRequest":{"properties":{"prompt":{"type":"string","title":"Prompt","description":"Natural language query to search for."},"search_mode":{"type":"string","enum":["semantic_by_scene_keyframe","semantic_by_scene_description","semantic_by_scene_sequence","semantic_by_asset_description","text_by_filename","text_by_file_description"],"title":"Search Mode","description":"Search mode. Semantic modes are embedding-based, not keyword matching. semantic_by_scene_keyframe matches on keyframe embeddings, semantic_by_scene_description on single-scene description embeddings, and semantic_by_scene_sequence on aggregate consecutive-scene embeddings. text_by_filename searches filenames by case-insensitive substring, and text_by_file_description searches asset descriptions by case-insensitive substring.","default":"semantic_by_scene_keyframe"},"folder":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder","description":"Folder path to restrict the search to (e.g. '/my-project')."},"file_type":{"anyOf":[{"$ref":"#/components/schemas/FileType"},{"type":"null"}],"description":"Restrict results to a specific asset file type."},"format":{"anyOf":[{"type":"string","enum":["16:9","9:16"]},{"type":"null"}],"title":"Format","description":"Filter by aspect ratio."},"only_my_files":{"type":"boolean","title":"Only My Files","description":"Search only your own library, leaving out files shared with you (directly or through a group) and public ones.","default":false},"limit":{"type":"integer","maximum":50.0,"minimum":1.0,"title":"Limit","description":"Number of results.","default":10},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor","description":"Opaque cursor returned by a previous page."}},"additionalProperties":false,"type":"object","required":["prompt"],"title":"SearchAssetsRequest"},"SearchAssetsResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/AssetSearchResult"},"type":"array","title":"Results"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"}},"additionalProperties":false,"type":"object","required":["results"],"title":"SearchAssetsResponse"},"SearchCustomAgentsRequest":{"properties":{"query":{"type":"string","maxLength":200,"minLength":1,"title":"Query"},"limit":{"type":"integer","maximum":50.0,"minimum":1.0,"title":"Limit","default":20},"recommended_by_tellers":{"type":"boolean","title":"Recommended By Tellers","description":"Only agents recommended by Tellers.","default":false},"created_by_tellers":{"type":"boolean","title":"Created By Tellers","description":"Only agents created by Tellers.","default":false},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor","description":"Opaque cursor from a previous page."}},"additionalProperties":false,"type":"object","required":["query"],"title":"SearchCustomAgentsRequest"},"SearchCustomAgentsResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/PublishedCustomAgentSearchResult"},"type":"array","title":"Results"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"}},"additionalProperties":false,"type":"object","required":["results","next_cursor"],"title":"SearchCustomAgentsResponse"},"SearchMeCapability":{"properties":{"required":{"items":{"type":"string"},"type":"array","title":"Required"},"search_modes":{"items":{"type":"string"},"type":"array","title":"Search Modes","description":"Values accepted for `search_mode`."},"file_types":{"items":{"type":"string"},"type":"array","title":"File Types","description":"Values accepted for `file_type`."},"formats":{"items":{"type":"string"},"type":"array","title":"Formats","description":"Values accepted for `format`."},"min_limit":{"type":"integer","title":"Min Limit"},"max_limit":{"type":"integer","title":"Max Limit"},"supports_folder":{"type":"boolean","title":"Supports Folder","default":true}},"additionalProperties":false,"type":"object","required":["required","search_modes","file_types","formats","min_limit","max_limit"],"title":"SearchMeCapability"},"SearchStockCapability":{"properties":{"required":{"items":{"type":"string"},"type":"array","title":"Required"},"types":{"items":{"type":"string"},"type":"array","title":"Types","description":"Values accepted for `type`."},"formats":{"items":{"type":"string"},"type":"array","title":"Formats","description":"Values accepted for `format`."},"min_limit":{"type":"integer","title":"Min Limit"},"max_limit":{"type":"integer","title":"Max Limit"}},"additionalProperties":false,"type":"object","required":["required","types","formats","min_limit","max_limit"],"title":"SearchStockCapability"},"SearchStockRequest":{"properties":{"prompt":{"type":"string","title":"Prompt","description":"Search query for stock content."},"type":{"type":"string","enum":["image","video"],"title":"Type","description":"Type of content to search.","default":"video"},"format":{"anyOf":[{"type":"string","enum":["16:9","9:16"]},{"type":"null"}],"title":"Format","description":"Filter by aspect ratio."},"limit":{"type":"integer","maximum":80.0,"minimum":1.0,"title":"Limit","description":"Number of results.","default":10}},"additionalProperties":false,"type":"object","required":["prompt"],"title":"SearchStockRequest"},"SearchStockResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/StockAssetSearchResult"},"type":"array","title":"Results"}},"additionalProperties":false,"type":"object","required":["results"],"title":"SearchStockResponse"},"SearchVoicesCapability":{"properties":{"required":{"items":{"type":"string"},"type":"array","title":"Required"},"min_limit":{"type":"integer","title":"Min Limit"},"max_limit":{"type":"integer","title":"Max Limit"},"supports_language":{"type":"boolean","title":"Supports Language","default":true}},"additionalProperties":false,"type":"object","required":["required","min_limit","max_limit"],"title":"SearchVoicesCapability"},"SearchVoicesRequest":{"properties":{"search":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search","description":"Free-text query (name, description, use case)."},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language","description":"Filter by language code, e.g. 'en'."},"limit":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Limit","description":"Number of results.","default":10}},"additionalProperties":false,"type":"object","title":"SearchVoicesRequest"},"SearchVoicesResponse":{"properties":{"voices":{"items":{"$ref":"#/components/schemas/ElevenLabsVoice"},"type":"array","title":"Voices"},"has_more":{"type":"boolean","title":"Has More"}},"additionalProperties":false,"type":"object","required":["voices","has_more"],"title":"SearchVoicesResponse"},"ShareAddRequest":{"properties":{"group_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Group Id"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"can_share":{"type":"boolean","title":"Can Share","description":"Let the grantee share the asset onward too. Only an admin of the asset can set it.","default":false},"right":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Right","description":"VIEW, READ, WRITE or ADMIN; null means READ. VIEW sees the file and everything about it except its comments. Below ADMIN, a sharer hands out at most their own right. An existing share keeps its right: change it with share/update_right."}},"type":"object","title":"ShareAddRequest","description":"Add one share: provide exactly one of group_id or email."},"ShareRemoveRequest":{"properties":{"group_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Group Id"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"}},"type":"object","title":"ShareRemoveRequest","description":"Remove one share: provide exactly one of group_id or email (removes all rights for that group/email)."},"ShareUpdateRightRequest":{"properties":{"to_right":{"type":"string","title":"To Right"},"group_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Group Id"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"can_share":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Can Share","description":"Set whether the grantee may share the asset onward. Null keeps what the share has. Only an admin of the asset can turn it on."}},"type":"object","required":["to_right"],"title":"ShareUpdateRightRequest","description":"Change right for one share: provide exactly one of group_id or email, and to_right."},"ShareWithEveryoneRequest":{"properties":{"right":{"anyOf":[{"type":"string","enum":["VIEW","READ"]},{"type":"null"}],"title":"Right","description":"VIEW or READ for every user; null stops sharing with everyone. VIEW sees the file and everything about it except its comments."}},"type":"object","required":["right"],"title":"ShareWithEveryoneRequest"},"ShareWithEveryoneResponse":{"properties":{"asset_id":{"type":"string","title":"Asset Id"},"right":{"anyOf":[{"type":"string","enum":["VIEW","READ"]},{"type":"null"}],"title":"Right"}},"type":"object","required":["asset_id","right"],"title":"ShareWithEveryoneResponse"},"SharedWithMeResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/FileReference"},"type":"array","title":"Items"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Pass back as cursor for the next page; null at the end."}},"type":"object","required":["items"],"title":"SharedWithMeResponse"},"SignupHistoryResponse":{"properties":{"known":{"type":"boolean","title":"Known","description":"True if this email ever had an account on Tellers"},"free_grant_already_given":{"type":"boolean","title":"Free Grant Already Given","description":"True if this email already received the signup grant; a new account for it gets no free tokens"},"free_trial_used":{"type":"boolean","title":"Free Trial Used","description":"True if this email already used the subscription free trial. Always false for now: nothing writes it yet, because the backend never grants the trial — Stripe does, off the price."},"signup_count":{"type":"integer","title":"Signup Count","description":"Number of accounts created so far"},"deleted_count":{"type":"integer","title":"Deleted Count","description":"Number of accounts deleted so far"},"first_signup_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Signup At"},"last_signup_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Signup At"},"free_grant_granted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Free Grant Granted At"},"last_deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Deleted At"}},"type":"object","required":["known","free_grant_already_given","free_trial_used","signup_count","deleted_count"],"title":"SignupHistoryResponse"},"SocialPublishPostRequest":{"properties":{"asset_id":{"type":"string","title":"Asset Id"},"platforms":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Platforms"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"description":{"type":"string","title":"Description","default":""},"scheduled_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scheduled Date"},"youtube_privacy":{"anyOf":[{"type":"string","enum":["public","unlisted","private"]},{"type":"null"}],"title":"Youtube Privacy"}},"type":"object","required":["asset_id","platforms"],"title":"SocialPublishPostRequest"},"SocialPublishPostResponse":{"properties":{"status":{"type":"string","title":"Status"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id"},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"},"provider_response":{"additionalProperties":true,"type":"object","title":"Provider Response"}},"type":"object","required":["status"],"title":"SocialPublishPostResponse"},"SocialPublishingPlatformSetting":{"properties":{"id":{"type":"string","title":"Id"},"label":{"type":"string","title":"Label"},"supported_media_types":{"items":{"type":"string"},"type":"array","title":"Supported Media Types"}},"type":"object","required":["id","label","supported_media_types"],"title":"SocialPublishingPlatformSetting"},"SourceFileInfo":{"properties":{"sourceName":{"type":"string","title":"Sourcename"},"sourceUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sourceurl"},"sourceIconUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sourceiconurl"},"authors":{"items":{"type":"string"},"type":"array","title":"Authors"},"creationDatetime":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Creationdatetime"},"additionDatetime":{"type":"integer","title":"Additiondatetime"},"isCitationRequired":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Iscitationrequired"},"citation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Citation"},"reuseConditionInfo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reuseconditioninfo"},"inAppPath":{"items":{"type":"string"},"type":"array","title":"Inapppath"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"keywords":{"items":{"type":"string"},"type":"array","title":"Keywords"},"duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Seconds"},"provider_generation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider Generation Id"},"provider_generation_id_created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Provider Generation Id Created At"},"generated_by_llm_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Generated By Llm Model"},"prompt_used_to_create":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt Used To Create"},"parent_asset_start_time":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Parent Asset Start Time"},"umid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Umid"},"capture_device_umid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Capture Device Umid"},"original_file_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original File Path"},"original_ffprobe_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Original Ffprobe Metadata"}},"type":"object","required":["sourceName","sourceUrl","sourceIconUrl","authors","creationDatetime","additionDatetime","inAppPath","title","description","keywords"],"title":"SourceFileInfo"},"SpeakerSegment":{"properties":{"start":{"type":"number","title":"Start"},"end":{"type":"number","title":"End"},"speaker":{"type":"string","title":"Speaker"}},"type":"object","required":["start","end","speaker"],"title":"SpeakerSegment","description":"A stretch of media over which a single diarized speaker talks.\n\n``speaker`` is the label speech-to-text gave that voice (``speaker_0``,\n``speaker_1``, ...). It identifies one voice within a single transcript and\ncarries no meaning across assets."},"SpeechModelCapability":{"properties":{"id":{"type":"string","title":"Id","description":"Value to pass as `model`."},"tool_id":{"type":"string","title":"Tool Id","description":"The agent tool backing this model. Join to `available_agent_tools` in GET /settings for its display name, description and pricing — kept there rather than duplicated here so there is one source of truth. Several models can share a tool."},"required":{"items":{"type":"string"},"type":"array","title":"Required","description":"Request fields this model cannot do without. Everything else in the request schema is optional."},"max_char":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Char","description":"Longest `prompt` accepted, in characters. None = unbounded."}},"additionalProperties":false,"type":"object","required":["id","tool_id","required"],"title":"SpeechModelCapability","description":"A speech model. Voice choice is the only variable, and it comes from\n``POST /tools/search/voices`` rather than from a fixed list here."},"StatusResponse":{"properties":{"idle_seconds":{"type":"number","title":"Idle Seconds"},"active_websockets":{"type":"integer","title":"Active Websockets"},"last_activity_at":{"type":"string","format":"date-time","title":"Last Activity At"},"now":{"type":"string","format":"date-time","title":"Now"}},"type":"object","required":["idle_seconds","active_websockets","last_activity_at","now"],"title":"StatusResponse"},"StockAssetSearchResult":{"properties":{"asset_id":{"type":"string","title":"Asset Id","description":"The ID of the asset."},"title":{"type":"string","title":"Title","description":"The title of the asset."},"description":{"type":"string","title":"Description","description":"The description of the asset."},"duration_seconds":{"type":"number","title":"Duration Seconds","description":"The duration of the asset in seconds. 0.0 for images."},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width","description":"The width of the asset in pixels, when Pexels reports it."},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height","description":"The height of the asset in pixels, when Pexels reports it."}},"additionalProperties":false,"type":"object","required":["asset_id","title","description","duration_seconds","width","height"],"title":"StockAssetSearchResult"},"SubscriptionChangePlanRequest":{"properties":{"pricing_tier":{"type":"string","title":"Pricing Tier","description":"Target subscription tier_id from GET /billing/catalog."},"items":{"anyOf":[{"items":{"$ref":"#/components/schemas/LineItem"},"type":"array"},{"type":"null"}],"title":"Items","description":"Optional subscription line items (same shape as catalog ``default_items`` / ``LineItem``). When omitted or empty, uses the plan default_items from GET /billing/catalog."}},"type":"object","required":["pricing_tier"],"title":"SubscriptionChangePlanRequest"},"SubscriptionChangePlanResponse":{"properties":{"from_pricing_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From Pricing Tier"},"to_pricing_tier":{"type":"string","title":"To Pricing Tier"},"previous_items":{"items":{"$ref":"#/components/schemas/LineItem"},"type":"array","title":"Previous Items"},"new_items":{"items":{"$ref":"#/components/schemas/LineItem"},"type":"array","title":"New Items"},"applied_items":{"items":{"$ref":"#/components/schemas/LineItem"},"type":"array","title":"Applied Items"},"scheduled_items":{"items":{"$ref":"#/components/schemas/LineItem"},"type":"array","title":"Scheduled Items"},"effective_at":{"type":"string","enum":["now","period_end"],"title":"Effective At"},"status":{"type":"string","title":"Status"}},"type":"object","required":["from_pricing_tier","to_pricing_tier","previous_items","new_items","applied_items","scheduled_items","effective_at","status"],"title":"SubscriptionChangePlanResponse"},"SubscriptionTier":{"type":"string","enum":["basic","pro","expert","enterprise_user"],"title":"SubscriptionTier","description":"Named subscription offer; subscriptions that predate tiers read as basic.\n\n``enterprise_user`` is granted by hand outside Stripe (see\n:mod:`tellers_common.enterprise_user_subscription`) and ranks above every paid tier."},"TaskResponse":{"properties":{"id":{"type":"string","title":"Id"},"task_type":{"type":"string","title":"Task Type"},"status":{"type":"string","title":"Status"},"progress":{"type":"number","title":"Progress"},"asset_ids":{"items":{"type":"string"},"type":"array","title":"Asset Ids"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"ended_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ended At"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"}},"type":"object","required":["id","task_type","status","progress","asset_ids","created_at","ended_at","error_message"],"title":"TaskResponse"},"TaskStatus":{"type":"string","enum":["FAILURE","PENDING","RECEIVED","RETRY","REVOKED","STARTED","SUCCESS","PROGRESS"],"title":"TaskStatus"},"TellersAvailableOptions":{"properties":{"verbosity":{"items":{"type":"string","enum":["low","medium","high"]},"type":"array","title":"Verbosity"},"reasoning_effort":{"items":{"anyOf":[{"type":"string","enum":["none","minimal","low","medium","high","xhigh","max"]},{"type":"null"}]},"type":"array","title":"Reasoning Effort"},"compaction":{"type":"boolean","title":"Compaction","default":false},"compaction_threshold":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Compaction Threshold"}},"type":"object","required":["verbosity","reasoning_effort"],"title":"TellersAvailableOptions"},"TellersConfigAddEntitiesRequest":{"properties":{"entity_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Entity Ids"}},"type":"object","required":["entity_ids"],"title":"TellersConfigAddEntitiesRequest","description":"Request body to add one or more entities (or folders) to a tellers config's entity_to_use list."},"TellersConfigCreateRequest":{"properties":{"path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Path"},"directory_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Directory Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},"type":"object","title":"TellersConfigCreateRequest","description":"Provide either path, or directory_id + name (create config inside that folder)."},"TellersConfigCreateResponse":{"properties":{"asset_id":{"type":"string","title":"Asset Id"}},"type":"object","required":["asset_id"],"title":"TellersConfigCreateResponse"},"TellersConfigFile":{"properties":{"entity_to_use":{"items":{"type":"string"},"type":"array","title":"Entity To Use","default":[]},"analysis":{"anyOf":[{"$ref":"#/components/schemas/AssetAnalysisSettings"},{"type":"null"}]},"generate_stt_from_op_atom":{"type":"boolean","title":"Generate Stt From Op Atom","default":false},"generate_stt_from_master_clip":{"type":"boolean","title":"Generate Stt From Master Clip","default":true},"generate_stt_with_diarization":{"type":"boolean","title":"Generate Stt With Diarization","description":"Whether speech-to-text also splits the audio by speaker. On by default: it costs no more than a plain transcription, so the transcript carries a 'speakers' timeline naming who talks over each stretch of the media unless a config turns it off. The words themselves are unchanged either way.","default":true},"generate_description_from_op_atom":{"type":"boolean","title":"Generate Description From Op Atom","default":false},"generate_description_from_master_clip":{"type":"boolean","title":"Generate Description From Master Clip","default":true},"merge_strategy":{"type":"string","enum":["merge","override"],"title":"Merge Strategy","description":"How this config combines with the configs of its parent folders. 'merge' inherits them and overrides field by field; 'override' ignores them.","default":"merge"},"merge_parent_config":{"type":"boolean","title":"Merge Parent Config","description":"Deprecated and ignored. Superseded by 'merge_strategy'; it was never settable, so it is always false.","default":false,"deprecated":true}},"additionalProperties":true,"type":"object","title":"TellersConfigFile"},"TellersConfigPatchRequest":{"properties":{"analysis":{"anyOf":[{"$ref":"#/components/schemas/AssetAnalysisSettings"},{"type":"null"}]},"merge_strategy":{"anyOf":[{"type":"string","enum":["merge","override"]},{"type":"null"}],"title":"Merge Strategy"},"generate_stt_with_diarization":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Generate Stt With Diarization"}},"additionalProperties":false,"type":"object","title":"TellersConfigPatchRequest"},"TellersConfigRemoveEntitiesRequest":{"properties":{"entity_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Entity Ids"}},"type":"object","required":["entity_ids"],"title":"TellersConfigRemoveEntitiesRequest","description":"Request body to remove one or more entity ids from a tellers config's entity_to_use list."},"TellersPreset":{"properties":{"name":{"type":"string","title":"Name"},"model":{"anyOf":[{"type":"string","enum":["gpt-6-astra","gpt-6.1-sol","gpt-6.1-terra","gpt-6-sol","gpt-6-luna","gpt-5.6-sol","gpt-5.6-terra","gpt-5.6-luna","gpt-5.5-2026-04-23","gpt-5.5-pro-2026-04-23","gpt-5.4-pro-2026-03-05","gpt-5.4","gpt-5.4-mini","gpt-5.3-codex","gpt-5.2-2025-12-11","gpt-5-mini-2025-08-07","gpt-5-nano"]},{"type":"null"}],"title":"Model"},"options":{"$ref":"#/components/schemas/TellersPresetOptions"},"required_subscription_tier":{"anyOf":[{"$ref":"#/components/schemas/SubscriptionTier"},{"type":"null"}],"description":"Lowest subscription tier that can run this preset (its model and priority); null when every user can."},"subscription_locked":{"type":"boolean","title":"Subscription Locked","description":"True when the caller's plan is below `required_subscription_tier`: show the preset as an upgrade, a request with it is refused (402).","default":false}},"type":"object","required":["name","model","options"],"title":"TellersPreset"},"TellersPresetOptions":{"properties":{"reasoning_effort":{"anyOf":[{"type":"string","enum":["none","minimal","low","medium","high","xhigh","max"]},{"type":"null"}],"title":"Reasoning Effort"},"verbosity":{"anyOf":[{"type":"string","enum":["low","medium","high"]},{"type":"null"}],"title":"Verbosity"},"priority":{"anyOf":[{"type":"string","enum":["low","default","high","ultra"]},{"type":"null"}],"title":"Priority"}},"type":"object","required":["reasoning_effort","verbosity","priority"],"title":"TellersPresetOptions"},"TimeBasedMediaDescription":{"properties":{"chunks":{"items":{"$ref":"#/components/schemas/MediaChunk"},"type":"array","title":"Chunks","description":"The list of media chunks with their descriptions."}},"additionalProperties":false,"type":"object","title":"TimeBasedMediaDescription"},"TimeRange":{"properties":{"start_time_s":{"type":"integer","title":"Start Time S","description":"Start time in Elapsed seconds from 00:00 on the full target media timeline; not MM:SS labels encoded as integers, and not timecode overlays or spoken times."},"end_time_s":{"type":"integer","title":"End Time S","description":"End time in Elapsed seconds from 00:00 on the full target media timeline; not MM:SS labels encoded as integers, and not timecode overlays or spoken times. Must be greater than start_time_s."}},"additionalProperties":false,"type":"object","required":["start_time_s","end_time_s"],"title":"TimeRange","description":"Elapsed-second interval on the full target media timeline; end_time_s must be greater than start_time_s."},"TimedText":{"properties":{"start":{"type":"number","title":"Start"},"end":{"type":"number","title":"End"},"text":{"type":"string","title":"Text"}},"type":"object","required":["start","end","text"],"title":"TimedText"},"TimedTranscript":{"properties":{"text":{"type":"string","title":"Text"},"words":{"items":{"$ref":"#/components/schemas/TimedText"},"type":"array","title":"Words"},"speakers":{"anyOf":[{"items":{"$ref":"#/components/schemas/SpeakerSegment"},"type":"array"},{"type":"null"}],"title":"Speakers"},"start":{"type":"number","title":"Start","readOnly":true},"end":{"type":"number","title":"End","readOnly":true}},"type":"object","required":["text","words","start","end"],"title":"TimedTranscript"},"TimelineExportType":{"type":"string","enum":["otio","edl","aaf","final_cut_pro_7"],"title":"TimelineExportType"},"ToolCostHistoryResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"filter_index":{"type":"string","title":"Filter Index"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"tellers_tokens":{"type":"number","title":"Tellers Tokens"},"parameters":{"additionalProperties":true,"type":"object","title":"Parameters"}},"type":"object","required":["id","filter_index","created_at","tellers_tokens","parameters"],"title":"ToolCostHistoryResponse"},"ToolErrorBody":{"properties":{"detail":{"type":"string","title":"Detail","description":"Why the call was refused, in the tool's own words."}},"type":"object","required":["detail"],"title":"ToolErrorBody","description":"What a refused tool call returns: FastAPI's ``detail`` envelope.\n\nThe message is the tool's own — ``_run_tool`` passes ``ToolError.message``\nstraight through — so it already says which account limit was reached."},"ToolExposure":{"type":"string","enum":["search","flat_search","flat"],"title":"ToolExposure","description":"How much of a tool the model is shown up front.\n\nWhat deferral hides depends on whether the tool is in a namespace, and the\ndifference is the whole point of this enum. Per OpenAI's tool search guide:\na deferred tool *inside a namespace* is hidden completely — the model sees\nonly the namespace name and description — while a deferred *top-level*\nfunction still shows its name and description, so deferral there only holds\nback the parameter schema. Measured over the current 56 tools:\n\n==============  ============================  ==========\nexposure        visible up front              tokens\n==============  ============================  ==========\n``search``      11 namespace descriptions          ~0.5k\n``flat_search`` 56 tool names + descriptions      ~10.2k\n``flat``        the above plus every schema       ~44.6k\n==============  ============================  ==========\n\n``search`` uses namespace descriptions and hides the names inside them;\n``flat_search`` exposes top-level tool names and descriptions while\ndeferring only parameter schemas. ``flat`` removes deferral entirely.\n\nGrouping without deferring is deliberately not offered: namespaces exist\nto make search legible, so once every schema is up front they buy nothing\nand cost their own descriptions.\n\nThe member value is what the API accepts on the wire."},"ToolsCapabilities":{"properties":{"video":{"$ref":"#/components/schemas/VideoCapability"},"image":{"$ref":"#/components/schemas/ImageCapability"},"audio":{"$ref":"#/components/schemas/AudioCapability"},"tts":{"$ref":"#/components/schemas/TtsCapability"},"search_stock":{"$ref":"#/components/schemas/SearchStockCapability"},"search_me":{"$ref":"#/components/schemas/SearchMeCapability"},"search_voices":{"$ref":"#/components/schemas/SearchVoicesCapability"}},"additionalProperties":false,"type":"object","required":["video","image","audio","tts","search_stock","search_me","search_voices"],"title":"ToolsCapabilities","description":"Every ``/tools/*`` capability, keyed by area.\n\nGrouped rather than returned as one flat list so a client can jump straight\nto the area it cares about — ``image`` to pick a model, ``search_me`` to see\nwhich search modes exist — instead of filtering."},"TtsCapability":{"properties":{"models":{"items":{"$ref":"#/components/schemas/SpeechModelCapability"},"type":"array","title":"Models"}},"additionalProperties":false,"type":"object","required":["models"],"title":"TtsCapability"},"UpdateGroupRequest":{"properties":{"group_id":{"type":"string","title":"Group Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"is_public_read_access":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Public Read Access"}},"type":"object","required":["group_id"],"title":"UpdateGroupRequest"},"UpdateUserRequest":{"properties":{"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"},"user_preferences":{"anyOf":[{"$ref":"#/components/schemas/UserPreferences"},{"type":"null"}]}},"additionalProperties":false,"type":"object","title":"UpdateUserRequest"},"UploadPostWebhookPayload":{"properties":{"event":{"anyOf":[{"type":"string","enum":["upload_completed","social_account_connected","social_account_disconnected","social_account_reauth_required"]},{"type":"null"}],"title":"Event"},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"profile_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile Username"},"profile":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile"},"user":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"},"upload_post_user":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Upload Post User"},"user_profile":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"User Profile"},"platform":{"anyOf":[{"type":"string","enum":["bluesky","facebook","google_business","instagram","linkedin","pinterest","reddit","snapchat","threads","tiktok","tiktok_business","x","youtube"]},{"type":"null"}],"title":"Platform"},"media_type":{"anyOf":[{"type":"string","enum":["video","photo","text"]},{"type":"null"}],"title":"Media Type"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"caption":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption"},"result":{"anyOf":[{"$ref":"#/components/schemas/UploadPostWebhookResult"},{"type":"null"}]},"account_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Name"},"status":{"anyOf":[{"type":"string","enum":["connected","disconnected","reauth_required"]},{"type":"null"}],"title":"Status"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"connected_platforms":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Connected Platforms"},"platforms":{"anyOf":[{"additionalProperties":true,"type":"object"},{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Platforms"},"accounts":{"anyOf":[{"additionalProperties":true,"type":"object"},{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Accounts"}},"additionalProperties":true,"type":"object","title":"UploadPostWebhookPayload"},"UploadPostWebhookResponse":{"properties":{"ok":{"type":"boolean","title":"Ok","default":true},"updated":{"type":"boolean","title":"Updated","default":false}},"type":"object","title":"UploadPostWebhookResponse"},"UploadPostWebhookResult":{"properties":{"success":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Success"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"publish_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publish Id"},"post_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Post Id"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"additionalProperties":true,"type":"object","title":"UploadPostWebhookResult"},"UseAgentToolRequest":{"properties":{"tool_id":{"type":"string","title":"Tool Id","description":"The id of the tool to use"},"tool_arguments":{"additionalProperties":true,"type":"object","title":"Tool Arguments","description":"The arguments to pass to the tool"}},"type":"object","required":["tool_id","tool_arguments"],"title":"UseAgentToolRequest"},"UserPreferences":{"properties":{"analysis":{"anyOf":[{"$ref":"#/components/schemas/AssetAnalysisSettings"},{"type":"null"}]},"upload":{"anyOf":[{"$ref":"#/components/schemas/UserUploadPreferences"},{"type":"null"}],"description":"Upload defaults: whether each uploaded file is transcribed and described automatically."}},"additionalProperties":true,"type":"object","title":"UserPreferences"},"UserUploadPreferences":{"properties":{"generate_stt_from_op_atom":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Generate Stt From Op Atom","description":"Transcribe uploaded Avid OP-Atom MXF files. Applies when a file is uploaded. Unset falls back to the app default; a tellers-config file in the asset's folder tree that sets this field takes precedence."},"generate_stt_from_master_clip":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Generate Stt From Master Clip","description":"Transcribe uploaded media and master clips. Applies when a file is uploaded. Unset falls back to the app default; a tellers-config file in the asset's folder tree that sets this field takes precedence."},"generate_stt_with_diarization":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Generate Stt With Diarization","description":"Split upload transcripts by speaker. Applies when a file is uploaded. Unset falls back to the app default; a tellers-config file in the asset's folder tree that sets this field takes precedence."},"generate_description_from_op_atom":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Generate Description From Op Atom","description":"Generate a description for uploaded Avid OP-Atom MXF files. Applies when a file is uploaded. Unset falls back to the app default; a tellers-config file in the asset's folder tree that sets this field takes precedence."},"generate_description_from_master_clip":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Generate Description From Master Clip","description":"Generate a description for uploaded media and master clips. Applies when a file is uploaded. Unset falls back to the app default; a tellers-config file in the asset's folder tree that sets this field takes precedence."}},"additionalProperties":false,"type":"object","title":"UserUploadPreferences","description":"What runs automatically on every file the user uploads.\n\nSame fields, same meaning as on ``TellersConfigFile``. Resolution order is\nthe folder's tellers-config, then these, then the app default."},"ValidatedUserInfo":{"properties":{"email":{"type":"string","title":"Email"},"right":{"type":"string","title":"Right"},"can_share":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Can Share","description":"Whether the person may share onward: ADMIN, or a share with can_share. Null for chats, which cannot be shared onward."}},"type":"object","required":["email","right"],"title":"ValidatedUserInfo","description":"User email with their effective right on the asset."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VersionReference":{"properties":{"embedding_space":{"type":"string","title":"Embedding Space"},"embedding_strategy":{"type":"string","title":"Embedding Strategy"},"dimensionality":{"type":"integer","title":"Dimensionality"}},"type":"object","required":["embedding_space","embedding_strategy","dimensionality"],"title":"VersionReference"},"VideoCapability":{"properties":{"models":{"items":{"$ref":"#/components/schemas/VideoModelCapability"},"type":"array","title":"Models"}},"additionalProperties":false,"type":"object","required":["models"],"title":"VideoCapability"},"VideoModelCapability":{"properties":{"id":{"type":"string","title":"Id","description":"Value to pass as `model`."},"tool_id":{"type":"string","title":"Tool Id","description":"The agent tool backing this model. Join to `available_agent_tools` in GET /settings for its display name, description and pricing — kept there rather than duplicated here so there is one source of truth. Several models can share a tool."},"required":{"items":{"type":"string"},"type":"array","title":"Required","description":"Request fields this model cannot do without. Everything else in the request schema is optional."},"formats":{"items":{"type":"string"},"type":"array","title":"Formats","description":"Aspect ratios acted on."},"resolutions":{"items":{"type":"string"},"type":"array","title":"Resolutions","description":"Resolutions acted on. Empty = field ignored."},"supports_input_frame":{"type":"boolean","title":"Supports Input Frame","description":"Whether `input_frame` (start frame) is used."},"supports_output_frame":{"type":"boolean","title":"Supports Output Frame","description":"Whether `output_frame` (end frame) is used. Pair it with `input_frame`; some models reject an end frame on its own."},"supports_input_audio":{"type":"boolean","title":"Supports Input Audio","description":"Whether `input_audio` (audio reference) is used."},"supports_frame_timestamp":{"type":"boolean","title":"Supports Frame Timestamp","description":"Whether a frame reference may pin a `timestamp_seconds` / `is_last_frame`. False means only a bare asset id is accepted."},"format_requires_resolution":{"type":"boolean","title":"Format Requires Resolution","description":"This model only acts on `format` when `resolution` is also given; sent alone it would be ignored, so it is rejected.","default":false},"format_ignored_with_input_frame":{"type":"boolean","title":"Format Ignored With Input Frame","description":"This model takes its aspect ratio from `input_frame` whenever one is given; `format` sent alongside would be ignored, so the pair is rejected. Crop the frame to the shape you want instead.","default":false},"supports_audio_range":{"type":"boolean","title":"Supports Audio Range","description":"Whether `input_audio` may pin a time range. False means only a bare asset id is accepted."},"max_char":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Char","description":"Longest `prompt` accepted, in characters. None = unbounded."}},"additionalProperties":false,"type":"object","required":["id","tool_id","required","formats","resolutions","supports_input_frame","supports_output_frame","supports_input_audio","supports_frame_timestamp","supports_audio_range"],"title":"VideoModelCapability","description":"What one video model accepts, as published by ``GET /tools/models``.\n\n``formats`` / ``resolutions`` list the values the model actually *acts on*.\nAn empty list means the field is ignored and the model's native output is\nused — not that any value is accepted."}}}}