{"openapi":"3.1.0","info":{"title":"mnrvAR API","version":"1.0.0","description":"Build, publish and measure WebAR experiences from code or from an AI agent.\n\n**Authentication.** Create an API key in Settings, API keys (paid plans only). Send it on every request as `Authorization: Bearer mnrv_live_...`. A key acts as its owner and sees only that account's data. A key reaches only the operations in this document. Everything else answers 403 `endpoint_forbidden`.\n\n**Scopes.** A key carries one or more of: `experiences`, `publish`, `assets`, `analytics`, `leads`. Each operation names the scope it needs in `x-required-scope`. A key without it gets 403 `scope_missing`.\n\n**Rate limit.** 120 requests per minute per key. Past that the API answers 429 `rate_limited` with a `Retry-After` header in seconds. Importing by URL has its own limit of 30 per 10 minutes.\n\n**Errors.** Every 4xx body is JSON with `detail` (human readable) and `code` (stable, branch on it). `field` names the offending input when there is one. 402 bodies also carry `upgrade_url`, a page where the account owner can change plan. Request validation errors keep a list in `detail` and add `code` `invalid_request`, a `message` string and `field`.\n\n**Idempotency.** Create, publish, add object and import by URL accept an `Idempotency-Key` header. A repeat of the same request with the same key within 24 hours replays the first response and sets `Idempotent-Replayed: true`. Use one key per intended action and reuse it only when retrying that action.\n\n**Workflow.** List templates, create an experience, upload or import assets, score the target image, set slots, validate, publish, then read analytics and leads.\n"},"servers":[{"url":"https://mnrvar.com"}],"security":[{"bearerAuth":[]}],"paths":{"/api/v1/experiences/template-flags":{"get":{"summary":"Get Visible Templates","description":"Map of template_type to a boolean: whether this account may create that template. GET /api/v1/templates is the richer catalog and lists only creatable templates.","operationId":"get_visible_templates_api_v1_experiences_template_flags_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing, malformed or revoked API key. Code invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"The key lacks the required scope (scope_missing) or the route is not open to keys (endpoint_forbidden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"429":{"description":"Rate limit reached. Wait Retry-After seconds. Code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}},"security":[{"bearerAuth":["experiences"]}],"x-required-scope":"experiences"}},"/api/v1/experiences/":{"get":{"summary":"List Experiences","description":"Every experience on the account with its full config. The response can be large. Prefer GET /api/v1/experiences/summary.","operationId":"list_experiences_api_v1_experiences__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ExperienceResponse"},"type":"array","title":"Response List Experiences Api V1 Experiences  Get"}}}},"401":{"description":"Missing, malformed or revoked API key. Code invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"The key lacks the required scope (scope_missing) or the route is not open to keys (endpoint_forbidden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"429":{"description":"Rate limit reached. Wait Retry-After seconds. Code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}},"security":[{"bearerAuth":["experiences"]}],"x-required-scope":"experiences"},"post":{"summary":"Create Experience","description":"Create an empty draft experience from a template. Fill it with the slot and object routes, then validate and publish.\nCounts against the plan's experience limit and template access, otherwise 402 with an upgrade_url.\nSend an Idempotency-Key header to make retries safe.","operationId":"create_experience_api_v1_experiences__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExperienceCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExperienceResponse"}}}},"401":{"description":"Missing, malformed or revoked API key. Code invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"402":{"description":"A plan, quota or add-on gate blocks the request. The body carries upgrade_url.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"The key lacks the required scope (scope_missing) or the route is not open to keys (endpoint_forbidden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"409":{"description":"An earlier request with the same Idempotency-Key is still running. Retry after the Retry-After seconds. Code idempotency_in_progress.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"422":{"description":"The request is not valid. Either an error body with a stable code, or a request validation error whose detail is a list.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ErrorBody"},{"$ref":"#/components/schemas/ValidationErrorBody"}]}}}},"429":{"description":"Rate limit reached. Wait Retry-After seconds. Code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}},"security":[{"bearerAuth":["experiences"]}],"x-required-scope":"experiences","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}]}},"/api/v1/experiences/summary":{"get":{"summary":"List Experience Summaries","description":"Paged experience list without config: id, name, template_type, status, hosted_url, scan_count and timestamps. Newest first. Pass next_cursor back as cursor for the next page.","operationId":"list_experience_summaries_api_v1_experiences_summary_get","security":[{"bearerAuth":["experiences"]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Page size, 1 to 100.","default":50,"title":"Limit"},"description":"Page size, 1 to 100."},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"description":"The next_cursor of the previous page. Omit for the first page.","title":"Cursor"},"description":"The next_cursor of the previous page. Omit for the first page."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExperienceSummaryPage"}}}},"401":{"description":"Missing, malformed or revoked API key. Code invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"The key lacks the required scope (scope_missing) or the route is not open to keys (endpoint_forbidden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"The request is not valid. Either an error body with a stable code, or a request validation error whose detail is a list.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ErrorBody"},{"$ref":"#/components/schemas/ValidationErrorBody"}]}}}},"429":{"description":"Rate limit reached. Wait Retry-After seconds. Code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}},"x-required-scope":"experiences"}},"/api/v1/experiences/{experience_id}":{"get":{"summary":"Get Experience","description":"One experience with its full config, status and hosted_url.","operationId":"get_experience_api_v1_experiences__experience_id__get","security":[{"bearerAuth":["experiences"]}],"parameters":[{"name":"experience_id","in":"path","required":true,"schema":{"type":"string","title":"Experience Id"},"description":"Id of an experience on the account, as returned when it was created."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExperienceResponse"}}}},"401":{"description":"Missing, malformed or revoked API key. Code invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"The key lacks the required scope (scope_missing) or the route is not open to keys (endpoint_forbidden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"404":{"description":"The experience or other resource does not exist for this account. Code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"The request is not valid. Either an error body with a stable code, or a request validation error whose detail is a list.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ErrorBody"},{"$ref":"#/components/schemas/ValidationErrorBody"}]}}}},"429":{"description":"Rate limit reached. Wait Retry-After seconds. Code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}},"x-required-scope":"experiences"},"patch":{"summary":"Update Experience","description":"Change an experience. Only the fields you send are changed. When you send config it replaces the whole config,\nso read the experience first and send it back with your change. The slot and object routes are the safer way to fill an experience.\nChanges to a live experience reach visitors only after the next publish.","operationId":"update_experience_api_v1_experiences__experience_id__patch","security":[{"bearerAuth":["experiences"]}],"parameters":[{"name":"experience_id","in":"path","required":true,"schema":{"type":"string","title":"Experience Id"},"description":"Id of an experience on the account, as returned when it was created."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExperienceUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExperienceResponse"}}}},"401":{"description":"Missing, malformed or revoked API key. Code invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"The key lacks the required scope (scope_missing) or the route is not open to keys (endpoint_forbidden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"404":{"description":"The experience or other resource does not exist for this account. Code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"The request is not valid. Either an error body with a stable code, or a request validation error whose detail is a list.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ErrorBody"},{"$ref":"#/components/schemas/ValidationErrorBody"}]}}}},"429":{"description":"Rate limit reached. Wait Retry-After seconds. Code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}},"x-required-scope":"experiences"},"delete":{"summary":"Delete Experience","description":"Permanently delete an experience with its draft and published files and its scan events. Returns 204.","operationId":"delete_experience_api_v1_experiences__experience_id__delete","security":[{"bearerAuth":["experiences"]}],"parameters":[{"name":"experience_id","in":"path","required":true,"schema":{"type":"string","title":"Experience Id"},"description":"Id of an experience on the account, as returned when it was created."}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Missing, malformed or revoked API key. Code invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"The key lacks the required scope (scope_missing) or the route is not open to keys (endpoint_forbidden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"404":{"description":"The experience or other resource does not exist for this account. Code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"The request is not valid. Either an error body with a stable code, or a request validation error whose detail is a list.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ErrorBody"},{"$ref":"#/components/schemas/ValidationErrorBody"}]}}}},"429":{"description":"Rate limit reached. Wait Retry-After seconds. Code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}},"x-required-scope":"experiences"}},"/api/v1/experiences/{experience_id}/duplicate":{"post":{"summary":"Duplicate Experience","description":"Copy an experience into a new draft. Asset copying runs in the background,\nso the returned row comes back as 'duplicating' and flips to 'draft' when\nits assets land. Publish-limit still not checked, but the total-experience\ncap is.","operationId":"duplicate_experience_api_v1_experiences__experience_id__duplicate_post","security":[{"bearerAuth":["experiences"]}],"parameters":[{"name":"experience_id","in":"path","required":true,"schema":{"type":"string","title":"Experience Id"},"description":"Id of an experience on the account, as returned when it was created."}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExperienceResponse"}}}},"401":{"description":"Missing, malformed or revoked API key. Code invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"402":{"description":"A plan, quota or add-on gate blocks the request. The body carries upgrade_url.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"The key lacks the required scope (scope_missing) or the route is not open to keys (endpoint_forbidden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"404":{"description":"The experience or other resource does not exist for this account. Code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"The request is not valid. Either an error body with a stable code, or a request validation error whose detail is a list.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ErrorBody"},{"$ref":"#/components/schemas/ValidationErrorBody"}]}}}},"429":{"description":"Rate limit reached. Wait Retry-After seconds. Code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}},"x-required-scope":"experiences"}},"/api/v1/experiences/{experience_id}/unpublish":{"post":{"summary":"Unpublish Experience","description":"Take a live experience offline and return it to draft. Published files are removed. The draft and its config are kept, and publishing again makes it live.","operationId":"unpublish_experience_api_v1_experiences__experience_id__unpublish_post","security":[{"bearerAuth":["publish"]}],"parameters":[{"name":"experience_id","in":"path","required":true,"schema":{"type":"string","title":"Experience Id"},"description":"Id of an experience on the account, as returned when it was created."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExperienceResponse"}}}},"401":{"description":"Missing, malformed or revoked API key. Code invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"The key lacks the required scope (scope_missing) or the route is not open to keys (endpoint_forbidden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"404":{"description":"The experience or other resource does not exist for this account. Code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"The request is not valid. Either an error body with a stable code, or a request validation error whose detail is a list.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ErrorBody"},{"$ref":"#/components/schemas/ValidationErrorBody"}]}}}},"429":{"description":"Rate limit reached. Wait Retry-After seconds. Code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}},"x-required-scope":"publish"}},"/api/v1/experiences/{experience_id}/geo-fences":{"get":{"summary":"List Linked Fences","description":"List the geo fences linked to this experience.","operationId":"list_linked_fences_api_v1_experiences__experience_id__geo_fences_get","security":[{"bearerAuth":["experiences"]}],"parameters":[{"name":"experience_id","in":"path","required":true,"schema":{"type":"string","title":"Experience Id"},"description":"Id of an experience on the account, as returned when it was created."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/GeoFenceResponse"},"title":"Response List Linked Fences Api V1 Experiences  Experience Id  Geo Fences Get"}}}},"401":{"description":"Missing, malformed or revoked API key. Code invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"The key lacks the required scope (scope_missing) or the route is not open to keys (endpoint_forbidden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"404":{"description":"The experience or other resource does not exist for this account. Code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"The request is not valid. Either an error body with a stable code, or a request validation error whose detail is a list.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ErrorBody"},{"$ref":"#/components/schemas/ValidationErrorBody"}]}}}},"429":{"description":"Rate limit reached. Wait Retry-After seconds. Code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}},"x-required-scope":"experiences"}},"/api/v1/experiences/{experience_id}/geo-fences/{fence_id}":{"post":{"summary":"Link Fence To Experience","description":"Link an existing geo fence from the account library to this experience. Fences are created in the dashboard, not through the API.","operationId":"link_fence_to_experience_api_v1_experiences__experience_id__geo_fences__fence_id__post","security":[{"bearerAuth":["experiences"]}],"parameters":[{"name":"experience_id","in":"path","required":true,"schema":{"type":"string","title":"Experience Id"},"description":"Id of an experience on the account, as returned when it was created."},{"name":"fence_id","in":"path","required":true,"schema":{"type":"string","title":"Fence Id"},"description":"Id of a geo fence in the account library."}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Missing, malformed or revoked API key. Code invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"The key lacks the required scope (scope_missing) or the route is not open to keys (endpoint_forbidden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"404":{"description":"The experience or other resource does not exist for this account. Code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"The request is not valid. Either an error body with a stable code, or a request validation error whose detail is a list.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ErrorBody"},{"$ref":"#/components/schemas/ValidationErrorBody"}]}}}},"429":{"description":"Rate limit reached. Wait Retry-After seconds. Code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}},"x-required-scope":"experiences"},"delete":{"summary":"Unlink Fence From Experience","description":"Remove the link between a geo fence and this experience. The fence itself stays in the library.","operationId":"unlink_fence_from_experience_api_v1_experiences__experience_id__geo_fences__fence_id__delete","security":[{"bearerAuth":["experiences"]}],"parameters":[{"name":"experience_id","in":"path","required":true,"schema":{"type":"string","title":"Experience Id"},"description":"Id of an experience on the account, as returned when it was created."},{"name":"fence_id","in":"path","required":true,"schema":{"type":"string","title":"Fence Id"},"description":"Id of a geo fence in the account library."}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Missing, malformed or revoked API key. Code invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"The key lacks the required scope (scope_missing) or the route is not open to keys (endpoint_forbidden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"404":{"description":"The experience or other resource does not exist for this account. Code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"The request is not valid. Either an error body with a stable code, or a request validation error whose detail is a list.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ErrorBody"},{"$ref":"#/components/schemas/ValidationErrorBody"}]}}}},"429":{"description":"Rate limit reached. Wait Retry-After seconds. Code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}},"x-required-scope":"experiences"}},"/api/v1/experiences/{experience_id}/publish":{"post":{"summary":"Publish Experience","description":"Publish the experience. It goes live at the hosted_url in the response. Publishing again updates a live experience.\nRun POST /api/v1/experiences/{experience_id}/validate first. Plan and add-on quotas answer 402 with a code and an upgrade_url.\nSend an Idempotency-Key header to make retries safe.","operationId":"publish_experience_api_v1_experiences__experience_id__publish_post","security":[{"bearerAuth":["publish"]}],"parameters":[{"name":"experience_id","in":"path","required":true,"schema":{"type":"string","title":"Experience Id"},"description":"Id of an experience on the account, as returned when it was created."},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExperienceResponse"}}}},"401":{"description":"Missing, malformed or revoked API key. Code invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"402":{"description":"A plan, quota or add-on gate blocks the request. The body carries upgrade_url.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"The key lacks the required scope (scope_missing) or the route is not open to keys (endpoint_forbidden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"404":{"description":"The experience or other resource does not exist for this account. Code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"409":{"description":"An earlier request with the same Idempotency-Key is still running. Retry after the Retry-After seconds. Code idempotency_in_progress.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"422":{"description":"The request is not valid. Either an error body with a stable code, or a request validation error whose detail is a list.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ErrorBody"},{"$ref":"#/components/schemas/ValidationErrorBody"}]}}}},"429":{"description":"Rate limit reached. Wait Retry-After seconds. Code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}},"x-required-scope":"publish"}},"/api/v1/experiences/{experience_id}/validate":{"post":{"summary":"Validate Experience For Publish","description":"Dry run of publish. Returns ok and a list of problems, each with a code, message and optional field, covering everything that would block publishing. Writes nothing.","operationId":"validate_experience_for_publish_api_v1_experiences__experience_id__validate_post","security":[{"bearerAuth":["experiences"]}],"parameters":[{"name":"experience_id","in":"path","required":true,"schema":{"type":"string","title":"Experience Id"},"description":"Id of an experience on the account, as returned when it was created."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishValidationResult"}}}},"401":{"description":"Missing, malformed or revoked API key. Code invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"The key lacks the required scope (scope_missing) or the route is not open to keys (endpoint_forbidden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"404":{"description":"The experience or other resource does not exist for this account. Code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"The request is not valid. Either an error body with a stable code, or a request validation error whose detail is a list.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ErrorBody"},{"$ref":"#/components/schemas/ValidationErrorBody"}]}}}},"429":{"description":"Rate limit reached. Wait Retry-After seconds. Code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}},"x-required-scope":"experiences"}},"/api/v1/template-capabilities":{"get":{"summary":"Get Template Capabilities","description":"Per-template feature flags such as lot_collection, links and qr_params, keyed by template_type. GET /api/v1/templates returns the same flags per template.","operationId":"get_template_capabilities_api_v1_template_capabilities_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing, malformed or revoked API key. Code invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"The key lacks the required scope (scope_missing) or the route is not open to keys (endpoint_forbidden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"429":{"description":"Rate limit reached. Wait Retry-After seconds. Code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}},"security":[{"bearerAuth":["experiences"]}],"x-required-scope":"experiences"}},"/api/v1/experiences/{experience_id}/slots/{slot_id}":{"post":{"summary":"Set Slot","description":"Fill a template slot with an uploaded asset. Replaces the slot if it is already filled.","operationId":"set_slot_api_v1_experiences__experience_id__slots__slot_id__post","security":[{"bearerAuth":["experiences"]}],"parameters":[{"name":"experience_id","in":"path","required":true,"schema":{"type":"string","title":"Experience Id"},"description":"Id of an experience on the account, as returned when it was created."},{"name":"slot_id","in":"path","required":true,"schema":{"type":"string","title":"Slot Id"},"description":"Template slot id, from the slots list of GET /api/v1/templates."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetSlotRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetSlotResponse"}}}},"401":{"description":"Missing, malformed or revoked API key. Code invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"The key lacks the required scope (scope_missing) or the route is not open to keys (endpoint_forbidden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"404":{"description":"The experience or other resource does not exist for this account. Code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"The request is not valid. Either an error body with a stable code, or a request validation error whose detail is a list.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ErrorBody"},{"$ref":"#/components/schemas/ValidationErrorBody"}]}}}},"429":{"description":"Rate limit reached. Wait Retry-After seconds. Code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}},"x-required-scope":"experiences"},"delete":{"summary":"Clear Slot","description":"Empty a template slot. Safe to repeat. Clearing the video slot of a video_on_surface experience also removes its video plane.","operationId":"clear_slot_api_v1_experiences__experience_id__slots__slot_id__delete","security":[{"bearerAuth":["experiences"]}],"parameters":[{"name":"experience_id","in":"path","required":true,"schema":{"type":"string","title":"Experience Id"},"description":"Id of an experience on the account, as returned when it was created."},{"name":"slot_id","in":"path","required":true,"schema":{"type":"string","title":"Slot Id"},"description":"Template slot id, from the slots list of GET /api/v1/templates."}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Missing, malformed or revoked API key. Code invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"The key lacks the required scope (scope_missing) or the route is not open to keys (endpoint_forbidden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"404":{"description":"The experience or other resource does not exist for this account. Code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"The request is not valid. Either an error body with a stable code, or a request validation error whose detail is a list.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ErrorBody"},{"$ref":"#/components/schemas/ValidationErrorBody"}]}}}},"429":{"description":"Rate limit reached. Wait Retry-After seconds. Code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}},"x-required-scope":"experiences"}},"/api/v1/experiences/{experience_id}/objects":{"post":{"summary":"Add Object","description":"Add an uploaded 3D model to the experience with the editor's default transform. Send an Idempotency-Key header to make retries safe.","operationId":"add_object_api_v1_experiences__experience_id__objects_post","security":[{"bearerAuth":["experiences"]}],"parameters":[{"name":"experience_id","in":"path","required":true,"schema":{"type":"string","title":"Experience Id"},"description":"Id of an experience on the account, as returned when it was created."},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddObjectRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddObjectResponse"}}}},"401":{"description":"Missing, malformed or revoked API key. Code invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"The key lacks the required scope (scope_missing) or the route is not open to keys (endpoint_forbidden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"404":{"description":"The experience or other resource does not exist for this account. Code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"409":{"description":"An earlier request with the same Idempotency-Key is still running. Retry after the Retry-After seconds. Code idempotency_in_progress.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"422":{"description":"The request is not valid. Either an error body with a stable code, or a request validation error whose detail is a list.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ErrorBody"},{"$ref":"#/components/schemas/ValidationErrorBody"}]}}}},"429":{"description":"Rate limit reached. Wait Retry-After seconds. Code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}},"x-required-scope":"experiences"}},"/api/v1/experiences/{experience_id}/objects/{object_id}":{"delete":{"summary":"Remove Object","description":"Remove an object, and any child objects attached to it. Returns 404 not_found when the object does not exist.","operationId":"remove_object_api_v1_experiences__experience_id__objects__object_id__delete","security":[{"bearerAuth":["experiences"]}],"parameters":[{"name":"experience_id","in":"path","required":true,"schema":{"type":"string","title":"Experience Id"},"description":"Id of an experience on the account, as returned when it was created."},{"name":"object_id","in":"path","required":true,"schema":{"type":"string","title":"Object Id"},"description":"Id of an object in the experience, as returned by the add object route."}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Missing, malformed or revoked API key. Code invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"The key lacks the required scope (scope_missing) or the route is not open to keys (endpoint_forbidden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"404":{"description":"The experience or other resource does not exist for this account. Code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"The request is not valid. Either an error body with a stable code, or a request validation error whose detail is a list.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ErrorBody"},{"$ref":"#/components/schemas/ValidationErrorBody"}]}}}},"429":{"description":"Rate limit reached. Wait Retry-After seconds. Code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}},"x-required-scope":"experiences"}},"/api/v1/assets/":{"delete":{"summary":"Delete Asset","description":"Delete a draft asset by its cdn_path. Only files under drafts/ that belong to one of your experiences can be deleted.","operationId":"delete_asset_api_v1_assets__delete","security":[{"bearerAuth":["assets"]}],"parameters":[{"name":"cdn_path","in":"query","required":true,"schema":{"type":"string","description":"The cdn_path of a draft asset, under drafts/{experience_id}/.","title":"Cdn Path"},"description":"The cdn_path of a draft asset, under drafts/{experience_id}/."}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Missing, malformed or revoked API key. Code invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"The key lacks the required scope (scope_missing) or the route is not open to keys (endpoint_forbidden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"404":{"description":"The experience or other resource does not exist for this account. Code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"The request is not valid. Either an error body with a stable code, or a request validation error whose detail is a list.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ErrorBody"},{"$ref":"#/components/schemas/ValidationErrorBody"}]}}}},"429":{"description":"Rate limit reached. Wait Retry-After seconds. Code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}},"x-required-scope":"assets"}},"/api/v1/assets/preview-url":{"get":{"summary":"Get Asset Preview Url","description":"Return a signed URL, valid for one hour, for viewing a draft asset. Returns {url}.","operationId":"get_asset_preview_url_api_v1_assets_preview_url_get","security":[{"bearerAuth":["assets"]}],"parameters":[{"name":"cdn_path","in":"query","required":true,"schema":{"type":"string","description":"The cdn_path of a draft asset, under drafts/{experience_id}/.","title":"Cdn Path"},"description":"The cdn_path of a draft asset, under drafts/{experience_id}/."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing, malformed or revoked API key. Code invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"The key lacks the required scope (scope_missing) or the route is not open to keys (endpoint_forbidden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"The request is not valid. Either an error body with a stable code, or a request validation error whose detail is a list.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ErrorBody"},{"$ref":"#/components/schemas/ValidationErrorBody"}]}}}},"429":{"description":"Rate limit reached. Wait Retry-After seconds. Code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}},"x-required-scope":"assets"}},"/api/v1/assets/upload":{"post":{"summary":"Upload Asset","description":"Upload an image, audio, video or 3D model file for an experience, as multipart form data.\nAllowed extensions and size limits per slot are listed by GET /api/v1/templates.\nReturns the cdn_path to pass to the set slot or add object routes.","operationId":"upload_asset_api_v1_assets_upload_post","security":[{"bearerAuth":["assets"]}],"parameters":[{"name":"experience_id","in":"query","required":true,"schema":{"type":"string","description":"The experience the file is stored under as a draft asset.","title":"Experience Id"},"description":"The experience the file is stored under as a draft asset."}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_asset_api_v1_assets_upload_post"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetResponse"}}}},"401":{"description":"Missing, malformed or revoked API key. Code invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"The key lacks the required scope (scope_missing) or the route is not open to keys (endpoint_forbidden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"The request is not valid. Either an error body with a stable code, or a request validation error whose detail is a list.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ErrorBody"},{"$ref":"#/components/schemas/ValidationErrorBody"}]}}}},"429":{"description":"Rate limit reached. Wait Retry-After seconds. Code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}},"x-required-scope":"assets"}},"/api/v1/assets/target-quality":{"post":{"summary":"Score Target Quality","description":"Score how well an image will track as an AR target. Send exactly one of file or cdn_path. grade is poor, fair, good or excellent, and issues lists what to improve.","operationId":"score_target_quality_api_v1_assets_target_quality_post","security":[{"bearerAuth":["assets"]}],"parameters":[{"name":"cdn_path","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The cdn_path of a draft image of your own, under drafts/{experience_id}/. Send this or file, not both.","title":"Cdn Path"},"description":"The cdn_path of a draft image of your own, under drafts/{experience_id}/. Send this or file, not both."}],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_score_target_quality_api_v1_assets_target_quality_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TargetQualityReport"}}}},"401":{"description":"Missing, malformed or revoked API key. Code invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"The key lacks the required scope (scope_missing) or the route is not open to keys (endpoint_forbidden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"The request is not valid. Either an error body with a stable code, or a request validation error whose detail is a list.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ErrorBody"},{"$ref":"#/components/schemas/ValidationErrorBody"}]}}}},"429":{"description":"Rate limit reached. Wait Retry-After seconds. Code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}},"x-required-scope":"assets"}},"/api/v1/assets/import-url":{"post":{"summary":"Import Asset From Url","description":"Make the server download a public https file and store it as a draft asset, exactly like an upload.\nPrivate, loopback and link-local addresses are refused. Limited to 30 imports per 10 minutes per account.\nSend an Idempotency-Key header to make retries safe.","operationId":"import_asset_from_url_api_v1_assets_import_url_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportUrlRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportUrlResponse"}}}},"401":{"description":"Missing, malformed or revoked API key. Code invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"The key lacks the required scope (scope_missing) or the route is not open to keys (endpoint_forbidden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"409":{"description":"An earlier request with the same Idempotency-Key is still running. Retry after the Retry-After seconds. Code idempotency_in_progress.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"422":{"description":"The request is not valid. Either an error body with a stable code, or a request validation error whose detail is a list.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ErrorBody"},{"$ref":"#/components/schemas/ValidationErrorBody"}]}}}},"429":{"description":"Rate limit reached. Wait Retry-After seconds. Code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}},"security":[{"bearerAuth":["assets"]}],"x-required-scope":"assets","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}]}},"/api/v1/analytics/conversions":{"get":{"summary":"Get Conversions","description":"Total CTA button clicks and a breakdown by action type for the period.","operationId":"get_conversions_api_v1_analytics_conversions_get","security":[{"bearerAuth":["analytics"]}],"parameters":[{"name":"experience_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only include this experience. Omit to include every experience on the account.","title":"Experience Id"},"description":"Only include this experience. Omit to include every experience on the account."},{"name":"period","in":"query","required":false,"schema":{"enum":["today","7d","30d"],"type":"string","description":"Time window ending now. One of today, 7d, 30d.","default":"7d","title":"Period"},"description":"Time window ending now. One of today, 7d, 30d."},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only include traffic from this link source, the ?src= slug of one of the experience links. Omit for all traffic.","title":"Source"},"description":"Only include traffic from this link source, the ?src= slug of one of the experience links. Omit for all traffic."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing, malformed or revoked API key. Code invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"The key lacks the required scope (scope_missing) or the route is not open to keys (endpoint_forbidden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"The request is not valid. Either an error body with a stable code, or a request validation error whose detail is a list.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ErrorBody"},{"$ref":"#/components/schemas/ValidationErrorBody"}]}}}},"429":{"description":"Rate limit reached. Wait Retry-After seconds. Code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}},"x-required-scope":"analytics"}},"/api/v1/analytics/summary":{"get":{"summary":"Get Summary","description":"Scan counts, unique sessions, a per-experience breakdown and a timeline for the period.","operationId":"get_summary_api_v1_analytics_summary_get","security":[{"bearerAuth":["analytics"]}],"parameters":[{"name":"experience_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only include this experience. Omit to include every experience on the account.","title":"Experience Id"},"description":"Only include this experience. Omit to include every experience on the account."},{"name":"period","in":"query","required":false,"schema":{"enum":["today","7d","30d"],"type":"string","description":"Time window ending now. One of today, 7d, 30d.","default":"7d","title":"Period"},"description":"Time window ending now. One of today, 7d, 30d."},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only include traffic from this link source, the ?src= slug of one of the experience links. Omit for all traffic.","title":"Source"},"description":"Only include traffic from this link source, the ?src= slug of one of the experience links. Omit for all traffic."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing, malformed or revoked API key. Code invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"The key lacks the required scope (scope_missing) or the route is not open to keys (endpoint_forbidden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"The request is not valid. Either an error body with a stable code, or a request validation error whose detail is a list.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ErrorBody"},{"$ref":"#/components/schemas/ValidationErrorBody"}]}}}},"429":{"description":"Rate limit reached. Wait Retry-After seconds. Code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}},"x-required-scope":"analytics"}},"/api/v1/analytics/surveys":{"get":{"summary":"Get Surveys","description":"Every survey built into the account's experiences, with per-option response counts. Reading is never plan gated.","operationId":"get_surveys_api_v1_analytics_surveys_get","security":[{"bearerAuth":["analytics"]}],"parameters":[{"name":"experience_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only include this experience. Omit to include every experience on the account.","title":"Experience Id"},"description":"Only include this experience. Omit to include every experience on the account."},{"name":"period","in":"query","required":false,"schema":{"enum":["today","7d","30d","all"],"type":"string","description":"Time window ending now. One of today, 7d, 30d, all.","default":"all","title":"Period"},"description":"Time window ending now. One of today, 7d, 30d, all."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing, malformed or revoked API key. Code invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"The key lacks the required scope (scope_missing) or the route is not open to keys (endpoint_forbidden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"The request is not valid. Either an error body with a stable code, or a request validation error whose detail is a list.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ErrorBody"},{"$ref":"#/components/schemas/ValidationErrorBody"}]}}}},"429":{"description":"Rate limit reached. Wait Retry-After seconds. Code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}},"x-required-scope":"analytics"}},"/api/v1/analytics/surveys/export":{"get":{"summary":"Export Surveys","description":"Survey results as a CSV file, one row per answer option.","operationId":"export_surveys_api_v1_analytics_surveys_export_get","security":[{"bearerAuth":["analytics"]}],"parameters":[{"name":"experience_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only include this experience. Omit to include every experience on the account.","title":"Experience Id"},"description":"Only include this experience. Omit to include every experience on the account."},{"name":"period","in":"query","required":false,"schema":{"enum":["today","7d","30d","all"],"type":"string","description":"Time window ending now. One of today, 7d, 30d, all.","default":"all","title":"Period"},"description":"Time window ending now. One of today, 7d, 30d, all."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing, malformed or revoked API key. Code invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"The key lacks the required scope (scope_missing) or the route is not open to keys (endpoint_forbidden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"The request is not valid. Either an error body with a stable code, or a request validation error whose detail is a list.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ErrorBody"},{"$ref":"#/components/schemas/ValidationErrorBody"}]}}}},"429":{"description":"Rate limit reached. Wait Retry-After seconds. Code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}},"x-required-scope":"analytics"}},"/api/v1/analytics/export":{"get":{"summary":"Export Raw","description":"Raw scan events as a CSV file. Needs a plan with full analytics, otherwise 402 plan_required.","operationId":"export_raw_api_v1_analytics_export_get","security":[{"bearerAuth":["analytics"]}],"parameters":[{"name":"experience_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only include this experience. Omit to include every experience on the account.","title":"Experience Id"},"description":"Only include this experience. Omit to include every experience on the account."},{"name":"period","in":"query","required":false,"schema":{"enum":["today","7d","30d"],"type":"string","description":"Time window ending now. One of today, 7d, 30d.","default":"7d","title":"Period"},"description":"Time window ending now. One of today, 7d, 30d."},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only include traffic from this link source, the ?src= slug of one of the experience links. Omit for all traffic.","title":"Source"},"description":"Only include traffic from this link source, the ?src= slug of one of the experience links. Omit for all traffic."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing, malformed or revoked API key. Code invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"The key lacks the required scope (scope_missing) or the route is not open to keys (endpoint_forbidden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"The request is not valid. Either an error body with a stable code, or a request validation error whose detail is a list.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ErrorBody"},{"$ref":"#/components/schemas/ValidationErrorBody"}]}}}},"429":{"description":"Rate limit reached. Wait Retry-After seconds. Code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}},"x-required-scope":"analytics"}},"/api/v1/analytics/geo":{"get":{"summary":"Get Geo","description":"Scan locations binned to a 0.01 degree grid, for heatmaps. Needs a plan with full analytics, otherwise 402 plan_required.","operationId":"get_geo_api_v1_analytics_geo_get","security":[{"bearerAuth":["analytics"]}],"parameters":[{"name":"experience_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only include this experience. Omit to include every experience on the account.","title":"Experience Id"},"description":"Only include this experience. Omit to include every experience on the account."},{"name":"period","in":"query","required":false,"schema":{"enum":["today","7d","30d"],"type":"string","description":"Time window ending now. One of today, 7d, 30d.","default":"7d","title":"Period"},"description":"Time window ending now. One of today, 7d, 30d."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing, malformed or revoked API key. Code invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"The key lacks the required scope (scope_missing) or the route is not open to keys (endpoint_forbidden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"The request is not valid. Either an error body with a stable code, or a request validation error whose detail is a list.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ErrorBody"},{"$ref":"#/components/schemas/ValidationErrorBody"}]}}}},"429":{"description":"Rate limit reached. Wait Retry-After seconds. Code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}},"x-required-scope":"analytics"}},"/api/v1/analytics/links":{"get":{"summary":"Get Links","description":"Per-link attribution for one experience: scans, sessions, clicks and leads for each ?src= link. The row whose source is null is direct traffic.","operationId":"get_links_api_v1_analytics_links_get","security":[{"bearerAuth":["analytics"]}],"parameters":[{"name":"experience_id","in":"query","required":true,"schema":{"type":"string","description":"The experience to report on.","title":"Experience Id"},"description":"The experience to report on."},{"name":"period","in":"query","required":false,"schema":{"enum":["today","7d","30d"],"type":"string","description":"Time window ending now. One of today, 7d, 30d.","default":"7d","title":"Period"},"description":"Time window ending now. One of today, 7d, 30d."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing, malformed or revoked API key. Code invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"The key lacks the required scope (scope_missing) or the route is not open to keys (endpoint_forbidden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"The request is not valid. Either an error body with a stable code, or a request validation error whose detail is a list.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ErrorBody"},{"$ref":"#/components/schemas/ValidationErrorBody"}]}}}},"429":{"description":"Rate limit reached. Wait Retry-After seconds. Code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}},"x-required-scope":"analytics"}},"/api/v1/folders/":{"get":{"summary":"List Folders","description":"List the account's folders.","operationId":"list_folders_api_v1_folders__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/FolderResponse"},"type":"array","title":"Response List Folders Api V1 Folders  Get"}}}},"401":{"description":"Missing, malformed or revoked API key. Code invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"The key lacks the required scope (scope_missing) or the route is not open to keys (endpoint_forbidden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"429":{"description":"Rate limit reached. Wait Retry-After seconds. Code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}},"security":[{"bearerAuth":["experiences"]}],"x-required-scope":"experiences"},"post":{"summary":"Create Folder","description":"Create a folder for organising experiences. Move an experience into it with PATCH /api/v1/experiences/{experience_id} and folder_id.","operationId":"create_folder_api_v1_folders__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderResponse"}}}},"401":{"description":"Missing, malformed or revoked API key. Code invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"The key lacks the required scope (scope_missing) or the route is not open to keys (endpoint_forbidden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"The request is not valid. Either an error body with a stable code, or a request validation error whose detail is a list.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ErrorBody"},{"$ref":"#/components/schemas/ValidationErrorBody"}]}}}},"429":{"description":"Rate limit reached. Wait Retry-After seconds. Code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}},"security":[{"bearerAuth":["experiences"]}],"x-required-scope":"experiences"}},"/api/v1/folders/{folder_id}":{"patch":{"summary":"Update Folder","description":"Rename a folder. Send the new name. Returns the folder.","operationId":"update_folder_api_v1_folders__folder_id__patch","security":[{"bearerAuth":["experiences"]}],"parameters":[{"name":"folder_id","in":"path","required":true,"schema":{"type":"string","title":"Folder Id"},"description":"Id of a folder on the account."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderResponse"}}}},"401":{"description":"Missing, malformed or revoked API key. Code invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"The key lacks the required scope (scope_missing) or the route is not open to keys (endpoint_forbidden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"404":{"description":"The experience or other resource does not exist for this account. Code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"The request is not valid. Either an error body with a stable code, or a request validation error whose detail is a list.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ErrorBody"},{"$ref":"#/components/schemas/ValidationErrorBody"}]}}}},"429":{"description":"Rate limit reached. Wait Retry-After seconds. Code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}},"x-required-scope":"experiences"},"delete":{"summary":"Delete Folder","description":"Delete a folder. Experiences inside it are kept and move to the root.","operationId":"delete_folder_api_v1_folders__folder_id__delete","security":[{"bearerAuth":["experiences"]}],"parameters":[{"name":"folder_id","in":"path","required":true,"schema":{"type":"string","title":"Folder Id"},"description":"Id of a folder on the account."}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Missing, malformed or revoked API key. Code invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"The key lacks the required scope (scope_missing) or the route is not open to keys (endpoint_forbidden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"404":{"description":"The experience or other resource does not exist for this account. Code not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"The request is not valid. Either an error body with a stable code, or a request validation error whose detail is a list.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ErrorBody"},{"$ref":"#/components/schemas/ValidationErrorBody"}]}}}},"429":{"description":"Rate limit reached. Wait Retry-After seconds. Code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}},"x-required-scope":"experiences"}},"/api/v1/leads":{"get":{"summary":"List Leads","description":"Paginated list of leads submitted through the account's published experiences. Not plan gated.","operationId":"list_leads_api_v1_leads_get","security":[{"bearerAuth":["leads"]}],"parameters":[{"name":"experience_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only include this experience. Omit to include every experience on the account.","title":"Experience Id"},"description":"Only include this experience. Omit to include every experience on the account."},{"name":"period","in":"query","required":false,"schema":{"enum":["today","7d","30d"],"type":"string","description":"Time window ending now. One of today, 7d, 30d.","default":"30d","title":"Period"},"description":"Time window ending now. One of today, 7d, 30d."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","description":"Page size.","default":50,"title":"Limit"},"description":"Page size."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","description":"Number of leads to skip, for paging.","default":0,"title":"Offset"},"description":"Number of leads to skip, for paging."},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only include traffic from this link source, the ?src= slug of one of the experience links. Omit for all traffic.","title":"Source"},"description":"Only include traffic from this link source, the ?src= slug of one of the experience links. Omit for all traffic."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing, malformed or revoked API key. Code invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"The key lacks the required scope (scope_missing) or the route is not open to keys (endpoint_forbidden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"The request is not valid. Either an error body with a stable code, or a request validation error whose detail is a list.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ErrorBody"},{"$ref":"#/components/schemas/ValidationErrorBody"}]}}}},"429":{"description":"Rate limit reached. Wait Retry-After seconds. Code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}},"x-required-scope":"leads"}},"/api/v1/leads/export":{"get":{"summary":"Export Leads","description":"Leads as a CSV file.","operationId":"export_leads_api_v1_leads_export_get","security":[{"bearerAuth":["leads"]}],"parameters":[{"name":"experience_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only include this experience. Omit to include every experience on the account.","title":"Experience Id"},"description":"Only include this experience. Omit to include every experience on the account."},{"name":"period","in":"query","required":false,"schema":{"enum":["today","7d","30d"],"type":"string","description":"Time window ending now. One of today, 7d, 30d.","default":"30d","title":"Period"},"description":"Time window ending now. One of today, 7d, 30d."},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only include traffic from this link source, the ?src= slug of one of the experience links. Omit for all traffic.","title":"Source"},"description":"Only include traffic from this link source, the ?src= slug of one of the experience links. Omit for all traffic."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Missing, malformed or revoked API key. Code invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"The key lacks the required scope (scope_missing) or the route is not open to keys (endpoint_forbidden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"The request is not valid. Either an error body with a stable code, or a request validation error whose detail is a list.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ErrorBody"},{"$ref":"#/components/schemas/ValidationErrorBody"}]}}}},"429":{"description":"Rate limit reached. Wait Retry-After seconds. Code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}},"x-required-scope":"leads"}},"/api/v1/templates":{"get":{"summary":"List Templates","description":"Every template the caller may create, with its slots, limits, gates and capabilities.","operationId":"list_templates_api_v1_templates_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/TemplateInfo"},"type":"array","title":"Response List Templates Api V1 Templates Get"}}}},"401":{"description":"Missing, malformed or revoked API key. Code invalid_api_key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"The key lacks the required scope (scope_missing) or the route is not open to keys (endpoint_forbidden).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"429":{"description":"Rate limit reached. Wait Retry-After seconds. Code rate_limited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}},"security":[{"bearerAuth":["experiences"]}],"x-required-scope":"experiences"}}},"components":{"schemas":{"AddObjectRequest":{"properties":{"cdn_path":{"type":"string","maxLength":1024,"title":"Cdn Path","description":"The cdn_path of an uploaded .glb or .gltf model, under drafts/{experience_id}/."},"transform":{"anyOf":[{"$ref":"#/components/schemas/Transform"},{"type":"null"}],"description":"Position, rotation (degrees) and scale in editor units, where 1 unit is the target image height. Omit it for the editor default: origin, no rotation, scale 1."},"display_name":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Display Name","description":"Optional label, shown in the cart of restaurant_menu experiences."}},"type":"object","required":["cdn_path"],"title":"AddObjectRequest"},"AddObjectResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Id of the new object. Pass it to DELETE /objects/{object_id}."},"asset_path":{"type":"string","title":"Asset Path","description":"The draft model the object uses."},"filename":{"type":"string","title":"Filename","description":"Display filename stored on the object."},"transform":{"$ref":"#/components/schemas/Transform","description":"The transform the object was created with."}},"type":"object","required":["id","asset_path","filename","transform"],"title":"AddObjectResponse"},"AnimationConfig":{"properties":{"clip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Clip"},"loop":{"type":"boolean","title":"Loop","default":true},"trigger":{"type":"string","title":"Trigger","default":"load"}},"type":"object","title":"AnimationConfig"},"AssetResponse":{"properties":{"asset_id":{"type":"string","title":"Asset Id"},"filename":{"type":"string","title":"Filename"},"cdn_path":{"type":"string","title":"Cdn Path"},"size_bytes":{"type":"integer","title":"Size Bytes"},"content_type":{"type":"string","title":"Content Type"}},"type":"object","required":["asset_id","filename","cdn_path","size_bytes","content_type"],"title":"AssetResponse"},"BodyAnchorConfig":{"properties":{"landmark":{"$ref":"#/components/schemas/BodyLandmark"},"object_id":{"type":"string","title":"Object Id"},"offset":{"$ref":"#/components/schemas/Vec3"}},"type":"object","required":["landmark","object_id"],"title":"BodyAnchorConfig"},"BodyGameConfig":{"properties":{"game_type":{"type":"string","title":"Game Type","default":"block"},"incoming_objects":{"items":{"$ref":"#/components/schemas/IncomingObjectConfig"},"type":"array","title":"Incoming Objects","default":[]},"spawn_rate":{"type":"number","title":"Spawn Rate","default":1.0},"speed":{"type":"number","title":"Speed","default":5.0},"lives":{"type":"integer","title":"Lives","default":3},"target_score":{"type":"integer","title":"Target Score","default":0},"collision_radius":{"type":"number","title":"Collision Radius","default":60.0}},"type":"object","title":"BodyGameConfig"},"BodyLandmark":{"type":"string","enum":["nose","left_eye","right_eye","left_ear","right_ear","left_shoulder","right_shoulder","left_elbow","right_elbow","left_wrist","right_wrist","left_hip","right_hip","left_knee","right_knee","left_ankle","right_ankle"],"title":"BodyLandmark"},"BodyTryOnConfig":{"properties":{"bone_convention":{"type":"string","title":"Bone Convention","default":"mixamo"}},"type":"object","title":"BodyTryOnConfig"},"Body_score_target_quality_api_v1_assets_target_quality_post":{"properties":{"file":{"anyOf":[{"type":"string","contentMediaType":"application/octet-stream"},{"type":"null"}],"title":"File","description":"An image to score, as multipart form data. Send this or cdn_path, not both."}},"type":"object","title":"Body_score_target_quality_api_v1_assets_target_quality_post"},"Body_upload_asset_api_v1_assets_upload_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File","description":"The file to upload, as multipart form data."}},"type":"object","required":["file"],"title":"Body_upload_asset_api_v1_assets_upload_post"},"Brand":{"properties":{"primary_color":{"type":"string","title":"Primary Color","description":"Main interface color as a hex string.","default":"#F04E2A"},"secondary_color":{"type":"string","title":"Secondary Color","description":"Secondary interface color as a hex string.","default":"#FFFFFF"},"logo_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Path","description":"cdn_path of an uploaded logo image, under drafts/{experience_id}/."}},"type":"object","title":"Brand"},"CartStyle":{"properties":{"panel_bg_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Panel Bg Color"},"panel_bg_image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Panel Bg Image"},"panel_bg_image_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Panel Bg Image Filename"}},"type":"object","title":"CartStyle"},"CtaActionType":{"type":"string","enum":["url","phone","whatsapp","instagram","facebook","twitter","email","sms","add_to_cart","survey","save_contact","lead_capture"],"title":"CtaActionType"},"CtaButton-Input":{"properties":{"id":{"type":"string","title":"Id"},"label":{"type":"string","title":"Label"},"action_type":{"$ref":"#/components/schemas/CtaActionType"},"action_value":{"type":"string","title":"Action Value","default":""},"prefill_subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prefill Subject"},"prefill_body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prefill Body"},"contact_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Name"},"contact_org":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Org"},"contact_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Title"},"contact_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Phone"},"contact_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Email"},"contact_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Url"},"lead_fields":{"anyOf":[{"$ref":"#/components/schemas/LeadFieldsConfig"},{"type":"null"}]},"lead_consent_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lead Consent Text"},"lead_success_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lead Success Message"},"lead_notify_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lead Notify Email"},"transform":{"$ref":"#/components/schemas/Transform"},"image_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Path"},"group_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group Id"},"group_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group Label"}},"type":"object","required":["id","label","action_type"],"title":"CtaButton"},"CtaButton-Output":{"properties":{"id":{"type":"string","title":"Id"},"label":{"type":"string","title":"Label"},"action_type":{"$ref":"#/components/schemas/CtaActionType"},"action_value":{"type":"string","title":"Action Value","default":""},"prefill_subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prefill Subject"},"prefill_body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prefill Body"},"contact_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Name"},"contact_org":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Org"},"contact_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Title"},"contact_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Phone"},"contact_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Email"},"contact_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Url"},"lead_fields":{"anyOf":[{"$ref":"#/components/schemas/LeadFieldsConfig"},{"type":"null"}]},"lead_consent_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lead Consent Text"},"lead_success_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lead Success Message"},"lead_notify_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lead Notify Email"},"transform":{"$ref":"#/components/schemas/Transform"},"image_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Path"},"group_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group Id"},"group_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group Label"}},"type":"object","required":["id","label","action_type"],"title":"CtaButton"},"ErrorBody":{"type":"object","title":"ErrorBody","description":"Body of every 4xx response produced by the API.","required":["detail","code"],"properties":{"detail":{"type":"string","description":"Human readable explanation. Safe to show to the account owner."},"code":{"type":"string","description":"Stable machine readable error code. Branch on this, not on detail.","examples":["slot_missing","publish_limit","rate_limited"]},"field":{"type":"string","description":"The input that caused the error, when one is to blame."},"upgrade_url":{"type":"string","description":"Present on 402. Page where the account owner can upgrade."}}},"ExperienceConfig-Input":{"properties":{"version":{"type":"string","title":"Version","description":"Config schema version. Leave at 1.","default":"1"},"template_type":{"$ref":"#/components/schemas/TemplateType","description":"Must match the template_type the experience was created with. The stored value wins."},"brand":{"$ref":"#/components/schemas/Brand","description":"Brand colors and logo used by the experience interface.","default":{"primary_color":"#F04E2A","secondary_color":"#FFFFFF"}},"slots":{"items":{"$ref":"#/components/schemas/SlotConfig"},"type":"array","title":"Slots","description":"Filled template slots. Prefer the set slot route, which builds each entry for you.","default":[]},"objects":{"items":{"$ref":"#/components/schemas/ObjectConfig-Input"},"type":"array","title":"Objects","description":"3D models, planes and text placed in the scene. Prefer the add object route for models.","default":[]},"cta_buttons":{"items":{"$ref":"#/components/schemas/CtaButton-Input"},"type":"array","title":"Cta Buttons","description":"Call to action buttons shown to the visitor, such as links, calls and lead forms. Built in the visual editor.","default":[]},"tracking":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Tracking","description":"Tracking options. Leave unset for defaults."},"game_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Game Config","description":"mini_game settings. Built in the visual editor."},"spin":{"type":"boolean","title":"Spin","description":"Slowly rotate the model.","default":false},"sfx_enabled":{"type":"boolean","title":"Sfx Enabled","description":"Play interface sound effects.","default":true},"camera_toggle_enabled":{"type":"boolean","title":"Camera Toggle Enabled","description":"Image templates: show a button that switches between the front and back camera.","default":false},"catalog_transition":{"type":"string","title":"Catalog Transition","description":"Catalog templates: transition between catalog items.","default":"slide"},"body_anchors":{"items":{"$ref":"#/components/schemas/BodyAnchorConfig"},"type":"array","title":"Body Anchors","description":"body_tracking: which body landmarks objects attach to.","default":[]},"body_game_config":{"anyOf":[{"$ref":"#/components/schemas/BodyGameConfig"},{"type":"null"}],"description":"body_game_block and body_game_catch: game settings."},"body_tryon_config":{"anyOf":[{"$ref":"#/components/schemas/BodyTryOnConfig"},{"type":"null"}],"description":"body_tryon: garment settings."},"hand_tryon_config":{"anyOf":[{"$ref":"#/components/schemas/HandTryOnConfig-Input"},{"type":"null"}],"description":"hand_tryon: hand landmark settings."},"target_orientation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Orientation","description":"horizontal or vertical. Orientation of the target image."},"waiter_slot":{"anyOf":[{"$ref":"#/components/schemas/WaiterSlotConfig-Input"},{"type":"null"}],"description":"restaurant_menu: the persistent virtual waiter model."},"order_proxy_enabled":{"type":"boolean","title":"Order Proxy Enabled","description":"restaurant_menu: true when an order endpoint is configured.","default":false},"cart_style":{"anyOf":[{"$ref":"#/components/schemas/CartStyle"},{"type":"null"}],"description":"restaurant_menu: cart panel branding."},"loyalty_enabled":{"type":"boolean","title":"Loyalty Enabled","description":"restaurant_menu: show the loyalty phone field.","default":false},"loyalty_program_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Loyalty Program Name","description":"restaurant_menu: display name of the loyalty program."},"timelines":{"items":{"$ref":"#/components/schemas/TimelineConfig-Input"},"type":"array","title":"Timelines","description":"Animation timelines. Built in the visual editor.","default":[]},"window_depth":{"type":"number","title":"Window Depth","description":"digital_window: depth of the room recess, in editor units.","default":0.6},"window_room_color":{"type":"string","title":"Window Room Color","description":"digital_window: interior wall color as a hex string.","default":"#101014"},"window_room_scale":{"type":"number","title":"Window Room Scale","description":"digital_window: lateral room size multiplier. 1 is window sized.","default":1.0},"window_mode":{"type":"string","title":"Window Mode","description":"digital_window: room or open.","default":"room"},"window_sky_top":{"type":"string","title":"Window Sky Top","description":"digital_window open mode: sky gradient top color.","default":"#4a90d9"},"window_sky_bottom":{"type":"string","title":"Window Sky Bottom","description":"digital_window open mode: sky gradient horizon color.","default":"#dcedf7"},"window_ground_color":{"type":"string","title":"Window Ground Color","description":"digital_window open mode: ground plane color.","default":"#4f7d43"},"spawn_position":{"$ref":"#/components/schemas/Vec3","description":"vr_walkthrough: start point in room space, in meters."},"spawn_yaw":{"type":"number","title":"Spawn Yaw","description":"vr_walkthrough: initial heading in degrees.","default":0.0},"move_speed":{"type":"number","title":"Move Speed","description":"vr_walkthrough: walking speed in meters per second.","default":1.4},"video_loop":{"type":"boolean","title":"Video Loop","description":"vr_360_video: loop the video.","default":true},"eye_height":{"type":"number","title":"Eye Height","description":"vr_walkthrough: camera height above the floor, in meters.","default":1.6},"waypoint_campaign_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Waypoint Campaign Id","description":"Set by the platform at publish. Do not set."},"links":{"items":{"$ref":"#/components/schemas/ExperienceLink"},"type":"array","title":"Links","description":"Named ?src= variants of the experience URL, for tracking print or campaign splits.","default":[]},"lead_email":{"anyOf":[{"$ref":"#/components/schemas/LeadEmailConfig"},{"type":"null"}],"description":"Override of the lead notification email template."},"tone_mapping":{"type":"string","enum":["none","aces"],"title":"Tone Mapping","description":"Opt-in ACES filmic tone mapping for the 3D layer.","default":"none"},"tone_mapping_exposure":{"type":"number","maximum":2.5,"minimum":0.25,"title":"Tone Mapping Exposure","description":"Exposure used with tone mapping, 0.25 to 2.5.","default":1.0}},"type":"object","required":["template_type"],"title":"ExperienceConfig","description":"The full experience configuration the editor edits. An agent rarely needs to build it by hand: create the experience,\nthen use POST /api/v1/experiences/{experience_id}/slots/{slot_id} and POST /api/v1/experiences/{experience_id}/objects,\nwhich fill slots and objects with the correct shape. Send a full config through PATCH only for settings those routes do not cover,\nand read the experience first so nothing is lost. Fields marked with a template name are ignored by other templates."},"ExperienceConfig-Output":{"properties":{"version":{"type":"string","title":"Version","description":"Config schema version. Leave at 1.","default":"1"},"template_type":{"$ref":"#/components/schemas/TemplateType","description":"Must match the template_type the experience was created with. The stored value wins."},"brand":{"$ref":"#/components/schemas/Brand","description":"Brand colors and logo used by the experience interface.","default":{"primary_color":"#F04E2A","secondary_color":"#FFFFFF"}},"slots":{"items":{"$ref":"#/components/schemas/SlotConfig"},"type":"array","title":"Slots","description":"Filled template slots. Prefer the set slot route, which builds each entry for you.","default":[]},"objects":{"items":{"$ref":"#/components/schemas/ObjectConfig-Output"},"type":"array","title":"Objects","description":"3D models, planes and text placed in the scene. Prefer the add object route for models.","default":[]},"cta_buttons":{"items":{"$ref":"#/components/schemas/CtaButton-Output"},"type":"array","title":"Cta Buttons","description":"Call to action buttons shown to the visitor, such as links, calls and lead forms. Built in the visual editor.","default":[]},"tracking":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Tracking","description":"Tracking options. Leave unset for defaults."},"game_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Game Config","description":"mini_game settings. Built in the visual editor."},"spin":{"type":"boolean","title":"Spin","description":"Slowly rotate the model.","default":false},"sfx_enabled":{"type":"boolean","title":"Sfx Enabled","description":"Play interface sound effects.","default":true},"camera_toggle_enabled":{"type":"boolean","title":"Camera Toggle Enabled","description":"Image templates: show a button that switches between the front and back camera.","default":false},"catalog_transition":{"type":"string","title":"Catalog Transition","description":"Catalog templates: transition between catalog items.","default":"slide"},"body_anchors":{"items":{"$ref":"#/components/schemas/BodyAnchorConfig"},"type":"array","title":"Body Anchors","description":"body_tracking: which body landmarks objects attach to.","default":[]},"body_game_config":{"anyOf":[{"$ref":"#/components/schemas/BodyGameConfig"},{"type":"null"}],"description":"body_game_block and body_game_catch: game settings."},"body_tryon_config":{"anyOf":[{"$ref":"#/components/schemas/BodyTryOnConfig"},{"type":"null"}],"description":"body_tryon: garment settings."},"hand_tryon_config":{"anyOf":[{"$ref":"#/components/schemas/HandTryOnConfig-Output"},{"type":"null"}],"description":"hand_tryon: hand landmark settings."},"target_orientation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Orientation","description":"horizontal or vertical. Orientation of the target image."},"waiter_slot":{"anyOf":[{"$ref":"#/components/schemas/WaiterSlotConfig-Output"},{"type":"null"}],"description":"restaurant_menu: the persistent virtual waiter model."},"order_proxy_enabled":{"type":"boolean","title":"Order Proxy Enabled","description":"restaurant_menu: true when an order endpoint is configured.","default":false},"cart_style":{"anyOf":[{"$ref":"#/components/schemas/CartStyle"},{"type":"null"}],"description":"restaurant_menu: cart panel branding."},"loyalty_enabled":{"type":"boolean","title":"Loyalty Enabled","description":"restaurant_menu: show the loyalty phone field.","default":false},"loyalty_program_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Loyalty Program Name","description":"restaurant_menu: display name of the loyalty program."},"timelines":{"items":{"$ref":"#/components/schemas/TimelineConfig-Output"},"type":"array","title":"Timelines","description":"Animation timelines. Built in the visual editor.","default":[]},"window_depth":{"type":"number","title":"Window Depth","description":"digital_window: depth of the room recess, in editor units.","default":0.6},"window_room_color":{"type":"string","title":"Window Room Color","description":"digital_window: interior wall color as a hex string.","default":"#101014"},"window_room_scale":{"type":"number","title":"Window Room Scale","description":"digital_window: lateral room size multiplier. 1 is window sized.","default":1.0},"window_mode":{"type":"string","title":"Window Mode","description":"digital_window: room or open.","default":"room"},"window_sky_top":{"type":"string","title":"Window Sky Top","description":"digital_window open mode: sky gradient top color.","default":"#4a90d9"},"window_sky_bottom":{"type":"string","title":"Window Sky Bottom","description":"digital_window open mode: sky gradient horizon color.","default":"#dcedf7"},"window_ground_color":{"type":"string","title":"Window Ground Color","description":"digital_window open mode: ground plane color.","default":"#4f7d43"},"spawn_position":{"$ref":"#/components/schemas/Vec3","description":"vr_walkthrough: start point in room space, in meters."},"spawn_yaw":{"type":"number","title":"Spawn Yaw","description":"vr_walkthrough: initial heading in degrees.","default":0.0},"move_speed":{"type":"number","title":"Move Speed","description":"vr_walkthrough: walking speed in meters per second.","default":1.4},"video_loop":{"type":"boolean","title":"Video Loop","description":"vr_360_video: loop the video.","default":true},"eye_height":{"type":"number","title":"Eye Height","description":"vr_walkthrough: camera height above the floor, in meters.","default":1.6},"waypoint_campaign_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Waypoint Campaign Id","description":"Set by the platform at publish. Do not set."},"links":{"items":{"$ref":"#/components/schemas/ExperienceLink"},"type":"array","title":"Links","description":"Named ?src= variants of the experience URL, for tracking print or campaign splits.","default":[]},"lead_email":{"anyOf":[{"$ref":"#/components/schemas/LeadEmailConfig"},{"type":"null"}],"description":"Override of the lead notification email template."},"tone_mapping":{"type":"string","enum":["none","aces"],"title":"Tone Mapping","description":"Opt-in ACES filmic tone mapping for the 3D layer.","default":"none"},"tone_mapping_exposure":{"type":"number","maximum":2.5,"minimum":0.25,"title":"Tone Mapping Exposure","description":"Exposure used with tone mapping, 0.25 to 2.5.","default":1.0}},"type":"object","required":["template_type"],"title":"ExperienceConfig","description":"The full experience configuration the editor edits. An agent rarely needs to build it by hand: create the experience,\nthen use POST /api/v1/experiences/{experience_id}/slots/{slot_id} and POST /api/v1/experiences/{experience_id}/objects,\nwhich fill slots and objects with the correct shape. Send a full config through PATCH only for settings those routes do not cover,\nand read the experience first so nothing is lost. Fields marked with a template name are ignored by other templates."},"ExperienceCreate":{"properties":{"name":{"type":"string","title":"Name","description":"Display name of the experience, shown in the dashboard."},"template_type":{"$ref":"#/components/schemas/TemplateType","description":"A template_type from GET /api/v1/templates."}},"type":"object","required":["name","template_type"],"title":"ExperienceCreate"},"ExperienceLink":{"properties":{"id":{"type":"string","title":"Id"},"label":{"type":"string","maxLength":80,"title":"Label"},"source":{"type":"string","title":"Source"}},"type":"object","required":["id","label","source"],"title":"ExperienceLink","description":"A named `?src=` variant of the experience URL, for print/campaign splits."},"ExperienceResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Experience id. Use it in every /experiences/{experience_id} route."},"name":{"type":"string","title":"Name","description":"Display name."},"template_type":{"$ref":"#/components/schemas/TemplateType","description":"The template the experience was created from."},"status":{"$ref":"#/components/schemas/ExperienceStatus","description":"draft, duplicating, publishing, live or live_unpurged. live and live_unpurged experiences have a working hosted_url."},"config":{"$ref":"#/components/schemas/ExperienceConfig-Output","description":"The full experience configuration."},"hosted_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hosted Url","description":"Public URL visitors scan or open. Null until the experience is published."},"scan_count":{"type":"integer","title":"Scan Count","description":"Number of scans recorded.","default":0},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"},"qr_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Qr Config"},"order_endpoint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order Endpoint"},"board_access_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Board Access Token"},"custom_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Domain"},"allowed_embed_origins":{"items":{"type":"string"},"type":"array","title":"Allowed Embed Origins","default":[]},"loyalty_program_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Loyalty Program Id"},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id"},"starts_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Starts At"},"ends_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ends At"}},"type":"object","required":["id","name","template_type","status","config","created_at","updated_at"],"title":"ExperienceResponse"},"ExperienceStatus":{"type":"string","enum":["draft","duplicating","publishing","live","live_unpurged"],"title":"ExperienceStatus"},"ExperienceSummary":{"properties":{"id":{"type":"string","title":"Id","description":"Experience id."},"name":{"type":"string","title":"Name","description":"Display name."},"template_type":{"$ref":"#/components/schemas/TemplateType","description":"The template the experience was created from."},"status":{"$ref":"#/components/schemas/ExperienceStatus","description":"draft, duplicating, publishing, live or live_unpurged."},"hosted_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hosted Url","description":"Public URL visitors scan or open. Null until the experience is published."},"scan_count":{"type":"integer","title":"Scan Count","description":"Number of scans recorded.","default":0},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"}},"type":"object","required":["id","name","template_type","status","created_at","updated_at"],"title":"ExperienceSummary"},"ExperienceSummaryPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ExperienceSummary"},"type":"array","title":"Items"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Opaque cursor for the next page. Null when there are no more rows."}},"type":"object","required":["items"],"title":"ExperienceSummaryPage"},"ExperienceUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"New display name. Omit to keep the current one."},"config":{"anyOf":[{"$ref":"#/components/schemas/ExperienceConfig-Input"},{"type":"null"}],"description":"Replaces the whole config. Omit to leave it unchanged. Prefer the slot and object routes."},"qr_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Qr Config","description":"QR code styling options. Omit to leave unchanged."},"order_endpoint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order Endpoint","description":"restaurant_menu: https URL that receives orders. Omit for no change, empty string to clear."},"order_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order Secret","description":"restaurant_menu: shared secret for the order endpoint. Omit for no change, empty string to clear."},"custom_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Domain","description":"Custom domain to serve the experience from. Needs a plan with custom domains. Omit for no change, empty string to clear."},"allowed_embed_origins":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed Embed Origins","description":"https origins allowed to embed the experience, at most 20. Omit for no change, empty list to clear."},"folder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder Id","description":"Folder to put the experience in. Omit for no change, empty string to move it to the root."},"starts_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Starts At","description":"ISO 8601 time the live experience starts being available. Omit for no change, empty string to clear."},"ends_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ends At","description":"ISO 8601 time the live experience stops being available. Omit for no change, empty string to clear."}},"type":"object","title":"ExperienceUpdate"},"FolderCreate":{"properties":{"name":{"type":"string","title":"Name","description":"Folder name, 1 to 100 characters."}},"type":"object","required":["name"],"title":"FolderCreate"},"FolderResponse":{"properties":{"id":{"type":"string","title":"Id"},"user_id":{"type":"string","title":"User Id"},"name":{"type":"string","title":"Name"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","user_id","name","created_at"],"title":"FolderResponse"},"FolderUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"New folder name, 1 to 100 characters. Omit to keep it."}},"type":"object","title":"FolderUpdate"},"GeoFenceResponse":{"properties":{"id":{"type":"string","title":"Id"},"user_id":{"type":"string","title":"User Id"},"name":{"type":"string","title":"Name"},"polygon":{"items":{},"type":"array","title":"Polygon"},"color":{"type":"string","title":"Color"},"allows_activation":{"type":"boolean","title":"Allows Activation"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","user_id","name","polygon","color","allows_activation","created_at"],"title":"GeoFenceResponse"},"HandAnchorConfig":{"properties":{"object_id":{"type":"string","title":"Object Id"},"anchor":{"$ref":"#/components/schemas/HandLandmark"},"scale":{"type":"number","title":"Scale","default":1.0}},"type":"object","required":["object_id","anchor"],"title":"HandAnchorConfig"},"HandLandmark":{"type":"string","enum":["wrist","thumb_cmc","thumb_mcp","thumb_ip","thumb_tip","index_mcp","index_pip","index_dip","index_tip","middle_mcp","middle_pip","middle_dip","middle_tip","ring_mcp","ring_pip","ring_dip","ring_tip","pinky_mcp","pinky_pip","pinky_dip","pinky_tip"],"title":"HandLandmark"},"HandTryOnConfig-Input":{"properties":{"anchors":{"items":{"$ref":"#/components/schemas/HandAnchorConfig"},"type":"array","title":"Anchors","default":[]}},"type":"object","title":"HandTryOnConfig"},"HandTryOnConfig-Output":{"properties":{"anchors":{"items":{"$ref":"#/components/schemas/HandAnchorConfig"},"type":"array","title":"Anchors","default":[]}},"type":"object","title":"HandTryOnConfig"},"HotspotActivationAction":{"properties":{"enabled":{"type":"boolean","title":"Enabled","default":false},"targets":{"items":{"$ref":"#/components/schemas/HotspotActivationTarget"},"type":"array","title":"Targets","default":[]}},"type":"object","title":"HotspotActivationAction"},"HotspotActivationTarget":{"properties":{"object_id":{"type":"string","title":"Object Id"},"activate":{"type":"boolean","title":"Activate","default":true}},"type":"object","required":["object_id"],"title":"HotspotActivationTarget"},"HotspotAnimationAction":{"properties":{"enabled":{"type":"boolean","title":"Enabled","default":false},"target_object_id":{"type":"string","title":"Target Object Id","default":""},"clip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Clip"},"loop":{"type":"boolean","title":"Loop","default":false},"return_to_last":{"type":"boolean","title":"Return To Last","default":false}},"type":"object","title":"HotspotAnimationAction"},"HotspotCollider":{"properties":{"position":{"$ref":"#/components/schemas/Vec3"},"rotation":{"$ref":"#/components/schemas/Vec3"},"scale":{"$ref":"#/components/schemas/Vec3"}},"type":"object","title":"HotspotCollider"},"HotspotConfig-Input":{"properties":{"enabled":{"type":"boolean","title":"Enabled","default":false},"collider":{"anyOf":[{"$ref":"#/components/schemas/HotspotCollider"},{"type":"null"}]},"animation_action":{"anyOf":[{"$ref":"#/components/schemas/HotspotAnimationAction"},{"type":"null"}]},"sound_action":{"anyOf":[{"$ref":"#/components/schemas/HotspotSoundAction"},{"type":"null"}]},"text_action":{"anyOf":[{"$ref":"#/components/schemas/HotspotTextAction"},{"type":"null"}]},"activation_action":{"anyOf":[{"$ref":"#/components/schemas/HotspotActivationAction"},{"type":"null"}]},"visibility_action":{"anyOf":[{"$ref":"#/components/schemas/HotspotVisibilityAction"},{"type":"null"}]},"timeline_action":{"anyOf":[{"$ref":"#/components/schemas/HotspotTimelineAction"},{"type":"null"}]}},"type":"object","title":"HotspotConfig"},"HotspotConfig-Output":{"properties":{"enabled":{"type":"boolean","title":"Enabled","default":false},"collider":{"anyOf":[{"$ref":"#/components/schemas/HotspotCollider"},{"type":"null"}]},"animation_action":{"anyOf":[{"$ref":"#/components/schemas/HotspotAnimationAction"},{"type":"null"}]},"sound_action":{"anyOf":[{"$ref":"#/components/schemas/HotspotSoundAction"},{"type":"null"}]},"text_action":{"anyOf":[{"$ref":"#/components/schemas/HotspotTextAction"},{"type":"null"}]},"activation_action":{"anyOf":[{"$ref":"#/components/schemas/HotspotActivationAction"},{"type":"null"}]},"visibility_action":{"anyOf":[{"$ref":"#/components/schemas/HotspotVisibilityAction"},{"type":"null"}]},"timeline_action":{"anyOf":[{"$ref":"#/components/schemas/HotspotTimelineAction"},{"type":"null"}]}},"type":"object","title":"HotspotConfig"},"HotspotSoundAction":{"properties":{"enabled":{"type":"boolean","title":"Enabled","default":false},"asset_path":{"type":"string","title":"Asset Path","default":""},"filename":{"type":"string","title":"Filename","default":""},"sound_type":{"$ref":"#/components/schemas/HotspotSoundType","default":"sfx"},"loop":{"type":"boolean","title":"Loop","default":false}},"type":"object","title":"HotspotSoundAction"},"HotspotSoundType":{"type":"string","enum":["voiceover","sfx","bgm"],"title":"HotspotSoundType"},"HotspotTextAction":{"properties":{"enabled":{"type":"boolean","title":"Enabled","default":false},"text":{"type":"string","title":"Text","default":""},"words_per_second":{"type":"number","title":"Words Per Second","default":2.5}},"type":"object","title":"HotspotTextAction"},"HotspotTimelineAction":{"properties":{"enabled":{"type":"boolean","title":"Enabled","default":false},"timeline_id":{"type":"string","title":"Timeline Id","default":""},"mode":{"type":"string","title":"Mode","default":"play"}},"type":"object","title":"HotspotTimelineAction"},"HotspotVisibilityAction":{"properties":{"enabled":{"type":"boolean","title":"Enabled","default":false},"targets":{"items":{"$ref":"#/components/schemas/HotspotVisibilityTarget"},"type":"array","title":"Targets","default":[]}},"type":"object","title":"HotspotVisibilityAction"},"HotspotVisibilityTarget":{"properties":{"object_id":{"type":"string","title":"Object Id"},"visible":{"type":"boolean","title":"Visible","default":true}},"type":"object","required":["object_id"],"title":"HotspotVisibilityTarget"},"ImportUrlRequest":{"properties":{"experience_id":{"type":"string","maxLength":64,"title":"Experience Id","description":"The experience the imported file is stored under, as a draft asset."},"url":{"type":"string","maxLength":2048,"title":"Url","description":"Public https URL of the file. No credentials, default port only, at most 3 redirects. The file type is decided by the extension of the Content-Disposition filename, else of the last URL path segment."},"slot_id":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Slot Id","description":"Optional template slot to fill with the imported file, same effect as POST /api/v1/experiences/{id}/slots/{slot_id}."},"video_aspect_ratio":{"anyOf":[{"type":"number","exclusiveMaximum":20.0,"exclusiveMinimum":0.05},{"type":"null"}],"title":"Video Aspect Ratio","description":"Width divided by height of the video. Only read when slot_id is the video slot of a video_on_surface experience. Always send it."},"fit":{"anyOf":[{"type":"string","enum":["contain","cover","stretch"]},{"type":"null"}],"title":"Fit","description":"How the video plane is fitted to the target image: contain (default), cover or stretch. Only read when slot_id is the video slot of a video_on_surface experience."}},"type":"object","required":["experience_id","url"],"title":"ImportUrlRequest"},"ImportUrlResponse":{"properties":{"asset_id":{"type":"string","title":"Asset Id"},"filename":{"type":"string","title":"Filename"},"cdn_path":{"type":"string","title":"Cdn Path"},"size_bytes":{"type":"integer","title":"Size Bytes"},"content_type":{"type":"string","title":"Content Type"},"slot":{"anyOf":[{"$ref":"#/components/schemas/ImportedSlot"},{"type":"null"}],"description":"Result of filling the slot. Null when slot_id was not sent."}},"type":"object","required":["asset_id","filename","cdn_path","size_bytes","content_type"],"title":"ImportUrlResponse"},"ImportedSlot":{"properties":{"slot_id":{"type":"string","title":"Slot Id","description":"The slot that was filled."},"component_type":{"type":"string","title":"Component Type","description":"image, audio or video, as stored on the slot."},"asset_path":{"type":"string","title":"Asset Path","description":"The draft asset now held by the slot."},"filename":{"type":"string","title":"Filename","description":"Display filename stored on the slot."},"created_object_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created Object Id","description":"Id of the video plane object created as a side effect, when there was one."},"video_plane_transform":{"anyOf":[{"$ref":"#/components/schemas/Transform"},{"type":"null"}],"description":"The transform the video plane now has, when this call created or re-fitted it."}},"type":"object","required":["slot_id","component_type","asset_path","filename"],"title":"ImportedSlot"},"IncomingObjectConfig":{"properties":{"id":{"type":"string","title":"Id"},"asset_path":{"type":"string","title":"Asset Path"},"filename":{"type":"string","title":"Filename"},"scale":{"type":"number","title":"Scale","default":1.0},"weight":{"type":"number","title":"Weight","default":1.0}},"type":"object","required":["id","asset_path","filename"],"title":"IncomingObjectConfig"},"LeadEmailConfig":{"properties":{"subject":{"type":"string","maxLength":200,"title":"Subject","default":""},"body":{"type":"string","maxLength":4000,"title":"Body","default":""},"show_leads_link":{"type":"boolean","title":"Show Leads Link","default":true}},"type":"object","title":"LeadEmailConfig","description":"Per-experience override of the lead notification email.\n\nAn empty subject or body means \"use the default template\" — see\nservices/lead_email.py, which owns the defaults and the placeholder\nsubstitution."},"LeadFieldConfig":{"properties":{"enabled":{"type":"boolean","title":"Enabled","default":false},"required":{"type":"boolean","title":"Required","default":false}},"type":"object","title":"LeadFieldConfig"},"LeadFieldsConfig":{"properties":{"name":{"$ref":"#/components/schemas/LeadFieldConfig"},"phone":{"$ref":"#/components/schemas/LeadFieldConfig"},"email":{"$ref":"#/components/schemas/LeadFieldConfig"},"message":{"$ref":"#/components/schemas/LeadFieldConfig"}},"type":"object","title":"LeadFieldsConfig"},"LotCollectionConfig":{"properties":{"terrain_object_id":{"type":"string","title":"Terrain Object Id","default":""},"mode":{"type":"string","title":"Mode","default":"flat"},"cta_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cta Id"},"lead_notify_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lead Notify Email"},"lead_message_enabled":{"type":"boolean","title":"Lead Message Enabled","default":false},"lead_message_required":{"type":"boolean","title":"Lead Message Required","default":false},"colors":{"anyOf":[{"$ref":"#/components/schemas/LotColors"},{"type":"null"}]},"rows":{"items":{"$ref":"#/components/schemas/LotRow"},"type":"array","title":"Rows","default":[]}},"type":"object","title":"LotCollectionConfig"},"LotColors":{"properties":{"available":{"type":"string","title":"Available","default":"#22C55E"},"reserved":{"type":"string","title":"Reserved","default":"#EAB308"},"sold":{"type":"string","title":"Sold","default":"#9CA3AF"}},"type":"object","title":"LotColors"},"LotRow":{"properties":{"id":{"type":"string","title":"Id"},"code":{"type":"string","title":"Code","default":""},"label":{"type":"string","title":"Label"},"status":{"type":"string","title":"Status","default":"available"},"price":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Price"},"size":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Size"},"polygon":{"items":{"items":{"type":"number"},"type":"array"},"type":"array","title":"Polygon","default":[]},"centroid":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Centroid"},"height":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Height"},"base_height":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Base Height"},"floor":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Floor"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["id","label"],"title":"LotRow"},"MenuItemComment":{"properties":{"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text"},"audio_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Path"},"audio_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Filename"}},"type":"object","title":"MenuItemComment"},"ObjectConfig-Input":{"properties":{"id":{"type":"string","title":"Id","description":"Unique object id, 1 to 128 characters with no slashes."},"asset_path":{"type":"string","title":"Asset Path","description":"cdn_path of the uploaded model, under drafts/{experience_id}/. Empty for text and effect objects."},"filename":{"type":"string","title":"Filename","description":"Display filename."},"transform":{"$ref":"#/components/schemas/Transform","description":"Position, rotation and scale of the object."},"cta_ids":{"items":{"type":"string"},"type":"array","title":"Cta Ids","description":"Ids of cta_buttons attached to this object.","default":[]},"is_video_plane":{"type":"boolean","title":"Is Video Plane","description":"True for the video plane of video_on_surface. Created by the set slot route.","default":false},"video_transparent":{"type":"boolean","title":"Video Transparent","default":false},"video_key_threshold":{"type":"number","title":"Video Key Threshold","default":0.1},"video_key_softness":{"type":"number","title":"Video Key Softness","default":0.1},"video_key_color_keep":{"type":"number","title":"Video Key Color Keep","default":0.6},"video_key_fill":{"type":"number","title":"Video Key Fill","default":0.0},"video_key_mode":{"type":"string","title":"Video Key Mode","default":"luma"},"video_key_color":{"type":"string","title":"Video Key Color","default":"#00ff00"},"video_key_tolerance":{"type":"number","title":"Video Key Tolerance","default":0.25},"video_key_chroma_softness":{"type":"number","title":"Video Key Chroma Softness","default":0.15},"video_key_despill":{"type":"number","title":"Video Key Despill","default":1.0},"video_mask_enabled":{"type":"boolean","title":"Video Mask Enabled","default":false},"video_mask_invert":{"type":"boolean","title":"Video Mask Invert","default":false},"animation":{"anyOf":[{"$ref":"#/components/schemas/AnimationConfig"},{"type":"null"}]},"face":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Face"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"price":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Price"},"visible":{"type":"boolean","title":"Visible","description":"False hides the object on load. A hotspot can reveal it.","default":true},"catalog_comment":{"anyOf":[{"$ref":"#/components/schemas/MenuItemComment"},{"type":"null"}]},"hotspot":{"anyOf":[{"$ref":"#/components/schemas/HotspotConfig-Input"},{"type":"null"}]},"particle_effect":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Particle Effect"},"is_effect":{"type":"boolean","title":"Is Effect","default":false},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id"},"is_text":{"type":"boolean","title":"Is Text","default":false},"text_style":{"anyOf":[{"$ref":"#/components/schemas/TextStyle"},{"type":"null"}]},"is_lot_collection":{"type":"boolean","title":"Is Lot Collection","default":false},"lots":{"anyOf":[{"$ref":"#/components/schemas/LotCollectionConfig"},{"type":"null"}]}},"type":"object","required":["id","asset_path","filename"],"title":"ObjectConfig"},"ObjectConfig-Output":{"properties":{"id":{"type":"string","title":"Id","description":"Unique object id, 1 to 128 characters with no slashes."},"asset_path":{"type":"string","title":"Asset Path","description":"cdn_path of the uploaded model, under drafts/{experience_id}/. Empty for text and effect objects."},"filename":{"type":"string","title":"Filename","description":"Display filename."},"transform":{"$ref":"#/components/schemas/Transform","description":"Position, rotation and scale of the object."},"cta_ids":{"items":{"type":"string"},"type":"array","title":"Cta Ids","description":"Ids of cta_buttons attached to this object.","default":[]},"is_video_plane":{"type":"boolean","title":"Is Video Plane","description":"True for the video plane of video_on_surface. Created by the set slot route.","default":false},"video_transparent":{"type":"boolean","title":"Video Transparent","default":false},"video_key_threshold":{"type":"number","title":"Video Key Threshold","default":0.1},"video_key_softness":{"type":"number","title":"Video Key Softness","default":0.1},"video_key_color_keep":{"type":"number","title":"Video Key Color Keep","default":0.6},"video_key_fill":{"type":"number","title":"Video Key Fill","default":0.0},"video_key_mode":{"type":"string","title":"Video Key Mode","default":"luma"},"video_key_color":{"type":"string","title":"Video Key Color","default":"#00ff00"},"video_key_tolerance":{"type":"number","title":"Video Key Tolerance","default":0.25},"video_key_chroma_softness":{"type":"number","title":"Video Key Chroma Softness","default":0.15},"video_key_despill":{"type":"number","title":"Video Key Despill","default":1.0},"video_mask_enabled":{"type":"boolean","title":"Video Mask Enabled","default":false},"video_mask_invert":{"type":"boolean","title":"Video Mask Invert","default":false},"animation":{"anyOf":[{"$ref":"#/components/schemas/AnimationConfig"},{"type":"null"}]},"face":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Face"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"price":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Price"},"visible":{"type":"boolean","title":"Visible","description":"False hides the object on load. A hotspot can reveal it.","default":true},"catalog_comment":{"anyOf":[{"$ref":"#/components/schemas/MenuItemComment"},{"type":"null"}]},"hotspot":{"anyOf":[{"$ref":"#/components/schemas/HotspotConfig-Output"},{"type":"null"}]},"particle_effect":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Particle Effect"},"is_effect":{"type":"boolean","title":"Is Effect","default":false},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id"},"is_text":{"type":"boolean","title":"Is Text","default":false},"text_style":{"anyOf":[{"$ref":"#/components/schemas/TextStyle"},{"type":"null"}]},"is_lot_collection":{"type":"boolean","title":"Is Lot Collection","default":false},"lots":{"anyOf":[{"$ref":"#/components/schemas/LotCollectionConfig"},{"type":"null"}]}},"type":"object","required":["id","asset_path","filename"],"title":"ObjectConfig"},"PublishProblem":{"properties":{"code":{"type":"string","title":"Code","description":"Stable machine-readable reason, such as slot_missing, no_objects, schedule_ended, publish_limit, plan_required, addon_required, dev_environment or capability_violation."},"message":{"type":"string","title":"Message","description":"Human-readable explanation of the problem."},"field":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Field","description":"The slot id, config section or object the problem refers to, when there is one."},"upgrade_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Upgrade Url","description":"Billing page that resolves the problem, present only for plan and add-on limits."}},"type":"object","required":["code","message"],"title":"PublishProblem"},"PublishValidationResult":{"properties":{"ok":{"type":"boolean","title":"Ok","description":"True when publishing would pass every pre-publish check."},"problems":{"items":{"$ref":"#/components/schemas/PublishProblem"},"type":"array","title":"Problems","description":"Every problem found, in the order publish applies its checks. Empty when ok is true."}},"type":"object","required":["ok","problems"],"title":"PublishValidationResult"},"SetSlotRequest":{"properties":{"cdn_path":{"type":"string","maxLength":1024,"title":"Cdn Path","description":"The cdn_path returned by POST /api/v1/assets/upload. Must sit under drafts/{experience_id}/."},"video_aspect_ratio":{"anyOf":[{"type":"number","exclusiveMaximum":20.0,"exclusiveMinimum":0.05},{"type":"null"}],"title":"Video Aspect Ratio","description":"Width divided by height of the video. Only read when setting the video slot of a video_on_surface experience, where it sizes the video plane. Always send it: the server cannot read video dimensions and falls back to 16:9."},"fit":{"anyOf":[{"type":"string","enum":["contain","cover","stretch"]},{"type":"null"}],"title":"Fit","description":"How the video plane is fitted to the target image. Only read when setting the video slot of a video_on_surface experience. contain (default): the whole video is visible, centred, and never larger than the target. cover: the video covers the whole target and overflows on one axis. stretch: the plane matches the target exactly and the video is distorted. Setting or replacing the target_image later re-fits the plane with the same mode."}},"type":"object","required":["cdn_path"],"title":"SetSlotRequest"},"SetSlotResponse":{"properties":{"slot_id":{"type":"string","title":"Slot Id","description":"The slot that was filled."},"component_type":{"type":"string","title":"Component Type","description":"image, audio or video, as stored on the slot."},"asset_path":{"type":"string","title":"Asset Path","description":"The draft asset now held by the slot."},"filename":{"type":"string","title":"Filename","description":"Display filename stored on the slot."},"created_object_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created Object Id","description":"Id of the video plane object created as a side effect. Only set the first time the video slot of a video_on_surface experience is filled; replacing the video reuses the existing plane."},"video_plane_transform":{"anyOf":[{"$ref":"#/components/schemas/Transform"},{"type":"null"}],"description":"The transform the video plane now has, in editor units where 1 is the target image height. Only set when this call created or re-fitted the plane."}},"type":"object","required":["slot_id","component_type","asset_path","filename"],"title":"SetSlotResponse"},"SlotConfig":{"properties":{"slot_id":{"type":"string","title":"Slot Id","description":"Slot identifier from GET /api/v1/templates."},"component_type":{"type":"string","title":"Component Type","description":"image, audio or video."},"config":{"additionalProperties":true,"type":"object","title":"Config","description":"Holds asset_path, the cdn_path of the uploaded file, and filename.","default":{}}},"type":"object","required":["slot_id","component_type"],"title":"SlotConfig"},"TargetIssue":{"properties":{"code":{"type":"string","enum":["low_resolution","extreme_aspect","few_features","uneven_coverage","repetitive_pattern","low_contrast","large_blank_areas","detail_too_fine"],"title":"Code"},"severity":{"type":"string","enum":["high","medium","low"],"title":"Severity"}},"type":"object","required":["code","severity"],"title":"TargetIssue"},"TargetPoint":{"properties":{"x":{"type":"number","title":"X"},"y":{"type":"number","title":"Y"}},"type":"object","required":["x","y"],"title":"TargetPoint"},"TargetQualityReport":{"properties":{"score":{"type":"integer","title":"Score"},"stars":{"type":"number","title":"Stars"},"grade":{"type":"string","enum":["poor","fair","good","excellent"],"title":"Grade"},"width":{"type":"integer","title":"Width"},"height":{"type":"integer","title":"Height"},"featureCount":{"type":"integer","title":"Featurecount"},"featureDensity":{"type":"integer","title":"Featuredensity"},"detailScore":{"type":"integer","title":"Detailscore"},"coverage":{"type":"number","title":"Coverage"},"contrast":{"type":"number","title":"Contrast"},"repetition":{"type":"number","title":"Repetition"},"blankRatio":{"type":"number","title":"Blankratio"},"points":{"items":{"$ref":"#/components/schemas/TargetPoint"},"type":"array","title":"Points"},"issues":{"items":{"$ref":"#/components/schemas/TargetIssue"},"type":"array","title":"Issues"}},"type":"object","required":["score","stars","grade","width","height","featureCount","featureDensity","detailScore","coverage","contrast","repetition","blankRatio","points","issues"],"title":"TargetQualityReport"},"TemplateInfo":{"properties":{"template_type":{"type":"string","title":"Template Type","description":"Value to pass as template_type when creating an experience."},"description":{"type":"string","title":"Description","description":"What the template does, in one plain sentence."},"slots":{"items":{"$ref":"#/components/schemas/TemplateSlotInfo"},"type":"array","title":"Slots","description":"Named file slots the template exposes."},"requires_object":{"type":"boolean","title":"Requires Object","description":"True when publishing needs at least one 3D model object in the config."},"requires_incoming_objects":{"type":"boolean","title":"Requires Incoming Objects","description":"True for body games, which need at least one incoming object in body_game_config before publishing."},"plan_required":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan Required","description":"Lowest plan that can use this template, or null when any plan can."},"addon_required":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Addon Required","description":"Subscription add-on slot column the template consumes when published, or null when none."},"capabilities":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Capabilities","description":"Per-template feature flags such as lot_collection, links and qr_params."},"editor_required":{"type":"boolean","title":"Editor Required","description":"False when an assistant can finish the experience through the API alone. True when the visual editor is needed."}},"type":"object","required":["template_type","description","slots","requires_object","requires_incoming_objects","plan_required","addon_required","capabilities","editor_required"],"title":"TemplateInfo"},"TemplateSlotInfo":{"properties":{"slot_id":{"type":"string","title":"Slot Id","description":"Slot identifier to use when uploading and attaching a file."},"label":{"type":"string","title":"Label","description":"Human readable slot name."},"accepts":{"type":"string","title":"Accepts","description":"Kind of file the slot takes: image, audio or video."},"required":{"type":"boolean","title":"Required","description":"True when the experience cannot be published until this slot is filled."},"accepted_extensions":{"items":{"type":"string"},"type":"array","title":"Accepted Extensions","description":"File extensions the upload endpoint accepts for this slot."},"max_bytes":{"type":"integer","title":"Max Bytes","description":"Largest file size in bytes the upload endpoint accepts for this slot."}},"type":"object","required":["slot_id","label","accepts","required","accepted_extensions","max_bytes"],"title":"TemplateSlotInfo"},"TemplateType":{"type":"string","enum":["face_filter","face_catalog","image_target","product_float","product_catalog","restaurant_menu","mini_game","video_on_surface","magic_cube","digital_window","body_tracking","body_tryon","body_game_block","body_game_catch","hand_tryon","product_tryon","surface_catalog","surface_deep","real_estate_lots","vr_walkthrough","vr_360_video"],"title":"TemplateType"},"TextStyle":{"properties":{"content":{"type":"string","title":"Content","default":""},"font_family":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Font Family"},"font_weight":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Font Weight"},"font_size":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Font Size"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"align":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Align"},"line_height":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Line Height"},"outline_width":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Outline Width"},"outline_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Outline Color"},"shadow_blur":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Shadow Blur"},"shadow_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shadow Color"},"shadow_offset_x":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Shadow Offset X"},"shadow_offset_y":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Shadow Offset Y"},"bg_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bg Color"},"bg_padding":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Bg Padding"},"bg_radius":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Bg Radius"}},"type":"object","title":"TextStyle"},"TimelineConfig-Input":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name","default":""},"duration":{"type":"number","title":"Duration","default":5.0},"loop":{"type":"string","title":"Loop","default":"loop"},"autoplay":{"type":"boolean","title":"Autoplay","default":true},"trigger":{"type":"string","title":"Trigger","default":"load"},"tracks":{"items":{"$ref":"#/components/schemas/TimelineTrack-Input"},"type":"array","title":"Tracks","default":[]}},"type":"object","required":["id"],"title":"TimelineConfig"},"TimelineConfig-Output":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name","default":""},"duration":{"type":"number","title":"Duration","default":5.0},"loop":{"type":"string","title":"Loop","default":"loop"},"autoplay":{"type":"boolean","title":"Autoplay","default":true},"trigger":{"type":"string","title":"Trigger","default":"load"},"tracks":{"items":{"$ref":"#/components/schemas/TimelineTrack-Output"},"type":"array","title":"Tracks","default":[]}},"type":"object","required":["id"],"title":"TimelineConfig"},"TimelineKeyframe":{"properties":{"time":{"type":"number","title":"Time","default":0.0},"value":{"$ref":"#/components/schemas/Vec3"},"easing":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Easing"}},"type":"object","title":"TimelineKeyframe"},"TimelineTrack-Input":{"properties":{"object_id":{"type":"string","title":"Object Id"},"property":{"type":"string","title":"Property"},"node":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Node"},"keyframes":{"items":{"$ref":"#/components/schemas/TimelineKeyframe"},"type":"array","title":"Keyframes","default":[]}},"type":"object","required":["object_id","property"],"title":"TimelineTrack"},"TimelineTrack-Output":{"properties":{"object_id":{"type":"string","title":"Object Id"},"property":{"type":"string","title":"Property"},"node":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Node"},"keyframes":{"items":{"$ref":"#/components/schemas/TimelineKeyframe"},"type":"array","title":"Keyframes","default":[]}},"type":"object","required":["object_id","property"],"title":"TimelineTrack"},"Transform":{"properties":{"position":{"$ref":"#/components/schemas/Vec3","description":"Position in editor units, where 1 unit is the target image height."},"rotation":{"$ref":"#/components/schemas/Vec3","description":"Euler rotation in degrees."},"scale":{"$ref":"#/components/schemas/Vec3","description":"Scale per axis. A single number is accepted and applied to all axes."}},"type":"object","title":"Transform"},"ValidationErrorBody":{"type":"object","title":"ValidationErrorBody","description":"Body of a 422 caused by a request that does not match the schema.","required":["detail","code"],"properties":{"detail":{"type":"array","description":"One entry per validation failure, in FastAPI's standard shape.","items":{"type":"object","additionalProperties":true}},"code":{"type":"string","enum":["invalid_request"]},"message":{"type":"string","description":"Readable summary of the first failure."},"field":{"type":"string","description":"Dotted path of the first invalid input."}}},"Vec3":{"properties":{"x":{"type":"number","title":"X","description":"X component.","default":0.0},"y":{"type":"number","title":"Y","description":"Y component.","default":0.0},"z":{"type":"number","title":"Z","description":"Z component.","default":0.0}},"type":"object","title":"Vec3"},"WaiterSlotConfig-Input":{"properties":{"asset_path":{"type":"string","title":"Asset Path"},"filename":{"type":"string","title":"Filename"},"transform":{"$ref":"#/components/schemas/Transform"},"animation":{"anyOf":[{"$ref":"#/components/schemas/AnimationConfig"},{"type":"null"}]}},"type":"object","required":["asset_path","filename"],"title":"WaiterSlotConfig"},"WaiterSlotConfig-Output":{"properties":{"asset_path":{"type":"string","title":"Asset Path"},"filename":{"type":"string","title":"Filename"},"transform":{"$ref":"#/components/schemas/Transform"},"animation":{"anyOf":[{"$ref":"#/components/schemas/AnimationConfig"},{"type":"null"}]}},"type":"object","required":["asset_path","filename"],"title":"WaiterSlotConfig"}},"parameters":{"IdempotencyKey":{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional. 1 to 255 visible ASCII characters. A repeat of the same request with the same key within 24 hours replays the first response and sets Idempotent-Replayed: true. Reusing a key with a different request answers 422 idempotency_key_reused.","schema":{"type":"string","minLength":1,"maxLength":255}}},"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"API key created in Settings, API keys. Format mnrv_live_ followed by the secret."}}}}