{"components":{"responses":{},"schemas":{"RoomCreateRequest":{"additionalProperties":false,"properties":{"capacity":{"type":"integer"},"description":{"nullable":true,"type":"string"},"images":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"metadata":{"additionalProperties":true,"type":"object"},"name":{"type":"string"},"overrides":{"$ref":"#/components/schemas/CatalogOverrides"}},"required":["name"],"title":"RoomCreateRequest","type":"object"},"RoomOffer":{"additionalProperties":false,"properties":{"capacity":{"type":"integer"},"description":{"nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"images":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"is_active":{"type":"boolean"},"location":{"type":"string"},"name":{"type":"string"},"version_id":{"format":"uuid","type":"string"},"version_number":{"type":"integer"}},"required":["id","version_id","version_number","is_active","name","images"],"title":"RoomOffer","type":"object"},"SubscriptionQuoteSelection":{"additionalProperties":false,"properties":{"currency":{"type":"string"},"description":{"nullable":true,"type":"string"},"duration_minutes":{"minimum":1,"type":"integer"},"gross":{"pattern":"^-?[0-9]+(\\.[0-9]+)?$","type":"string"},"name":{"type":"string"},"net":{"pattern":"^-?[0-9]+(\\.[0-9]+)?$","type":"string"},"offer_expires_at":{"format":"date-time","nullable":true,"type":"string"},"offer_kind":{"enum":["public","private"],"type":"string"},"period_months":{"minimum":1,"type":"integer"},"price":{"pattern":"^-?[0-9]+(\\.[0-9]+)?$","type":"string"},"price_basis":{"enum":["catalog_rate","committed_gross"],"type":"string"},"provider":{"nullable":true,"type":"string"},"requested_duration_id":{"format":"uuid","type":"string"},"resolution":{"enum":["current","translated"],"type":"string"},"service":{"additionalProperties":false,"nullable":true,"properties":{"id":{"format":"uuid","type":"string"},"name":{"type":"string"}},"required":["id","name"],"type":"object"},"sessions_per_month":{"minimum":1,"type":"integer"},"subscription_plan_duration_id":{"format":"uuid","type":"string"},"subscription_plan_id":{"format":"uuid","type":"string"},"subscription_plan_version_id":{"format":"uuid","type":"string"},"tax":{"pattern":"^-?[0-9]+(\\.[0-9]+)?$","type":"string"},"tax_mode":{"enum":["including_tax","excluding_tax"],"type":"string"},"tax_rate":{"nullable":true,"pattern":"^-?[0-9]+(\\.[0-9]+)?$","type":"string"},"terms":{"additionalProperties":false,"properties":{"cancellation_fee_amount":{"nullable":true,"pattern":"^-?[0-9]+(\\.[0-9]+)?$","type":"string"},"cancellation_policy":{"nullable":true,"type":"string"},"rollover_days":{"minimum":0,"type":"integer"},"rollover_unlimited":{"type":"boolean"}},"required":["rollover_days","rollover_unlimited","cancellation_policy","cancellation_fee_amount"],"type":"object"},"total_sessions":{"minimum":1,"type":"integer"}},"required":["currency","description","duration_minutes","gross","name","net","offer_expires_at","offer_kind","period_months","price","price_basis","provider","requested_duration_id","resolution","service","sessions_per_month","subscription_plan_duration_id","subscription_plan_id","subscription_plan_version_id","tax","tax_mode","tax_rate","terms","total_sessions"],"type":"object"},"PackageRedemptionInput":{"additionalProperties":false,"properties":{"consents":{"additionalProperties":false,"properties":{"refund_policy":{"type":"boolean"},"short_terms":{"type":"boolean"},"terms":{"type":"boolean"}},"type":"object"},"member_package_id":{"format":"uuid","type":"string"},"sessions":{"items":{"additionalProperties":false,"properties":{"custom_form_answers":{"additionalProperties":{"oneOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}]},"type":"object"},"date":{"format":"date","type":"string"},"duration_minutes":{"minimum":1,"type":"integer"},"guests":{"items":{"additionalProperties":false,"properties":{"email":{"nullable":true,"type":"string"},"name":{"type":"string"},"notes":{"nullable":true,"type":"string"},"phone":{"nullable":true,"type":"string"}},"required":["name"],"type":"object"},"type":"array"},"metadata":{"additionalProperties":true,"type":"object"},"notes":{"nullable":true,"type":"string"},"recording_seats":{"minimum":1,"type":"integer"},"selected_one_off_addon_ids":{"items":{"format":"uuid","type":"string"},"type":"array"},"setup_id":{"format":"uuid","type":"string"},"start_time":{"pattern":"^\\d{2}:\\d{2}(:\\d{2})?$","type":"string"}},"required":["date","setup_id","start_time"],"type":"object"},"minItems":1,"type":"array"}},"required":["consents","member_package_id","sessions"],"type":"object"},"ExternalPaymentReportRequest":{"additionalProperties":false,"description":"For an existing payment_id, omitting both amount and currency records the positive outstanding balance: payable face amount minus collections retained after successful refunds. A covered payable returns invalid_request. Successful refunds reopen that balance; pending refunds do not. The accepted amount is frozen for replay. Supply amount and currency for a partial collection or actual overcollection. Inline booking reports derive omitted money from the accepted booking quote.","properties":{"amount":{"type":"string"},"booking":{"$ref":"#/components/schemas/BookingCheckoutRequest"},"collection_id":{"format":"uuid","type":"string"},"currency":{"type":"string"},"merchant_reference":{"type":"string"},"payment_id":{"format":"uuid","type":"string"}},"type":"object"},"ErrorResponse":{"additionalProperties":true,"description":"Headless command error in the v1 envelope. incomplete_selection (422) requires remaining choices; stale_selection/idempotency_conflict (409) requires refreshing selections or a distinct command; operation_unavailable (404) never creates an obligation. Disabling headless_api blocks new entry while current authorized receipt replay and owned recovery remain available. public_api remains required.","properties":{"code":{"description":"Stable machine-readable error code; clients must tolerate new codes.","type":"string"},"errors":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"description":"Field validation messages when code is validation_failed.","type":"object"},"feature":{"description":"Required studio entitlement when code is feature_disabled; clients must tolerate new features.","type":"string"},"permissions":{"description":"Required permissions when code is permission_required.","items":{"$ref":"#/components/schemas/ApiPermission"},"type":"array"},"request_id":{"description":"Request correlation identifier.","type":"string"},"setup_choices":{"description":"Eligible destination setups when code is setup_selection_required.","items":{"additionalProperties":false,"properties":{"id":{"format":"uuid","type":"string"},"name":{"nullable":true,"type":"string"},"room_name":{"nullable":true,"type":"string"}},"required":["id","name","room_name"],"type":"object"},"type":"array"},"status":{"description":"HTTP response status.","type":"integer"},"title":{"type":"string"}},"required":["status","code","title","request_id"],"title":"ErrorResponse","type":"object"},"TourBookingRequest":{"additionalProperties":false,"properties":{"addons":{"items":{"additionalProperties":false,"properties":{"addon_id":{"format":"uuid","type":"string"},"quantity":{"minimum":1,"type":"integer"}},"required":["addon_id","quantity"],"type":"object"},"type":"array"},"consents":{"additionalProperties":false,"properties":{"terms":{"type":"boolean"}},"type":"object"},"custom_form_answers":{"additionalProperties":{"oneOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}]},"type":"object"},"date":{"format":"date","type":"string"},"email":{"format":"email","type":"string"},"guests":{"items":{"additionalProperties":false,"properties":{"email":{"type":"string"},"first_name":{"type":"string"},"last_name":{"type":"string"}},"required":["first_name","last_name","email"],"type":"object"},"type":"array"},"invoice_profile":{"additionalProperties":false,"properties":{"billing_fields":{"additionalProperties":{"type":"string"},"type":"object"},"type":{"enum":["individual","business"],"type":"string"}},"type":"object"},"payment_source":{"default":"native","enum":["native","external"],"type":"string"},"setup_id":{"format":"uuid","type":"string"},"start_time":{"type":"string"}},"required":["email","date","start_time"],"title":"TourBookingRequest","type":"object"},"AddonQuoteSelection":{"additionalProperties":false,"properties":{"lines":{"items":{"additionalProperties":false,"properties":{"addon_id":{"format":"uuid","type":"string"},"addon_version_id":{"format":"uuid","type":"string"},"line_total":{"pattern":"^-?[0-9]+(\\.[0-9]+)?$","type":"string"},"name":{"type":"string"},"quantity":{"minimum":1,"type":"integer"},"unit_price":{"pattern":"^-?[0-9]+(\\.[0-9]+)?$","type":"string"}},"required":["addon_id","addon_version_id","name","quantity","unit_price","line_total"],"type":"object"},"type":"array"},"slot_id":{"format":"uuid","type":"string"}},"required":["slot_id","lines"],"type":"object"},"ApiPermission":{"additionalProperties":true,"properties":{"action":{"type":"string"},"resource":{"type":"string"}},"required":["resource","action"],"title":"ApiPermission","type":"object"},"PackageQuote":{"additionalProperties":false,"properties":{"advisory?":{"type":"boolean"},"amount_due":{"type":"string"},"checked_at":{"format":"date-time","type":"string"},"currency":{"type":"string"},"date":{"format":"date","type":"string"},"duration_adjustment":{"enum":["none","package_unit","weekday_minimum"],"type":"string"},"duration_basis":{"enum":["local_wall_time"],"type":"string"},"duration_minutes":{"minimum":1,"type":"integer"},"effective_duration_minutes":{"minimum":1,"type":"integer"},"included_addons":{"items":{"additionalProperties":false,"properties":{"addon_id":{"format":"uuid","type":"string"},"addon_version_id":{"format":"uuid","type":"string"},"billing_scope":{"type":"string"},"display_quantity":{"type":"string"},"name":{"type":"string"},"omission":{"enum":["insufficient_allowance"],"nullable":true,"type":"string"},"plan_addon_id":{"format":"uuid","type":"string"},"price_unit":{"nullable":true,"type":"string"},"quantity":{"minimum":1,"type":"integer"},"unit_price":{"type":"string"}},"required":["addon_id","addon_version_id","billing_scope","display_quantity","name","omission","plan_addon_id","price_unit","quantity","unit_price"],"type":"object"},"type":"array"},"label":{"type":"string"},"member_package_id":{"format":"uuid","type":"string"},"omitted_addons":{"items":{"additionalProperties":false,"properties":{"addon_id":{"format":"uuid","type":"string"},"addon_version_id":{"format":"uuid","type":"string"},"billing_scope":{"type":"string"},"display_quantity":{"type":"string"},"name":{"type":"string"},"omission":{"enum":["insufficient_allowance"],"nullable":true,"type":"string"},"plan_addon_id":{"format":"uuid","type":"string"},"price_unit":{"nullable":true,"type":"string"},"quantity":{"minimum":1,"type":"integer"},"unit_price":{"type":"string"}},"required":["addon_id","addon_version_id","billing_scope","display_quantity","name","omission","plan_addon_id","price_unit","quantity","unit_price"],"type":"object"},"type":"array"},"one_off_addon_choices":{"items":{"additionalProperties":false,"properties":{"addon_id":{"format":"uuid","type":"string"},"available?":{"type":"boolean"},"name":{"type":"string"},"plan_addon_id":{"format":"uuid","type":"string"},"quantity":{"minimum":1,"type":"integer"}},"required":["addon_id","available?","name","plan_addon_id","quantity"],"type":"object"},"type":"array"},"package_type":{"enum":["bundle","subscription"],"type":"string"},"package_units":{"minimum":1,"type":"integer"},"package_version_id":{"format":"uuid","type":"string"},"payment_basis":{"enum":["paid_package"],"type":"string"},"requested_duration_minutes":{"minimum":1,"nullable":true,"type":"integer"},"room_id":{"format":"uuid","type":"string"},"service_id":{"format":"uuid","nullable":true,"type":"string"},"service_version_id":{"format":"uuid","nullable":true,"type":"string"},"setup_id":{"format":"uuid","type":"string"},"setup_version_id":{"format":"uuid","type":"string"},"start_time":{"pattern":"^\\d{2}:\\d{2}(:\\d{2})?$","type":"string"},"starts_at":{"format":"date-time","type":"string"},"timezone":{"type":"string"}},"required":["advisory?","amount_due","checked_at","currency","date","duration_adjustment","duration_basis","duration_minutes","effective_duration_minutes","included_addons","label","member_package_id","omitted_addons","one_off_addon_choices","package_type","package_units","package_version_id","payment_basis","requested_duration_minutes","room_id","service_id","service_version_id","setup_id","setup_version_id","start_time","starts_at","timezone"],"type":"object"},"ExternalRefundOutcomeInput":{"additionalProperties":false,"properties":{"outcome":{"enum":["succeeded","failed","reversed"],"type":"string"}},"required":["outcome"],"type":"object"},"SubscriptionManagementInput":{"additionalProperties":false,"properties":{"action":{"enum":["update_payment_method","change_plan","pause","resume"],"type":"string"}},"required":["action"],"type":"object"},"NotificationProcessing":{"additionalProperties":false,"description":"Fixed-size counts of retained generic notification jobs scoped to the owned resource. Processed means the worker completed and may have skipped delivery. Queued/retrying/exhausted/cancelled are processing facts, never sent/delivered receipts. Missing or pruned history leaves delivery unknown. No recipient, payload or raw error is exposed.","properties":{"cancelled":{"minimum":0,"type":"integer"},"delivery":{"enum":["unknown"],"type":"string"},"exhausted":{"minimum":0,"type":"integer"},"processed":{"minimum":0,"type":"integer"},"queued":{"minimum":0,"type":"integer"},"retrying":{"minimum":0,"type":"integer"}},"required":["queued","retrying","exhausted","cancelled","processed","delivery"],"type":"object"},"CustomerQuote":{"additionalProperties":false,"properties":{"advisory?":{"enum":[true],"type":"boolean"},"approval_required?":{"type":"boolean"},"checked_at":{"format":"date-time","type":"string"},"contract_version":{"enum":[1],"type":"integer"},"fingerprint":{"pattern":"^[a-f0-9]{64}$","type":"string"},"missing_inputs":{"items":{"type":"string"},"type":"array"},"pricing":{"additionalProperties":false,"nullable":true,"properties":{"amount_due":{"pattern":"^-?[0-9]+(\\.[0-9]+)?$","type":"string"},"credits":{"pattern":"^-?[0-9]+(\\.[0-9]+)?$","type":"string"},"currency":{"type":"string"},"discount":{"pattern":"^-?[0-9]+(\\.[0-9]+)?$","type":"string"},"gross":{"pattern":"^-?[0-9]+(\\.[0-9]+)?$","type":"string"},"net":{"pattern":"^-?[0-9]+(\\.[0-9]+)?$","type":"string"},"subtotal":{"pattern":"^-?[0-9]+(\\.[0-9]+)?$","type":"string"},"tax":{"pattern":"^-?[0-9]+(\\.[0-9]+)?$","type":"string"}},"required":["currency","subtotal","net","tax","gross","discount","credits","amount_due"],"type":"object"},"rail":{"enum":["booking","bundle","subscription","addon"],"type":"string"},"requirements":{"additionalProperties":false,"properties":{"consents":{"items":{"additionalProperties":false,"properties":{"content":{"nullable":true,"type":"string"},"title":{"nullable":true,"type":"string"},"type":{"enum":["terms","short_terms","refund_policy"],"type":"string"}},"type":"object"},"type":"array"},"file_transfer_options":{"additionalProperties":false,"properties":{"entries":{"items":{"additionalProperties":false,"properties":{"description":{"nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"price":{"additionalProperties":false,"properties":{"amount":{"pattern":"^-?[0-9]+(\\.[0-9]+)?$","type":"string"},"basis":{"enum":["catalog_rate"],"type":"string"},"currency":{"type":"string"},"tax_mode":{"enum":["including_tax","excluding_tax"],"type":"string"},"unit":{"type":"string"}},"type":"object"},"title":{"type":"string"},"version_id":{"format":"uuid","type":"string"}},"required":["id","version_id","title","description","price"],"type":"object"},"type":"array"},"page":{"minimum":1,"type":"integer"},"per_page":{"minimum":1,"type":"integer"},"total":{"minimum":0,"type":"integer"}},"type":"object"},"file_transfer_required?":{"type":"boolean"},"invoice_profile":{"additionalProperties":false,"properties":{"enabled?":{"type":"boolean"},"fields":{"items":{"additionalProperties":false,"properties":{"field_group":{"enum":["individual","business"],"type":"string"},"id":{"format":"uuid","type":"string"},"input_type":{"type":"string"},"key":{"type":"string"},"label":{"type":"string"},"required":{"type":"boolean"}},"type":"object"},"type":"array"}},"type":"object"},"recording_seats":{"items":{"additionalProperties":false,"properties":{"capacity":{"minimum":1,"type":"integer"},"required?":{"type":"boolean"},"session_index":{"minimum":0,"type":"integer"}},"type":"object"},"type":"array"},"recording_seats_question":{"nullable":true,"type":"string"},"session_details":{"additionalProperties":false,"properties":{"custom_form":{"additionalProperties":false,"nullable":true,"properties":{"description":{"type":"string"},"enabled":{"type":"boolean"},"questions":{"items":{"additionalProperties":false,"properties":{"helper":{"type":"string"},"id":{"type":"string"},"label":{"type":"string"},"options":{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array"},"placeholder":{"type":"string"},"required":{"type":"boolean"},"type":{"type":"string"}},"type":"object"},"type":"array"},"title":{"type":"string"}},"type":"object"},"guest_limit":{"minimum":1,"type":"integer"},"notes":{"additionalProperties":false,"properties":{"enabled?":{"type":"boolean"},"placeholder":{"nullable":true,"type":"string"},"required?":{"type":"boolean"},"title":{"nullable":true,"type":"string"}},"type":"object"}},"required":["custom_form","notes","guest_limit"],"type":"object"}},"required":["session_details","recording_seats","recording_seats_question","consents","invoice_profile","file_transfer_options","file_transfer_required?"],"type":"object"},"selection":{"nullable":true,"oneOf":[{"$ref":"#/components/schemas/BookingQuoteSelection"},{"$ref":"#/components/schemas/BundleQuoteSelection"},{"$ref":"#/components/schemas/SubscriptionQuoteSelection"},{"$ref":"#/components/schemas/AddonQuoteSelection"}],"type":"object"},"status":{"enum":["complete","incomplete"],"type":"string"}},"required":["contract_version","rail","status","advisory?","checked_at","fingerprint","missing_inputs","pricing","selection","requirements","approval_required?"],"title":"CustomerQuote","type":"object"},"BundlePlanCreateRequest":{"additionalProperties":false,"properties":{"addons":{"items":{"additionalProperties":false,"properties":{"addon_id":{"format":"uuid","type":"string"},"billing_scope":{"type":"string"},"quantity":{"type":"integer"}},"required":["addon_id","quantity","billing_scope"],"type":"object"},"type":"array"},"description":{"nullable":true,"type":"string"},"duration_minutes":{"type":"integer"},"images":{"additionalProperties":true,"type":"object"},"is_special_offer":{"type":"boolean"},"metadata":{"additionalProperties":true,"type":"object"},"name":{"type":"string"},"service_id":{"format":"uuid","nullable":true,"type":"string"},"short_description":{"nullable":true,"type":"string"},"show_in_top_bar":{"type":"boolean"},"show_on_home":{"type":"boolean"},"special_offer_badge":{"nullable":true,"type":"string"},"special_offer_card_title":{"nullable":true,"type":"string"},"special_offer_images":{"additionalProperties":true,"type":"object"},"special_offer_text":{"nullable":true,"type":"string"},"tiers":{"items":{"additionalProperties":false,"properties":{"discount_type":{"type":"string"},"discount_value":{"type":"string"},"price":{"type":"string"},"session_count":{"type":"integer"},"show_discount":{"type":"boolean"},"show_on_home":{"type":"boolean"},"sort_order":{"type":"integer"}},"required":["session_count"],"type":"object"},"type":"array"},"validity_days":{"maximum":36500,"minimum":1,"nullable":true,"type":"integer"}},"required":["name","duration_minutes"],"title":"BundlePlanCreateRequest","type":"object"},"GuestUpdateInput":{"additionalProperties":false,"properties":{"name":{"type":"string"},"notes":{"nullable":true,"type":"string"},"phone":{"nullable":true,"type":"string"},"status":{"enum":["invited","confirmed","declined"],"type":"string"}},"type":"object"},"ExternalRefund":{"additionalProperties":false,"properties":{"acceptance":{"additionalProperties":false,"properties":{"action":{"type":"string"},"http_status":{"type":"integer"}},"required":["action","http_status"],"type":"object"},"action_required":{"additionalProperties":false,"nullable":true,"properties":{"amount":{"type":"string"},"currency":{"type":"string"},"id":{"format":"uuid","type":"string"},"kind":{"enum":["external_refund"],"type":"string"},"status":{"enum":["required"],"type":"string"}},"required":["id","kind","status","amount","currency"],"type":"object"},"amount":{"type":"string"},"cancellation_refund_item_id":{"format":"uuid","nullable":true,"type":"string"},"collection_id":{"format":"uuid","type":"string"},"currency":{"type":"string"},"id":{"format":"uuid","type":"string"},"payment_id":{"format":"uuid","type":"string"},"refund_id":{"format":"uuid","type":"string"},"refunded_amount":{"type":"string"},"replaces_refund_id":{"format":"uuid","nullable":true,"type":"string"},"status":{"enum":["requested","succeeded","failed","reversed"],"type":"string"}},"required":["id","refund_id","payment_id","collection_id","status","amount","currency","refunded_amount","action_required","acceptance"],"type":"object"},"CatalogOverrides":{"additionalProperties":false,"properties":{"prices":{"items":{"additionalProperties":false,"properties":{"price":{"nullable":true,"type":"string"},"service_version_id":{"format":"uuid","type":"string"}},"required":["service_version_id","price"],"type":"object"},"type":"array"},"scheduling":{"additionalProperties":false,"properties":{"buffer_minutes":{"nullable":true,"type":"integer"},"cutoff_hours":{"nullable":true,"type":"integer"},"max_duration_minutes":{"nullable":true,"type":"integer"},"min_duration_minutes":{"nullable":true,"type":"integer"}},"type":"object"},"weekday_rules":{"items":{"additionalProperties":false,"properties":{"day_of_week":{"type":"integer"},"max_duration_minutes":{"nullable":true,"type":"integer"},"min_duration_minutes":{"nullable":true,"type":"integer"}},"required":["day_of_week"],"type":"object"},"type":"array"}},"type":"object"},"SessionAmendmentPreviewInput":{"additionalProperties":false,"properties":{"consents":{"additionalProperties":false,"properties":{"refund_policy":{"type":"boolean"},"short_terms":{"type":"boolean"},"terms":{"type":"boolean"}},"type":"object"},"credit_choice":{"enum":["none","use"],"type":"string"},"credit_limit":{"type":"string"},"payment_source":{"enum":["native","external"],"type":"string"},"proposal":{"$ref":"#/components/schemas/SessionAmendmentProposal"}},"required":["proposal","payment_source","credit_choice","consents"],"type":"object"},"AmendmentPreview":{"additionalProperties":false,"properties":{"owner_id":{"format":"uuid","type":"string"},"quote":{"additionalProperties":true,"type":"object"},"version":{"type":"string"}},"required":["owner_id","version","quote"],"type":"object"},"PackageAcceptance":{"additionalProperties":false,"properties":{"action":{"enum":["succeeded","accepted","action_required","unknown"],"type":"string"},"client_id":{"format":"uuid","type":"string"},"replayed":{"type":"boolean"},"resource_id":{"format":"uuid","type":"string"},"resource_type":{"enum":["package_redemption","subscription_management","subscription_session_grant","member_bundle","member_subscription"],"type":"string"}},"required":["action","replayed","resource_id","resource_type"],"type":"object"},"BookingQuoteSelection":{"additionalProperties":false,"properties":{"sessions":{"items":{"additionalProperties":true,"properties":{"addons":{"items":{"additionalProperties":false,"properties":{"addon_id":{"format":"uuid","type":"string"},"addon_version_id":{"format":"uuid","type":"string"},"name":{"type":"string"},"price_unit":{"nullable":true,"type":"string"},"quantity":{"minimum":1,"type":"integer"},"unit_price":{"pattern":"^-?[0-9]+(\\.[0-9]+)?$","type":"string"}},"required":["addon_id","addon_version_id","name","quantity","unit_price"],"type":"object"},"type":"array"},"date":{"format":"date","type":"string"},"day_rate_amount":{"pattern":"^-?[0-9]+(\\.[0-9]+)?$","type":"string"},"day_rate_by_the_hour":{"nullable":true,"pattern":"^-?[0-9]+(\\.[0-9]+)?$","type":"string"},"day_rate_minutes":{"minimum":1,"type":"integer"},"day_rate_name":{"type":"string"},"duration_minutes":{"minimum":1,"type":"integer"},"file_transfer_option_id":{"format":"uuid","nullable":true,"type":"string"},"file_transfer_option_price":{"nullable":true,"pattern":"^-?[0-9]+(\\.[0-9]+)?$","type":"string"},"file_transfer_option_title":{"nullable":true,"type":"string"},"file_transfer_option_version_id":{"format":"uuid","nullable":true,"type":"string"},"price_breakdown_lines":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"resolved_price":{"pattern":"^-?[0-9]+(\\.[0-9]+)?$","type":"string"},"room_id":{"format":"uuid","type":"string"},"room_name":{"type":"string"},"seats":{"minimum":1,"nullable":true,"type":"integer"},"service_day_rate_id":{"format":"uuid","type":"string"},"service_id":{"format":"uuid","type":"string"},"service_name":{"type":"string"},"service_price":{"pattern":"^-?[0-9]+(\\.[0-9]+)?$","type":"string"},"service_price_unit":{"type":"string"},"service_version_id":{"format":"uuid","type":"string"},"setup_id":{"format":"uuid","type":"string"},"setup_name":{"type":"string"},"setup_version_id":{"format":"uuid","type":"string"},"start_time":{"type":"string"}},"required":["service_id","service_version_id","setup_id","setup_version_id","room_id","date","start_time","duration_minutes","seats","addons"],"type":"object"},"type":"array"}},"required":["sessions"],"type":"object"},"AddonOffer":{"additionalProperties":false,"properties":{"description":{"nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"images":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"includes_file_transfer":{"type":"boolean"},"is_active":{"type":"boolean"},"max_quantity":{"nullable":true,"type":"integer"},"min_quantity":{"nullable":true,"type":"integer"},"name":{"type":"string"},"price":{"$ref":"#/components/schemas/ConfiguredRate"},"type":{"enum":["standard","standard_with_file_transfer","file_transfer"],"type":"string"},"version_id":{"format":"uuid","type":"string"},"version_number":{"type":"integer"},"visible_on_booking":{"type":"boolean"}},"required":["id","version_id","version_number","is_active","name","images"],"title":"AddonOffer","type":"object"},"AddonPurchaseCurrent":{"additionalProperties":false,"properties":{"addons":{"items":{"additionalProperties":false,"properties":{"addon_id":{"format":"uuid","type":"string"},"quantity":{"minimum":1,"type":"integer"}},"required":["addon_id","quantity"],"type":"object"},"type":"array"},"approval_status":{"type":"string"},"booking_id":{"format":"uuid","type":"string"},"booking_slot_id":{"format":"uuid","type":"string"},"client_id":{"format":"uuid","type":"string"},"collected_amount":{"type":"string"},"fulfillment_status":{"type":"string"},"id":{"format":"uuid","type":"string"},"instruction":{"additionalProperties":false,"nullable":true,"properties":{"amount":{"type":"string"},"client_secret":{"nullable":true,"type":"string"},"currency":{"type":"string"},"kind":{"enum":["no_payment_required","cash","stripe_elements","square_card","redirect"],"type":"string"},"payment_id":{"format":"uuid","nullable":true,"type":"string"},"payment_url":{"nullable":true,"type":"string"},"provider":{"nullable":true,"type":"string"},"provider_options":{"additionalProperties":true,"type":"object"}},"required":["kind","amount","currency"],"type":"object"},"payment_id":{"format":"uuid","type":"string"},"payment_status":{"nullable":true,"type":"string"},"refunded_amount":{"type":"string"},"required_action_amount":{"type":"string"},"selection_version":{"type":"string"},"status":{"enum":["active","retired"],"type":"string"}},"required":["approval_status","booking_id","booking_slot_id","client_id","fulfillment_status","id","payment_status","payment_id","selection_version","addons","status","instruction","collected_amount","refunded_amount","required_action_amount"],"type":"object"},"ConfiguredPrices":{"additionalProperties":false,"properties":{"entries":{"items":{"additionalProperties":false,"properties":{"price":{"$ref":"#/components/schemas/ConfiguredRate"},"room_id":{"format":"uuid","nullable":true,"type":"string"},"service_version_id":{"format":"uuid","type":"string"},"setup_id":{"format":"uuid","nullable":true,"type":"string"}},"required":["service_version_id","room_id","setup_id","price"],"type":"object"},"type":"array"},"page":{"type":"integer"},"per_page":{"type":"integer"},"total":{"minimum":0,"type":"integer"}},"required":["entries","page","per_page","total"],"type":"object"},"BundlePlanAuthoring":{"additionalProperties":false,"properties":{"addons":{"additionalProperties":false,"properties":{"entries":{"items":{"additionalProperties":false,"properties":{"addon_id":{"format":"uuid","type":"string"},"billing_scope":{"type":"string"},"id":{"format":"uuid","type":"string"},"quantity":{"type":"integer"}},"required":["addon_id","quantity","billing_scope"],"type":"object"},"type":"array"},"page":{"type":"integer"},"per_page":{"type":"integer"},"total":{"type":"integer"}},"required":["entries","page","per_page","total"],"type":"object"},"custom":{"type":"boolean"},"description":{"nullable":true,"type":"string"},"duration_minutes":{"type":"integer"},"id":{"format":"uuid","type":"string"},"images":{"additionalProperties":true,"type":"object"},"is_active":{"type":"boolean"},"is_special_offer":{"type":"boolean"},"metadata":{"additionalProperties":true,"type":"object"},"name":{"type":"string"},"offer_expires_at":{"format":"date-time","nullable":true,"type":"string"},"options":{"additionalProperties":false,"properties":{"entries":{"items":{"additionalProperties":false,"properties":{"discount_type":{"type":"string"},"discount_value":{"type":"string"},"id":{"format":"uuid","type":"string"},"price":{"type":"string"},"session_count":{"type":"integer"},"show_discount":{"type":"boolean"},"show_on_home":{"type":"boolean"},"sort_order":{"type":"integer"}},"required":["id","session_count","price"],"type":"object"},"type":"array"},"page":{"type":"integer"},"per_page":{"type":"integer"},"total":{"type":"integer"}},"required":["entries","page","per_page","total"],"type":"object"},"service_id":{"format":"uuid","nullable":true,"type":"string"},"short_description":{"nullable":true,"type":"string"},"show_in_top_bar":{"type":"boolean"},"show_on_home":{"type":"boolean"},"special_offer_badge":{"nullable":true,"type":"string"},"special_offer_card_title":{"nullable":true,"type":"string"},"special_offer_images":{"additionalProperties":true,"type":"object"},"special_offer_text":{"nullable":true,"type":"string"},"target_user_id":{"format":"uuid","nullable":true,"type":"string"},"validity_days":{"maximum":36500,"minimum":1,"nullable":true,"type":"integer"},"version_id":{"format":"uuid","type":"string"},"version_number":{"type":"integer"}},"required":["id","version_id","version_number","is_active","name","options","addons"],"title":"BundlePlanAuthoring","type":"object"},"RoomUpdateRequest":{"additionalProperties":false,"properties":{"capacity":{"type":"integer"},"description":{"nullable":true,"type":"string"},"images":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"metadata":{"additionalProperties":true,"type":"object"},"name":{"type":"string"},"overrides":{"$ref":"#/components/schemas/CatalogOverrides"}},"title":"RoomUpdateRequest","type":"object"},"SubscriptionPlanCreateRequest":{"additionalProperties":false,"properties":{"addons":{"items":{"additionalProperties":false,"properties":{"addon_id":{"format":"uuid","type":"string"},"billing_scope":{"type":"string"},"quantity":{"type":"integer"}},"required":["addon_id","quantity","billing_scope"],"type":"object"},"type":"array"},"cancellation_fee_amount":{"nullable":true,"type":"string"},"cancellation_policy":{"nullable":true,"type":"string"},"card_color":{"nullable":true,"type":"string"},"description":{"nullable":true,"type":"string"},"duration_minutes":{"type":"integer"},"durations":{"items":{"additionalProperties":false,"properties":{"discount_type":{"type":"string"},"discount_value":{"type":"string"},"period_months":{"type":"integer"},"price":{"type":"string"},"session_count":{"type":"integer"},"show_on_home":{"type":"boolean"},"sort_order":{"type":"integer"}},"required":["session_count"],"type":"object"},"type":"array"},"images":{"additionalProperties":true,"type":"object"},"is_special_offer":{"type":"boolean"},"metadata":{"additionalProperties":true,"type":"object"},"name":{"type":"string"},"rollover_days":{"type":"integer"},"rollover_unlimited":{"type":"boolean"},"service_id":{"format":"uuid","nullable":true,"type":"string"},"show_in_top_bar":{"type":"boolean"},"special_offer_badge":{"nullable":true,"type":"string"},"special_offer_card_title":{"nullable":true,"type":"string"},"special_offer_images":{"additionalProperties":true,"type":"object"},"special_offer_text":{"nullable":true,"type":"string"}},"required":["name","duration_minutes","service_id"],"title":"SubscriptionPlanCreateRequest","type":"object"},"SubscriptionCancellation":{"additionalProperties":false,"properties":{"failure_code":{"nullable":true,"type":"string"},"fee_payment_id":{"format":"uuid","nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"management_request_id":{"format":"uuid","nullable":true,"type":"string"},"management_status":{"enum":["pending","ready","failed"],"nullable":true,"type":"string"},"member_subscription_id":{"format":"uuid","type":"string"},"saga_id":{"format":"uuid","nullable":true,"type":"string"},"saga_status":{"enum":["pending","schedule_released","completed","fee_uncollectible"],"nullable":true,"type":"string"},"subscription_status":{"type":"string"}},"required":["id","member_subscription_id","subscription_status","saga_id","saga_status","fee_payment_id"],"type":"object"},"CheckoutEmptyRequest":{"additionalProperties":false,"properties":{},"type":"object"},"SubscriptionSessionGrantInput":{"additionalProperties":false,"properties":{"quantity":{"minimum":1,"type":"integer"}},"required":["quantity"],"type":"object"},"UpdateClientRequest":{"additionalProperties":false,"minProperties":1,"properties":{"first_name":{"nullable":true,"type":"string"},"last_name":{"nullable":true,"type":"string"},"name":{"nullable":true,"type":"string"},"phone":{"nullable":true,"type":"string"}},"title":"UpdateClientRequest","type":"object"},"StaffMoveInput":{"additionalProperties":false,"properties":{"date":{"format":"date","type":"string"},"override_tour_limit":{"type":"boolean"},"setup_id":{"description":"Selects the destination setup for studio-tour sessions only. Ordinary-session moves retain the booked setup; use the session amendment preview and acceptance operations to change it.","format":"uuid","type":"string"},"start_time":{"type":"string"}},"required":["date","start_time"],"type":"object"},"AddonPurchaseInput":{"additionalProperties":false,"properties":{"addons":{"items":{"additionalProperties":false,"properties":{"addon_id":{"format":"uuid","type":"string"},"quantity":{"minimum":1,"type":"integer"}},"required":["addon_id","quantity"],"type":"object"},"type":"array"},"consents":{"additionalProperties":false,"properties":{"refund_policy":{"type":"boolean"},"short_terms":{"type":"boolean"},"terms":{"type":"boolean"}},"type":"object"},"credit_choice":{"enum":["none","use"],"type":"string"},"credit_limit":{"type":"string"},"expected_version":{"type":"string"},"payment_source":{"enum":["native","external"],"type":"string"},"replaces_payment_id":{"format":"uuid","type":"string"}},"required":["addons","payment_source","credit_choice","consents"],"type":"object"},"MoveInput":{"additionalProperties":false,"properties":{"date":{"format":"date","type":"string"},"setup_id":{"description":"Selects the destination setup for studio-tour sessions only. Ordinary-session moves retain the booked setup; use the session amendment preview and acceptance operations to change it.","format":"uuid","type":"string"},"start_time":{"type":"string"}},"required":["date","start_time"],"type":"object"},"SessionAmendmentConfirmInput":{"additionalProperties":false,"properties":{"consents":{"additionalProperties":false,"properties":{"refund_policy":{"type":"boolean"},"short_terms":{"type":"boolean"},"terms":{"type":"boolean"}},"type":"object"},"credit_choice":{"enum":["none","use"],"type":"string"},"credit_limit":{"type":"string"},"expected_version":{"type":"string"},"payment_source":{"enum":["native","external"],"type":"string"},"proposal":{"$ref":"#/components/schemas/SessionAmendmentProposal"}},"required":["proposal","payment_source","credit_choice","consents","expected_version"],"type":"object"},"TourQuoteRequest":{"additionalProperties":false,"properties":{"addons":{"items":{"additionalProperties":false,"properties":{"addon_id":{"format":"uuid","type":"string"},"quantity":{"minimum":1,"type":"integer"}},"required":["addon_id","quantity"],"type":"object"},"type":"array"}},"type":"object"},"BundlePlanOffer":{"additionalProperties":false,"properties":{"addons":{"items":{"additionalProperties":false,"properties":{"billing_scope":{"type":"string"},"id":{"format":"uuid","type":"string"},"name":{"type":"string"},"quantity":{"type":"integer"}},"required":["id","name","quantity","billing_scope"],"type":"object"},"type":"array"},"addons_pagination":{"additionalProperties":false,"properties":{"page":{"type":"integer"},"per_page":{"type":"integer"},"total":{"type":"integer"}},"required":["page","per_page","total"],"type":"object"},"currency":{"type":"string"},"description":{"nullable":true,"type":"string"},"duration_minutes":{"type":"integer"},"id":{"format":"uuid","type":"string"},"images":{"additionalProperties":true,"type":"object"},"included_items":{"items":{"type":"string"},"type":"array"},"included_items_pagination":{"additionalProperties":false,"properties":{"page":{"type":"integer"},"per_page":{"type":"integer"},"total":{"type":"integer"}},"required":["page","per_page","total"],"type":"object"},"name":{"type":"string"},"options":{"items":{"additionalProperties":false,"properties":{"amount":{"type":"string"},"basis":{"type":"string"},"currency":{"type":"string"},"id":{"format":"uuid","type":"string"},"session_count":{"type":"integer"},"tax_mode":{"type":"string"},"unit":{"type":"string"}},"required":["id","amount","currency","unit","tax_mode","basis"],"type":"object"},"type":"array"},"options_pagination":{"additionalProperties":false,"properties":{"page":{"type":"integer"},"per_page":{"type":"integer"},"total":{"type":"integer"}},"required":["page","per_page","total"],"type":"object"},"service":{"additionalProperties":false,"nullable":true,"properties":{"id":{"format":"uuid","type":"string"},"name":{"type":"string"}},"required":["id","name"],"type":"object"},"validity_days":{"maximum":36500,"minimum":1,"nullable":true,"type":"integer"},"version_id":{"format":"uuid","type":"string"}},"required":["id","version_id","name","options","options_pagination","addons","addons_pagination","included_items","included_items_pagination","images"],"title":"BundlePlanOffer","type":"object"},"SetupUpdateRequest":{"additionalProperties":false,"properties":{"addon_ids":{"items":{"format":"uuid","type":"string"},"type":"array"},"description":{"nullable":true,"type":"string"},"images":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"metadata":{"additionalProperties":true,"type":"object"},"name":{"type":"string"},"overrides":{"$ref":"#/components/schemas/CatalogOverrides"},"room_id":{"format":"uuid","type":"string"},"seat_count":{"type":"integer"},"service_ids":{"items":{"format":"uuid","type":"string"},"type":"array"}},"title":"SetupUpdateRequest","type":"object"},"SessionAmendmentProposal":{"additionalProperties":false,"properties":{"addons":{"items":{"additionalProperties":false,"properties":{"addon_id":{"format":"uuid","type":"string"},"quantity":{"minimum":1,"type":"integer"}},"required":["addon_id","quantity"],"type":"object"},"type":"array"},"custom_form_answers":{"additionalProperties":{"oneOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}]},"type":"object"},"date":{"format":"date","type":"string"},"duration_minutes":{"minimum":1,"type":"integer"},"file_transfer_option_id":{"format":"uuid","nullable":true,"type":"string"},"guests":{"items":{"oneOf":[{"additionalProperties":false,"properties":{"email":{"nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"name":{"type":"string"}},"required":["id","name","email"],"type":"object"},{"additionalProperties":false,"properties":{"email":{"type":"string"},"name":{"type":"string"}},"required":["name","email"],"type":"object"}]},"type":"array"},"notes":{"nullable":true,"type":"string"},"recording_seats":{"minimum":1,"type":"integer"},"room_id":{"format":"uuid","type":"string"},"service_id":{"format":"uuid","type":"string"},"setup_id":{"format":"uuid","type":"string"},"start_time":{"type":"string"}},"required":["service_id","setup_id","room_id","date","start_time","duration_minutes","recording_seats","addons","file_transfer_option_id","guests","custom_form_answers"],"type":"object"},"AmendmentStart":{"additionalProperties":false,"properties":{"booking_slot_id":{"format":"uuid","type":"string"},"owner_id":{"format":"uuid","type":"string"},"proposal":{"additionalProperties":false,"properties":{"addons":{"items":{"additionalProperties":false,"properties":{"addon_id":{"format":"uuid","type":"string"},"quantity":{"minimum":1,"type":"integer"}},"required":["addon_id","quantity"],"type":"object"},"type":"array"},"custom_form_answers":{"additionalProperties":{"oneOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}]},"type":"object"},"date":{"format":"date","type":"string"},"duration_minutes":{"minimum":1,"type":"integer"},"file_transfer_option_id":{"format":"uuid","nullable":true,"type":"string"},"guests":{"items":{"oneOf":[{"additionalProperties":false,"properties":{"email":{"nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"name":{"type":"string"}},"required":["id","name","email"],"type":"object"},{"additionalProperties":false,"properties":{"email":{"type":"string"},"name":{"type":"string"}},"required":["name","email"],"type":"object"}]},"type":"array"},"notes":{"nullable":true,"type":"string"},"recording_seats":{"minimum":1,"type":"integer"},"room_id":{"format":"uuid","type":"string"},"service_id":{"format":"uuid","type":"string"},"setup_id":{"format":"uuid","type":"string"},"start_time":{"type":"string"}},"required":["service_id","setup_id","room_id","date","start_time","duration_minutes","recording_seats","addons","file_transfer_option_id","guests","custom_form_answers"],"type":"object"}},"required":["owner_id","booking_slot_id","proposal"],"type":"object"},"SubscriptionPlanPrivateOfferRequest":{"additionalProperties":false,"properties":{"delivery":{"enum":["payment_link","grant"],"type":"string"},"plan_attrs":{"$ref":"#/components/schemas/SubscriptionPlanUpdateRequest"},"target_user_id":{"format":"uuid","type":"string"},"validity":{"additionalProperties":false,"properties":{"unit":{"enum":["minutes","hours","days"],"type":"string"},"value":{"type":"integer"}},"required":["value","unit"],"type":"object"}},"required":["plan_attrs","target_user_id","delivery"],"title":"SubscriptionPlanPrivateOfferRequest","type":"object"},"SetupOffer":{"additionalProperties":false,"properties":{"addon_ids":{"items":{"format":"uuid","type":"string"},"type":"array"},"description":{"nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"images":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"is_active":{"type":"boolean"},"name":{"type":"string"},"room_id":{"format":"uuid","type":"string"},"seat_count":{"type":"integer"},"service_ids":{"items":{"format":"uuid","type":"string"},"type":"array"},"version_id":{"format":"uuid","type":"string"},"version_number":{"type":"integer"}},"required":["id","version_id","version_number","is_active","name","images"],"title":"SetupOffer","type":"object"},"ExternalRefundCollectionPage":{"additionalProperties":false,"properties":{"entries":{"items":{"additionalProperties":false,"properties":{"amount":{"type":"string"},"available_amount":{"type":"string"},"collection_id":{"format":"uuid","type":"string"},"currency":{"type":"string"},"refunded_amount":{"type":"string"}},"required":["collection_id","amount","currency","refunded_amount","available_amount"],"type":"object"},"maxItems":100,"type":"array"},"next_cursor":{"nullable":true,"type":"string"}},"required":["entries","next_cursor"],"type":"object"},"SetupCreateRequest":{"additionalProperties":false,"properties":{"addon_ids":{"items":{"format":"uuid","type":"string"},"type":"array"},"description":{"nullable":true,"type":"string"},"images":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"metadata":{"additionalProperties":true,"type":"object"},"name":{"type":"string"},"overrides":{"$ref":"#/components/schemas/CatalogOverrides"},"room_id":{"format":"uuid","type":"string"},"seat_count":{"type":"integer"},"service_ids":{"items":{"format":"uuid","type":"string"},"type":"array"}},"required":["name","room_id"],"title":"SetupCreateRequest","type":"object"},"Cancellation":{"additionalProperties":false,"properties":{"action_required":{"additionalProperties":false,"nullable":true,"properties":{"amount":{"type":"string"},"currency":{"type":"string"},"id":{"format":"uuid","type":"string"},"kind":{"enum":["external_refund"],"type":"string"},"status":{"enum":["required"],"type":"string"}},"required":["id","kind","status","amount","currency"],"type":"object"},"booking_id":{"format":"uuid","type":"string"},"fingerprint":{"type":"string"},"id":{"format":"uuid","type":"string"},"items":{"items":{"additionalProperties":false,"properties":{"amount":{"type":"string"},"collections":{"items":{"additionalProperties":false,"properties":{"amount":{"type":"string"},"available_amount":{"type":"string"},"collection_id":{"format":"uuid","type":"string"},"currency":{"type":"string"},"refunded_amount":{"type":"string"}},"required":["collection_id","amount","currency","refunded_amount","available_amount"],"type":"object"},"maxItems":25,"type":"array"},"collections_next_cursor":{"nullable":true,"type":"string"},"currency":{"type":"string"},"id":{"format":"uuid","type":"string"},"kind":{"type":"string"},"payment_id":{"format":"uuid","nullable":true,"type":"string"},"provider":{"nullable":true,"type":"string"},"remaining_amount":{"type":"string"},"status":{"type":"string"}},"required":["id","kind","provider","status","amount","remaining_amount","currency","collections","collections_next_cursor"],"type":"object"},"type":"array"},"refund_amount":{"type":"string"},"refund_status":{"enum":["planned","processing","completed","partially_resolved","failed","conflict","reconciling","awaiting_cash"],"type":"string"},"refunded_amount":{"type":"string"},"required_action_amount":{"type":"string"}},"required":["id","booking_id","fingerprint","refund_status","refund_amount","refunded_amount","required_action_amount","action_required","items"],"type":"object"},"BookingCheckoutRequest":{"additionalProperties":false,"properties":{"consents":{"additionalProperties":false,"properties":{"refund_policy":{"type":"boolean"},"short_terms":{"type":"boolean"},"terms":{"type":"boolean"}},"type":"object"},"credit_choice":{"enum":["auto","use","none"],"type":"string"},"email":{"format":"email","type":"string"},"invoice_profile":{"additionalProperties":false,"properties":{"billing_fields":{"additionalProperties":{"type":"string"},"type":"object"},"type":{"enum":["individual","business"],"type":"string"}},"type":"object"},"promo_code":{"type":"string"},"sessions":{"items":{"additionalProperties":false,"properties":{"addons":{"items":{"additionalProperties":false,"properties":{"addon_id":{"format":"uuid","type":"string"},"quantity":{"minimum":1,"type":"integer"}},"required":["addon_id","quantity"],"type":"object"},"type":"array"},"custom_form_answers":{"additionalProperties":{"oneOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}]},"type":"object"},"date":{"format":"date","type":"string"},"duration_minutes":{"minimum":1,"type":"integer"},"file_transfer_option_id":{"format":"uuid","type":"string"},"guests":{"items":{"additionalProperties":false,"properties":{"email":{"nullable":true,"type":"string"},"name":{"type":"string"}},"type":"object"},"type":"array"},"notes":{"type":"string"},"recording_seats":{"minimum":1,"type":"integer"},"room_id":{"format":"uuid","type":"string"},"service_id":{"format":"uuid","type":"string"},"setup_id":{"format":"uuid","type":"string"},"start_time":{"pattern":"^\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?$","type":"string"}},"type":"object"},"type":"array"}},"required":["email","sessions"],"title":"BookingCheckoutRequest","type":"object"},"InvoiceOutcome":{"additionalProperties":false,"description":"An owned issued invoice is authoritative, including historical payment-linked invoices. A completed issuance worker may have skipped unsupported work and never proves issuance. Unsupported describes current provider capability, not an issued invoice or a new invoicing engine.","properties":{"invoice_id":{"format":"uuid","nullable":true,"type":"string"},"reason":{"enum":["unsupported_provider"],"nullable":true,"type":"string"},"status":{"enum":["issued","unsupported","not_issued"],"type":"string"}},"required":["status","reason","invoice_id"],"type":"object"},"ServiceUpdateRequest":{"additionalProperties":false,"properties":{"addon_ids":{"items":{"format":"uuid","type":"string"},"type":"array"},"available_for_bundles":{"type":"boolean"},"available_for_subscriptions":{"type":"boolean"},"base_price":{"description":"Configured decimal amount in studio currency; domain validates precision and rules","pattern":"^[0-9]+(?:\\.[0-9]+)?$","type":"string"},"day_rates":{"items":{"additionalProperties":false,"properties":{"min_duration_minutes":{"type":"integer"},"name":{"type":"string"},"price":{"description":"Configured decimal amount in studio currency; domain validates precision and rules","pattern":"^[0-9]+(?:\\.[0-9]+)?$","type":"string"}},"required":["name","min_duration_minutes","price"],"type":"object"},"type":"array"},"description":{"nullable":true,"type":"string"},"images":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"metadata":{"additionalProperties":true,"type":"object"},"name":{"type":"string"},"price_unit":{"type":"string"},"promotion":{"additionalProperties":true,"type":"object"},"short_description":{"nullable":true,"type":"string"},"show_day_rates_on_card":{"type":"boolean"},"visible_on_booking":{"type":"boolean"}},"title":"ServiceUpdateRequest","type":"object"},"Acceptance":{"additionalProperties":false,"description":"Immutable result of command acceptance. Accepted means recorded/enqueued, not delivered. Fetch the owned resource for current asynchronous state. Unknown requires reconciliation, not blind duplicate collection.","properties":{"action":{"enum":["accepted","action_required","succeeded","unknown"],"type":"string"},"booking_id":{"format":"uuid","type":"string"},"client_id":{"format":"uuid","type":"string"},"collection_id":{"format":"uuid","type":"string"},"payment_id":{"format":"uuid","type":"string"},"reason_code":{"description":"Original external report refusal reason; current resolution is fetched separately.","type":"string"},"replayed":{"type":"boolean"},"resource_id":{"format":"uuid","type":"string"},"resource_type":{"enum":["services","rooms","setups","addons","bundle_plans","subscription_plans","headless_checkout","headless_purchase","external_payment_report","external_payable"],"type":"string"},"session_id":{"format":"uuid","type":"string"}},"required":["action","replayed"],"title":"Acceptance","type":"object"},"RoomAuthoring":{"additionalProperties":false,"properties":{"capacity":{"type":"integer"},"configured_prices":{"$ref":"#/components/schemas/ConfiguredPrices"},"description":{"nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"images":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"is_active":{"type":"boolean"},"location":{"type":"string"},"metadata":{"additionalProperties":true,"type":"object"},"name":{"type":"string"},"overrides":{"$ref":"#/components/schemas/CatalogOverrides"},"version_id":{"format":"uuid","type":"string"},"version_number":{"type":"integer"}},"required":["id","version_id","version_number","is_active","name","images"],"title":"RoomAuthoring","type":"object"},"CreateClientRequest":{"additionalProperties":false,"properties":{"account_type":{"default":"external","description":"New people default to external. Standard is an explicit activation request, requires clients:request_activation and email ownership proof; it never grants login by a typed email.","enum":["external","standard"],"type":"string"},"email":{"format":"email","type":"string"},"external_id":{"maxLength":255,"type":"string"},"first_name":{"nullable":true,"type":"string"},"last_name":{"nullable":true,"type":"string"},"name":{"nullable":true,"type":"string"},"phone":{"nullable":true,"type":"string"},"send_invitation":{"default":false,"description":"Only with account_type=standard. Studio explicitly chooses whether to email the activation proof.","type":"boolean"},"source":{"maxLength":255,"type":"string"}},"required":["email"],"title":"CreateClientRequest","type":"object"},"CancellationPreview":{"additionalProperties":true,"type":"object"},"BundlePlanUpdateRequest":{"additionalProperties":false,"properties":{"addons":{"items":{"additionalProperties":false,"properties":{"addon_id":{"format":"uuid","type":"string"},"billing_scope":{"type":"string"},"quantity":{"type":"integer"}},"required":["addon_id","quantity","billing_scope"],"type":"object"},"type":"array"},"description":{"nullable":true,"type":"string"},"duration_minutes":{"type":"integer"},"images":{"additionalProperties":true,"type":"object"},"is_special_offer":{"type":"boolean"},"metadata":{"additionalProperties":true,"type":"object"},"name":{"type":"string"},"service_id":{"format":"uuid","nullable":true,"type":"string"},"short_description":{"nullable":true,"type":"string"},"show_in_top_bar":{"type":"boolean"},"show_on_home":{"type":"boolean"},"special_offer_badge":{"nullable":true,"type":"string"},"special_offer_card_title":{"nullable":true,"type":"string"},"special_offer_images":{"additionalProperties":true,"type":"object"},"special_offer_text":{"nullable":true,"type":"string"},"tiers":{"items":{"additionalProperties":false,"properties":{"discount_type":{"type":"string"},"discount_value":{"type":"string"},"price":{"type":"string"},"session_count":{"type":"integer"},"show_discount":{"type":"boolean"},"show_on_home":{"type":"boolean"},"sort_order":{"type":"integer"}},"required":["session_count"],"type":"object"},"type":"array"},"validity_days":{"maximum":36500,"minimum":1,"nullable":true,"type":"integer"}},"title":"BundlePlanUpdateRequest","type":"object"},"AftercareCreditChoice":{"additionalProperties":false,"properties":{"credit_choice":{"enum":["none","use"],"type":"string"},"credit_limit":{"type":"string"}},"required":["credit_choice"],"type":"object"},"CommandResponse":{"additionalProperties":false,"properties":{"data":{"additionalProperties":false,"description":"Immutable result of command acceptance. Accepted means recorded/enqueued, not delivered. Fetch the owned resource for current asynchronous state. Unknown requires reconciliation, not blind duplicate collection.","properties":{"action":{"enum":["accepted","action_required","succeeded","unknown"],"type":"string"},"booking_id":{"format":"uuid","type":"string"},"client_id":{"format":"uuid","type":"string"},"collection_id":{"format":"uuid","type":"string"},"payment_id":{"format":"uuid","type":"string"},"reason_code":{"description":"Original external report refusal reason; current resolution is fetched separately.","type":"string"},"replayed":{"type":"boolean"},"resource_id":{"format":"uuid","type":"string"},"resource_type":{"enum":["services","rooms","setups","addons","bundle_plans","subscription_plans","headless_checkout","headless_purchase","external_payment_report","external_payable"],"type":"string"},"session_id":{"format":"uuid","type":"string"}},"required":["action","replayed"],"title":"Acceptance","type":"object"},"request_id":{"type":"string"}},"required":["data","request_id"],"title":"CommandResponse","type":"object"},"EmptyInput":{"additionalProperties":false,"properties":{},"type":"object"},"AddonQuoteRequest":{"additionalProperties":false,"properties":{"addons":{"items":{"additionalProperties":false,"properties":{"addon_id":{"format":"uuid","type":"string"},"quantity":{"minimum":1,"type":"integer"}},"required":["addon_id","quantity"],"type":"object"},"type":"array"},"client_id":{"format":"uuid","type":"string"},"consents":{"additionalProperties":false,"properties":{"refund_policy":{"type":"boolean"},"short_terms":{"type":"boolean"},"terms":{"type":"boolean"}},"type":"object"},"credit_choice":{"enum":["use","none"],"type":"string"},"invoice_profile":{"additionalProperties":false,"properties":{"billing_fields":{"additionalProperties":{"type":"string"},"type":"object"},"type":{"enum":["individual","business"],"type":"string"}},"type":"object"},"page":{"minimum":1,"type":"integer"},"per_page":{"maximum":100,"minimum":1,"type":"integer"},"slot_id":{"format":"uuid","type":"string"}},"title":"AddonQuoteRequest","type":"object"},"ConfiguredRate":{"additionalProperties":false,"properties":{"amount":{"type":"string"},"basis":{"enum":["catalog_rate"],"type":"string"},"currency":{"type":"string"},"tax_mode":{"enum":["including_tax","excluding_tax"],"type":"string"},"unit":{"type":"string"}},"required":["amount","currency","unit","basis","tax_mode"],"type":"object"},"Client":{"additionalProperties":false,"properties":{"account_lifecycle":{"enum":["external","standard"],"type":"string"},"email":{"format":"email","type":"string"},"external_references":{"items":{"additionalProperties":false,"properties":{"external_id":{"type":"string"},"source":{"type":"string"}},"required":["source","external_id"],"type":"object"},"type":"array"},"first_name":{"nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"last_name":{"nullable":true,"type":"string"},"name":{"nullable":true,"type":"string"},"phone":{"nullable":true,"type":"string"}},"required":["id","email","account_lifecycle","external_references"],"title":"Client","type":"object"},"SquareTokenRequest":{"additionalProperties":false,"properties":{"square_token":{"minLength":1,"type":"string"}},"required":["square_token"],"type":"object"},"SubscriptionQuoteRequest":{"additionalProperties":false,"properties":{"client_id":{"format":"uuid","type":"string"},"consents":{"additionalProperties":false,"properties":{"refund_policy":{"type":"boolean"},"short_terms":{"type":"boolean"},"terms":{"type":"boolean"}},"type":"object"},"credit_choice":{"enum":["auto","use","none"],"type":"string"},"duration_id":{"format":"uuid","type":"string"},"invoice_profile":{"additionalProperties":false,"properties":{"billing_fields":{"additionalProperties":{"type":"string"},"type":"object"},"type":{"enum":["individual","business"],"type":"string"}},"type":"object"},"page":{"minimum":1,"type":"integer"},"payment_source":{"default":"native","enum":["native","external"],"type":"string"},"per_page":{"maximum":100,"minimum":1,"type":"integer"},"promo_code":{"type":"string"},"subscription_plan_id":{"format":"uuid","type":"string"}},"title":"SubscriptionQuoteRequest","type":"object"},"SubscriptionManagement":{"additionalProperties":false,"properties":{"capabilities":{"additionalProperties":false,"properties":{"cancel":{"type":"boolean"},"change_plan":{"enum":[false],"type":"boolean"},"pause":{"enum":[false],"type":"boolean"},"resume":{"enum":[false],"type":"boolean"},"update_payment_method":{"type":"boolean"}},"required":["cancel","change_plan","pause","resume","update_payment_method"],"type":"object"},"client_id":{"format":"uuid","type":"string"},"failure_code":{"nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"instruction":{"additionalProperties":false,"nullable":true,"properties":{"kind":{"enum":["billing_portal"],"type":"string"},"url":{"format":"uri","type":"string"}},"required":["kind","url"],"type":"object"},"management_status":{"enum":["pending","ready","failed"],"nullable":true,"type":"string"},"plan_snapshot":{"additionalProperties":true,"nullable":true,"type":"object"},"remaining_units":{"minimum":0,"type":"integer"},"subscription_status":{"type":"string"},"term_end":{"format":"date-time","nullable":true,"type":"string"},"term_start":{"format":"date-time","nullable":true,"type":"string"}},"required":["capabilities","client_id","failure_code","id","instruction","management_status","plan_snapshot","remaining_units","subscription_status","term_end","term_start"],"type":"object"},"Purchase":{"additionalProperties":false,"properties":{"approval_status":{"enum":["required","approved","declined","not_required"],"type":"string"},"bundle_validity":{"additionalProperties":false,"nullable":true,"properties":{"days":{"maximum":36500,"minimum":1,"nullable":true,"type":"integer"},"expired":{"type":"boolean"},"valid_until":{"format":"date-time","nullable":true,"type":"string"}},"required":["days","valid_until","expired"],"type":"object"},"fulfillment_status":{"nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"instruction":{"additionalProperties":false,"nullable":true,"properties":{"amount":{"type":"string"},"client_secret":{"nullable":true,"type":"string"},"currency":{"type":"string"},"kind":{"enum":["no_payment_required","cash","stripe_elements","square_card","redirect"],"type":"string"},"options":{"additionalProperties":{"type":"string"},"type":"object"},"payment_id":{"format":"uuid","nullable":true,"type":"string"},"provider":{"nullable":true,"type":"string"}},"required":["kind","amount","currency","options"],"type":"object"},"invoice":{"$ref":"#/components/schemas/InvoiceOutcome"},"member_bundle_id":{"format":"uuid","nullable":true,"type":"string"},"member_subscription_id":{"format":"uuid","nullable":true,"type":"string"},"money":{"allOf":[{"$ref":"#/components/schemas/ReportedExternalMoney"}],"nullable":true},"notifications":{"$ref":"#/components/schemas/NotificationProcessing"},"payment_id":{"format":"uuid","nullable":true,"type":"string"},"payment_status":{"nullable":true,"type":"string"},"preparation":{"enum":["pending","ready","unknown","failed","cancelled"],"type":"string"},"purchase_status":{"nullable":true,"type":"string"},"rail":{"enum":["bundle","subscription"],"type":"string"},"subscription_cycle_id":{"format":"uuid","nullable":true,"type":"string"}},"required":["id","rail","preparation","instruction","payment_id","payment_status","fulfillment_status","approval_status","purchase_status","member_bundle_id","member_subscription_id"],"title":"Purchase","type":"object"},"ExternalRecoveryAcceptance":{"additionalProperties":false,"description":"Immutable result of command acceptance. Accepted means recorded/enqueued, not delivered. Fetch the owned resource for current asynchronous state. Unknown requires reconciliation, not blind duplicate collection.","properties":{"action":{"enum":["accepted","action_required","succeeded","unknown"],"type":"string"},"booking_id":{"format":"uuid","type":"string"},"client_id":{"format":"uuid","type":"string"},"collection_id":{"format":"uuid","type":"string"},"payment_id":{"format":"uuid","type":"string"},"reason_code":{"description":"Original external report refusal reason; current resolution is fetched separately.","type":"string"},"refund_id":{"format":"uuid","type":"string"},"replayed":{"type":"boolean"},"resource_id":{"format":"uuid","type":"string"},"resource_type":{"enum":["services","rooms","setups","addons","bundle_plans","subscription_plans","headless_checkout","headless_purchase","external_payment_report","external_payable","external_refund","external_payable_outcome","cancellation_refund","subscription_cancellation"],"type":"string"},"session_id":{"format":"uuid","type":"string"}},"required":["action","replayed"],"title":"ExternalRecoveryAcceptance","type":"object"},"TourOffer":{"additionalProperties":false,"properties":{"addon_ids":{"items":{"format":"uuid","type":"string"},"type":"array"},"consents":{"items":{"additionalProperties":false,"properties":{"content":{"nullable":true,"type":"string"},"title":{"nullable":true,"type":"string"},"type":{"type":"string"}},"required":["type","title","content"],"type":"object"},"type":"array"},"description":{"nullable":true,"type":"string"},"details":{"additionalProperties":false,"properties":{"asks_phone?":{"type":"boolean"},"guests":{"additionalProperties":false,"properties":{"allowed":{"minimum":0,"type":"integer"},"findings":{"additionalProperties":{"items":{"enum":["first_name_missing","last_name_missing","name_too_long","email_missing","email_too_long","invalid_email","duplicate_email"],"type":"string"},"type":"array"},"type":"object"},"surplus":{"minimum":0,"type":"integer"},"unreadable?":{"type":"boolean"}},"required":["allowed","surplus","unreadable?","findings"],"type":"object"},"missing_phone":{"enum":["missing","invalid",null],"nullable":true,"type":"string"},"missing_questions":{"items":{"type":"string"},"type":"array"},"step_applies?":{"type":"boolean"}},"required":["step_applies?","asks_phone?","missing_questions","missing_phone"],"type":"object"},"duration_minutes":{"minimum":1,"type":"integer"},"guests_allowed":{"maximum":20,"minimum":0,"type":"integer"},"id":{"format":"uuid","type":"string"},"name":{"type":"string"},"phone_required":{"type":"boolean"},"price":{"additionalProperties":false,"properties":{"addons_total":{"type":"string"},"currency":{"type":"string"},"entered":{"type":"string"},"line_items":{"items":{"additionalProperties":false,"properties":{"addon_version_id":{"format":"uuid","type":"string"},"base_price":{"type":"string"},"line_total":{"type":"string"},"name":{"type":"string"},"quantity":{"minimum":1,"type":"integer"},"unit_price":{"type":"string"}},"required":["addon_version_id","name","quantity","unit_price","base_price","line_total"],"type":"object"},"type":"array"},"subtotal":{"type":"string"},"tax_amount":{"type":"string"},"tax_rate":{"type":"string"},"total":{"type":"string"},"tour_line":{"type":"string"}},"required":["addons_total","currency","entered","line_items","subtotal","tax_amount","tax_rate","total","tour_line"],"type":"object"},"questions":{"items":{"additionalProperties":false,"properties":{"helper":{"type":"string"},"id":{"type":"string"},"label":{"type":"string"},"options":{"items":{"additionalProperties":false,"properties":{"id":{"type":"string"},"label":{"type":"string"}},"required":["id","label"],"type":"object"},"type":"array"},"placeholder":{"type":"string"},"required":{"type":"boolean"},"type":{"enum":["text","single_select","multi_select"],"type":"string"}},"required":["id","type","label","helper","placeholder","required","options"],"type":"object"},"type":"array"},"scheduling_mode":{"enum":["setup_bound","studio_wide"],"type":"string"},"setup_ids":{"items":{"format":"uuid","type":"string"},"type":"array"},"slug":{"type":"string"},"tour_type":{"enum":["free","paid"],"type":"string"}},"required":["addon_ids","consents","description","details","duration_minutes","guests_allowed","id","name","phone_required","price","questions","scheduling_mode","setup_ids","slug","tour_type"],"type":"object"},"SetupAuthoring":{"additionalProperties":false,"properties":{"addon_ids":{"items":{"format":"uuid","type":"string"},"type":"array"},"configured_prices":{"$ref":"#/components/schemas/ConfiguredPrices"},"description":{"nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"images":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"is_active":{"type":"boolean"},"metadata":{"additionalProperties":true,"type":"object"},"name":{"type":"string"},"overrides":{"$ref":"#/components/schemas/CatalogOverrides"},"room_id":{"format":"uuid","type":"string"},"seat_count":{"type":"integer"},"service_ids":{"items":{"format":"uuid","type":"string"},"type":"array"},"version_id":{"format":"uuid","type":"string"},"version_number":{"type":"integer"}},"required":["id","version_id","version_number","is_active","name","images"],"title":"SetupAuthoring","type":"object"},"AftercareAcceptance":{"additionalProperties":false,"properties":{"action":{"enum":["accepted","action_required","succeeded","unknown"],"type":"string"},"booking_id":{"format":"uuid","type":"string"},"client_id":{"format":"uuid","type":"string"},"payment_id":{"format":"uuid","type":"string"},"replayed":{"type":"boolean"},"resource_id":{"format":"uuid","type":"string"},"resource_type":{"enum":["guest","booking_slot","addon_purchase","session_amendment"],"type":"string"},"session_id":{"format":"uuid","type":"string"}},"required":["action","replayed"],"type":"object"},"BookingCancellationInput":{"additionalProperties":false,"properties":{"expected_fingerprint":{"minLength":1,"type":"string"},"slot_id":{"format":"uuid","type":"string"}},"type":"object"},"AddonUpdateRequest":{"additionalProperties":false,"properties":{"base_price":{"description":"Configured decimal amount in studio currency; domain validates precision and rules","pattern":"^[0-9]+(?:\\.[0-9]+)?$","type":"string"},"description":{"nullable":true,"type":"string"},"images":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"includes_file_transfer":{"type":"boolean"},"max_quantity":{"nullable":true,"type":"integer"},"metadata":{"additionalProperties":true,"type":"object"},"min_quantity":{"nullable":true,"type":"integer"},"name":{"type":"string"},"price_unit":{"type":"string"},"type":{"enum":["standard","standard_with_file_transfer","file_transfer"],"type":"string"},"visible_on_booking":{"type":"boolean"}},"title":"AddonUpdateRequest","type":"object"},"ApiErrorResponse":{"additionalProperties":true,"properties":{"code":{"description":"Stable machine-readable error code; clients must tolerate new codes.","type":"string"},"errors":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"description":"Field validation messages when code is validation_failed.","type":"object"},"feature":{"description":"Required studio entitlement when code is feature_disabled; clients must tolerate new features.","type":"string"},"permissions":{"description":"Required permissions when code is permission_required.","items":{"$ref":"#/components/schemas/ApiPermission"},"type":"array"},"request_id":{"description":"Request correlation identifier.","type":"string"},"setup_choices":{"description":"Eligible destination setups when code is setup_selection_required.","items":{"additionalProperties":false,"properties":{"id":{"format":"uuid","type":"string"},"name":{"nullable":true,"type":"string"},"room_name":{"nullable":true,"type":"string"}},"required":["id","name","room_name"],"type":"object"},"type":"array"},"status":{"description":"HTTP response status.","type":"integer"},"title":{"type":"string"}},"required":["status","code","title","request_id"],"title":"ApiErrorResponse","type":"object"},"SubscriptionPlanUpdateRequest":{"additionalProperties":false,"properties":{"addons":{"items":{"additionalProperties":false,"properties":{"addon_id":{"format":"uuid","type":"string"},"billing_scope":{"type":"string"},"quantity":{"type":"integer"}},"required":["addon_id","quantity","billing_scope"],"type":"object"},"type":"array"},"cancellation_fee_amount":{"nullable":true,"type":"string"},"cancellation_policy":{"nullable":true,"type":"string"},"card_color":{"nullable":true,"type":"string"},"description":{"nullable":true,"type":"string"},"duration_minutes":{"type":"integer"},"durations":{"items":{"additionalProperties":false,"properties":{"discount_type":{"type":"string"},"discount_value":{"type":"string"},"period_months":{"type":"integer"},"price":{"type":"string"},"session_count":{"type":"integer"},"show_on_home":{"type":"boolean"},"sort_order":{"type":"integer"}},"required":["session_count"],"type":"object"},"type":"array"},"images":{"additionalProperties":true,"type":"object"},"is_special_offer":{"type":"boolean"},"metadata":{"additionalProperties":true,"type":"object"},"name":{"type":"string"},"rollover_days":{"type":"integer"},"rollover_unlimited":{"type":"boolean"},"service_id":{"format":"uuid","nullable":true,"type":"string"},"show_in_top_bar":{"type":"boolean"},"special_offer_badge":{"nullable":true,"type":"string"},"special_offer_card_title":{"nullable":true,"type":"string"},"special_offer_images":{"additionalProperties":true,"type":"object"},"special_offer_text":{"nullable":true,"type":"string"}},"title":"SubscriptionPlanUpdateRequest","type":"object"},"ActivationRequest":{"additionalProperties":false,"properties":{"send_invitation":{"default":true,"type":"boolean"}},"title":"ActivationRequest","type":"object"},"TourAvailability":{"additionalProperties":false,"properties":{"date":{"format":"date","type":"string"},"times":{"items":{"additionalProperties":false,"properties":{"setup_ids":{"items":{"format":"uuid","type":"string"},"type":"array"},"start_time":{"type":"string"}},"required":["start_time","setup_ids"],"type":"object"},"type":"array"},"tour_id":{"format":"uuid","type":"string"}},"required":["tour_id","date","times"],"type":"object"},"GuestInput":{"additionalProperties":false,"properties":{"email":{"type":"string"},"name":{"type":"string"},"notes":{"nullable":true,"type":"string"},"phone":{"nullable":true,"type":"string"}},"required":["name"],"type":"object"},"ExternalSubscriptionCycleInput":{"additionalProperties":false,"properties":{"amount":{"type":"string"},"collection_id":{"format":"uuid","type":"string"},"currency":{"pattern":"^[A-Z]{3}$","type":"string"},"cycle_id":{"format":"uuid","type":"string"},"outcome":{"enum":["failed","paid"],"type":"string"},"predecessor_cycle_id":{"format":"uuid","type":"string"}},"required":["cycle_id","predecessor_cycle_id","outcome"],"title":"ExternalSubscriptionCycleInput","type":"object"},"PackageRightsPage":{"additionalProperties":false,"properties":{"entries":{"items":{"additionalProperties":false,"properties":{"addons":{"additionalProperties":false,"properties":{"page":{"minimum":1,"type":"integer"},"per_page":{"minimum":1,"type":"integer"},"total":{"minimum":0,"type":"integer"}},"required":["page","per_page","total"],"type":"object"},"coverage":{"enum":["covered","insufficient_allowance"],"type":"string"},"duration_adjustment":{"enum":["none","package_unit"],"type":"string"},"effective_duration_minutes":{"minimum":1,"type":"integer"},"id":{"format":"uuid","type":"string"},"included_addons":{"items":{"additionalProperties":false,"properties":{"addon_id":{"format":"uuid","type":"string"},"addon_version_id":{"format":"uuid","type":"string"},"billing_scope":{"type":"string"},"display_quantity":{"type":"string"},"name":{"type":"string"},"omission":{"enum":["insufficient_allowance"],"nullable":true,"type":"string"},"plan_addon_id":{"format":"uuid","type":"string"},"price_unit":{"nullable":true,"type":"string"},"quantity":{"minimum":1,"type":"integer"},"unit_price":{"type":"string"}},"required":["addon_id","addon_version_id","billing_scope","display_quantity","name","omission","plan_addon_id","price_unit","quantity","unit_price"],"type":"object"},"type":"array"},"label":{"type":"string"},"one_off_addon_choices":{"items":{"additionalProperties":false,"properties":{"addon_id":{"format":"uuid","type":"string"},"addon_version_id":{"format":"uuid","type":"string"},"available?":{"type":"boolean"},"billing_scope":{"type":"string"},"display_quantity":{"type":"string"},"name":{"type":"string"},"omission":{"enum":["insufficient_allowance"],"nullable":true,"type":"string"},"plan_addon_id":{"format":"uuid","type":"string"},"price_unit":{"nullable":true,"type":"string"},"quantity":{"minimum":1,"type":"integer"},"remaining_quantity":{"minimum":0,"type":"integer"},"unavailable_reason":{"enum":["already_consumed","already_staged","insufficient_allowance"],"nullable":true,"type":"string"},"unit_price":{"type":"string"}},"required":["addon_id","addon_version_id","available?","billing_scope","display_quantity","name","omission","plan_addon_id","price_unit","quantity","remaining_quantity","unavailable_reason","unit_price"],"type":"object"},"type":"array"},"package_type":{"enum":["bundle","subscription"],"type":"string"},"package_units":{"minimum":1,"type":"integer"},"remaining_units":{"minimum":0,"type":"integer"},"requested_duration_minutes":{"minimum":1,"nullable":true,"type":"integer"},"restrictions":{"additionalProperties":false,"properties":{"paid_extras":{"enum":["separate_booking"],"type":"string"},"service_id":{"format":"uuid","nullable":true,"type":"string"}},"required":["paid_extras","service_id"],"type":"object"},"service_id":{"format":"uuid","nullable":true,"type":"string"},"service_label":{"nullable":true,"type":"string"},"unit_duration_minutes":{"minimum":1,"type":"integer"}},"required":["coverage","duration_adjustment","effective_duration_minutes","id","included_addons","label","one_off_addon_choices","package_type","package_units","remaining_units","requested_duration_minutes","restrictions","service_id","service_label","unit_duration_minutes"],"type":"object"},"type":"array"},"page":{"minimum":1,"type":"integer"},"per_page":{"minimum":1,"type":"integer"},"total":{"minimum":0,"type":"integer"}},"required":["entries","page","per_page","total"],"type":"object"},"ExternalSubscriptionCycle":{"additionalProperties":false,"properties":{"action_required":{"additionalProperties":false,"nullable":true,"properties":{"amount":{"nullable":true,"type":"string"},"currency":{"nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"kind":{"type":"string"},"status":{"type":"string"}},"required":["id","kind","status"],"type":"object"},"applied":{"type":"boolean"},"collected_amount":{"type":"string"},"coverage":{"enum":["covered","underfunded","unresolved"],"type":"string"},"cycle_id":{"format":"uuid","type":"string"},"id":{"format":"uuid","type":"string"},"kind":{"enum":["initial","renewal"],"type":"string"},"member_subscription_id":{"format":"uuid","type":"string"},"payment_id":{"format":"uuid","type":"string"},"predecessor_cycle_id":{"format":"uuid","nullable":true,"type":"string"},"refunded_amount":{"type":"string"},"status":{"enum":["pending","failed","paid"],"type":"string"},"term_end":{"format":"date-time","nullable":true,"type":"string"},"term_start":{"format":"date-time","nullable":true,"type":"string"}},"required":["id","cycle_id","kind","member_subscription_id","payment_id","predecessor_cycle_id","term_start","term_end","status","applied","coverage","collected_amount","refunded_amount","action_required"],"title":"ExternalSubscriptionCycle","type":"object"},"ReportedExternalMoney":{"additionalProperties":false,"description":"Actual studio-reported external money. Amount due is the frozen payable, collections are actual gross, refunds require successful outcomes and retained amount is the actual net balance. Owed compensation is separate from completed purchase value, approval and fulfillment.","properties":{"action_required":{"additionalProperties":false,"nullable":true,"properties":{"amount":{"nullable":true,"type":"string"},"currency":{"nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"kind":{"enum":["external_refund","reconciliation"],"type":"string"},"status":{"enum":["required"],"type":"string"}},"required":["id","kind","status","amount","currency"],"type":"object"},"amount_due":{"type":"string"},"collected_amount":{"type":"string"},"coverage":{"enum":["underfunded","covered","unresolved"],"type":"string"},"currency":{"type":"string"},"refunded_amount":{"type":"string"},"required_action_amount":{"nullable":true,"type":"string"},"required_action_count":{"minimum":0,"type":"integer"},"retained_amount":{"type":"string"},"source":{"enum":["reported_external"],"type":"string"}},"required":["source","currency","amount_due","collected_amount","refunded_amount","retained_amount","coverage","required_action_count","required_action_amount","action_required"],"type":"object"},"SessionAmendmentCurrent":{"additionalProperties":false,"properties":{"approval_status":{"type":"string"},"booking_id":{"format":"uuid","type":"string"},"booking_slot_id":{"format":"uuid","type":"string"},"client_id":{"format":"uuid","type":"string"},"collection_payment_id":{"format":"uuid","nullable":true,"type":"string"},"compensation":{"additionalProperties":false,"properties":{"refunded_amount":{"type":"string"},"required_action_amount":{"type":"string"}},"required":["refunded_amount","required_action_amount"],"type":"object"},"expires_at":{"format":"date-time","nullable":true,"type":"string"},"fulfillment_status":{"type":"string"},"id":{"format":"uuid","type":"string"},"instruction":{"additionalProperties":false,"nullable":true,"properties":{"amount":{"type":"string"},"client_secret":{"nullable":true,"type":"string"},"currency":{"type":"string"},"kind":{"enum":["no_payment_required","cash","stripe_elements","square_card","redirect"],"type":"string"},"payment_id":{"format":"uuid","nullable":true,"type":"string"},"payment_url":{"nullable":true,"type":"string"},"provider":{"nullable":true,"type":"string"},"provider_options":{"additionalProperties":true,"type":"object"}},"required":["kind","amount","currency"],"type":"object"},"payment_status":{"nullable":true,"type":"string"},"pending":{"additionalProperties":false,"nullable":true,"properties":{"after_total":{"type":"string"},"amendment_id":{"format":"uuid","type":"string"},"before_total":{"type":"string"},"cash_due":{"nullable":true,"type":"string"},"cash_reduction":{"nullable":true,"type":"string"},"credits":{"nullable":true,"type":"string"},"expires_at":{"format":"date-time","nullable":true,"type":"string"},"held_after_total":{"type":"string"},"held_before_total":{"type":"string"},"moves_time?":{"type":"boolean"},"owner_id":{"format":"uuid","type":"string"},"state":{"enum":["awaiting_approval","approved","declined","withdrawn","expired"],"type":"string"},"wallet_credit":{"nullable":true,"type":"string"}},"required":["after_total","amendment_id","before_total","cash_due","cash_reduction","credits","expires_at","held_after_total","held_before_total","moves_time?","owner_id","state","wallet_credit"],"type":"object"},"quote_version":{"type":"string"},"result":{"additionalProperties":false,"nullable":true,"properties":{"after_total":{"type":"string"},"amendment_id":{"format":"uuid","type":"string"},"before_total":{"type":"string"},"cash_due":{"nullable":true,"type":"string"},"cash_reduction":{"nullable":true,"type":"string"},"credits":{"nullable":true,"type":"string"},"held_after_total":{"type":"string"},"held_before_total":{"type":"string"},"owner_id":{"format":"uuid","type":"string"},"paid_at_studio?":{"type":"boolean"},"wallet_credit":{"nullable":true,"type":"string"}},"required":["after_total","amendment_id","before_total","cash_due","cash_reduction","credits","held_after_total","held_before_total","owner_id","paid_at_studio?","wallet_credit"],"type":"object"},"session_application_status":{"type":"string"},"settlement_status":{"type":"string"}},"required":["approval_status","booking_id","booking_slot_id","client_id","fulfillment_status","id","payment_status","instruction","quote_version","expires_at","settlement_status","session_application_status","collection_payment_id","result","pending","compensation"],"type":"object"},"ExternalRefundInput":{"additionalProperties":false,"properties":{"amount":{"type":"string"},"cancellation_refund_item_id":{"format":"uuid","type":"string"},"collection_id":{"format":"uuid","type":"string"},"currency":{"type":"string"},"payment_id":{"format":"uuid","type":"string"},"refund_id":{"format":"uuid","type":"string"},"replaces_refund_id":{"format":"uuid","type":"string"}},"required":["payment_id","collection_id","refund_id","amount","currency"],"type":"object"},"ExternalSubscriptionCycleAcceptance":{"additionalProperties":false,"description":"Immutable result of command acceptance. Accepted means recorded/enqueued, not delivered. Fetch the owned resource for current asynchronous state. Unknown requires reconciliation, not blind duplicate collection.","properties":{"action":{"enum":["accepted","action_required","succeeded","unknown"],"type":"string"},"booking_id":{"format":"uuid","type":"string"},"client_id":{"format":"uuid","type":"string"},"collection_id":{"format":"uuid","type":"string"},"payment_id":{"format":"uuid","type":"string"},"reason_code":{"description":"Original external report refusal reason; current resolution is fetched separately.","type":"string"},"replayed":{"type":"boolean"},"resource_id":{"format":"uuid","type":"string"},"resource_type":{"enum":["external_subscription_cycle"],"type":"string"},"session_id":{"format":"uuid","type":"string"}},"required":["action","replayed","resource_type","resource_id"],"title":"ExternalSubscriptionCycleAcceptance","type":"object"},"ExternalPaymentResolutionRequest":{"additionalProperties":false,"description":"When resolving against a payment_id, omitting both amount and currency uses its positive outstanding balance after successful refunds. A covered payable returns invalid_request; pending refunds do not reopen the balance. The derived accepted amount is frozen for replay.","properties":{"amount":{"type":"string"},"currency":{"type":"string"},"payment_id":{"format":"uuid","type":"string"}},"type":"object"},"SubscriptionPurchaseRequest":{"additionalProperties":false,"properties":{"consents":{"additionalProperties":false,"properties":{"refund_policy":{"type":"boolean"},"short_terms":{"type":"boolean"},"terms":{"type":"boolean"}},"type":"object"},"credit_choice":{"enum":["auto","use","none"],"type":"string"},"duration_id":{"format":"uuid","type":"string"},"email":{"format":"email","type":"string"},"invoice_profile":{"additionalProperties":false,"properties":{"billing_fields":{"additionalProperties":{"type":"string"},"type":"object"},"type":{"enum":["individual","business"],"type":"string"}},"type":"object"},"promo_code":{"type":"string"},"subscription_plan_id":{"format":"uuid","type":"string"}},"required":["email"],"title":"SubscriptionPurchaseRequest","type":"object"},"ServiceOffer":{"additionalProperties":false,"properties":{"addon_ids":{"items":{"format":"uuid","type":"string"},"type":"array"},"available_for_bundles":{"type":"boolean"},"available_for_subscriptions":{"type":"boolean"},"day_rates":{"items":{"additionalProperties":false,"properties":{"id":{"format":"uuid","type":"string"},"min_duration_minutes":{"type":"integer"},"name":{"type":"string"},"price":{"$ref":"#/components/schemas/ConfiguredRate"}},"required":["id","name","min_duration_minutes","price"],"type":"object"},"type":"array"},"description":{"nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"images":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"is_active":{"type":"boolean"},"name":{"type":"string"},"price":{"$ref":"#/components/schemas/ConfiguredRate"},"short_description":{"nullable":true,"type":"string"},"version_id":{"format":"uuid","type":"string"},"version_number":{"type":"integer"},"visible_on_booking":{"type":"boolean"}},"required":["id","version_id","version_number","is_active","name","images"],"title":"ServiceOffer","type":"object"},"Checkout":{"additionalProperties":false,"properties":{"approval_status":{"enum":["required","approved","not_required"],"type":"string"},"booking_id":{"format":"uuid","type":"string"},"booking_status":{"type":"string"},"fulfillment_status":{"nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"instruction":{"additionalProperties":false,"nullable":true,"properties":{"amount":{"type":"string"},"client_secret":{"nullable":true,"type":"string"},"currency":{"type":"string"},"kind":{"enum":["no_payment_required","cash","stripe_elements","square_card","redirect"],"type":"string"},"payment_id":{"format":"uuid","nullable":true,"type":"string"},"payment_url":{"nullable":true,"type":"string"},"provider":{"nullable":true,"type":"string"},"provider_options":{"additionalProperties":true,"type":"object"}},"required":["kind","amount","currency"],"type":"object"},"invoice":{"$ref":"#/components/schemas/InvoiceOutcome"},"money":{"allOf":[{"$ref":"#/components/schemas/ReportedExternalMoney"}],"nullable":true},"notifications":{"$ref":"#/components/schemas/NotificationProcessing"},"payment_id":{"format":"uuid","nullable":true,"type":"string"},"payment_status":{"nullable":true,"type":"string"},"preparation":{"enum":["pending","ready","unknown","failed","cancelled"],"type":"string"},"refund_amount":{"type":"string"}},"required":["id","booking_id","preparation","booking_status","payment_status","fulfillment_status","approval_status"],"type":"object"},"PackageRedemption":{"additionalProperties":false,"properties":{"booking_ids":{"items":{"format":"uuid","type":"string"},"type":"array"},"bookings":{"items":{"additionalProperties":false,"properties":{"id":{"format":"uuid","type":"string"},"status":{"type":"string"}},"required":["id","status"],"type":"object"},"type":"array"},"client_id":{"format":"uuid","type":"string"},"id":{"format":"uuid","type":"string"},"member_package_id":{"format":"uuid","type":"string"},"package_type":{"enum":["bundle","subscription"],"type":"string"}},"required":["booking_ids","bookings","client_id","id","member_package_id","package_type"],"type":"object"},"GuestList":{"items":{"additionalProperties":false,"properties":{"booking_slot_id":{"format":"uuid","type":"string"},"email":{"nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"name":{"nullable":true,"type":"string"},"notes":{"nullable":true,"type":"string"},"phone":{"nullable":true,"type":"string"},"status":{"type":"string"}},"required":["id","booking_slot_id","name","status"],"type":"object"},"type":"array"},"BookingQuoteRequest":{"additionalProperties":false,"properties":{"client_id":{"format":"uuid","type":"string"},"consents":{"additionalProperties":false,"properties":{"refund_policy":{"type":"boolean"},"short_terms":{"type":"boolean"},"terms":{"type":"boolean"}},"type":"object"},"credit_choice":{"enum":["auto","use","none"],"type":"string"},"invoice_profile":{"additionalProperties":false,"properties":{"billing_fields":{"additionalProperties":{"type":"string"},"type":"object"},"type":{"enum":["individual","business"],"type":"string"}},"type":"object"},"page":{"minimum":1,"type":"integer"},"per_page":{"maximum":100,"minimum":1,"type":"integer"},"promo_code":{"type":"string"},"sessions":{"items":{"additionalProperties":false,"properties":{"addons":{"items":{"additionalProperties":false,"properties":{"addon_id":{"format":"uuid","type":"string"},"quantity":{"minimum":1,"type":"integer"}},"required":["addon_id","quantity"],"type":"object"},"type":"array"},"custom_form_answers":{"additionalProperties":{"oneOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}]},"type":"object"},"date":{"format":"date","type":"string"},"duration_minutes":{"minimum":1,"type":"integer"},"file_transfer_option_id":{"format":"uuid","type":"string"},"guests":{"items":{"additionalProperties":false,"properties":{"email":{"nullable":true,"type":"string"},"name":{"type":"string"}},"type":"object"},"type":"array"},"notes":{"type":"string"},"recording_seats":{"minimum":1,"type":"integer"},"room_id":{"format":"uuid","type":"string"},"service_id":{"format":"uuid","type":"string"},"setup_id":{"format":"uuid","type":"string"},"start_time":{"pattern":"^\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?$","type":"string"}},"type":"object"},"type":"array"}},"title":"BookingQuoteRequest","type":"object"},"CustomerAvailability":{"additionalProperties":false,"properties":{"calendar_status":{"enum":["verified","unverified"],"type":"string"},"checked_at":{"format":"date-time","type":"string"},"date_from":{"format":"date","type":"string"},"date_to":{"format":"date","type":"string"},"duration_basis":{"enum":["local_wall_time"],"type":"string"},"duration_minutes":{"minimum":1,"nullable":true,"type":"integer"},"entries":{"items":{"additionalProperties":false,"properties":{"days":{"items":{"additionalProperties":false,"properties":{"date":{"format":"date","type":"string"},"intervals":{"items":{"additionalProperties":false,"properties":{"end_status":{"enum":["resolved","gap_time"],"type":"string"},"end_time":{"pattern":"^\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?$","type":"string"},"ends_at":{"format":"date-time","nullable":true,"type":"string"},"start_time":{"pattern":"^\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?$","type":"string"},"starts_at":{"format":"date-time","type":"string"}},"required":["end_status","end_time","ends_at","start_time","starts_at"],"type":"object"},"maxItems":100,"type":"array"},"intervals_page":{"minimum":1,"type":"integer"},"intervals_per_page":{"maximum":100,"minimum":1,"type":"integer"},"intervals_total":{"minimum":0,"type":"integer"}},"required":["date","intervals","intervals_page","intervals_per_page","intervals_total"],"type":"object"},"maxItems":31,"type":"array"},"room_id":{"format":"uuid","type":"string"},"setup_id":{"format":"uuid","nullable":true,"type":"string"}},"required":["days","room_id","setup_id"],"type":"object"},"maxItems":100,"type":"array"},"kind":{"enum":["windows","starts"],"type":"string"},"page":{"minimum":1,"type":"integer"},"per_page":{"maximum":100,"minimum":1,"type":"integer"},"timezone":{"type":"string"},"total":{"minimum":0,"type":"integer"},"unverified_dates":{"items":{"format":"date","type":"string"},"maxItems":31,"type":"array"}},"required":["calendar_status","checked_at","date_from","date_to","duration_basis","duration_minutes","entries","kind","page","per_page","timezone","total","unverified_dates"],"type":"object"},"BundlePlanPrivateOfferRequest":{"additionalProperties":false,"properties":{"delivery":{"enum":["payment_link","grant"],"type":"string"},"plan_attrs":{"$ref":"#/components/schemas/BundlePlanUpdateRequest"},"target_user_id":{"format":"uuid","type":"string"},"validity":{"additionalProperties":false,"properties":{"unit":{"enum":["minutes","hours","days"],"type":"string"},"value":{"type":"integer"}},"required":["value","unit"],"type":"object"}},"required":["plan_attrs","target_user_id","delivery"],"title":"BundlePlanPrivateOfferRequest","type":"object"},"ExternalPayable":{"additionalProperties":false,"properties":{"action_required":{"additionalProperties":false,"nullable":true,"properties":{"amount":{"nullable":true,"type":"string"},"currency":{"nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"kind":{"type":"string"},"status":{"type":"string"}},"required":["id","kind","status"],"type":"object"},"amount_due":{"type":"string"},"booking_id":{"format":"uuid","nullable":true,"type":"string"},"booking_status":{"nullable":true,"type":"string"},"collected_amount":{"type":"string"},"coverage":{"type":"string"},"currency":{"type":"string"},"fulfillment_status":{"type":"string"},"id":{"format":"uuid","type":"string"},"invoice":{"allOf":[{"$ref":"#/components/schemas/InvoiceOutcome"}],"nullable":true},"notifications":{"allOf":[{"$ref":"#/components/schemas/NotificationProcessing"}],"nullable":true},"payment_id":{"format":"uuid","type":"string"},"payment_status":{"type":"string"},"refunded_amount":{"type":"string"},"required_action_amount":{"nullable":true,"type":"string"},"required_action_count":{"minimum":0,"type":"integer"}},"required":["id","payment_id","currency","amount_due","collected_amount","refunded_amount","coverage","payment_status","fulfillment_status"],"type":"object"},"AddonCreateRequest":{"additionalProperties":false,"properties":{"base_price":{"description":"Configured decimal amount in studio currency; domain validates precision and rules","pattern":"^[0-9]+(?:\\.[0-9]+)?$","type":"string"},"description":{"nullable":true,"type":"string"},"images":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"includes_file_transfer":{"type":"boolean"},"max_quantity":{"nullable":true,"type":"integer"},"metadata":{"additionalProperties":true,"type":"object"},"min_quantity":{"nullable":true,"type":"integer"},"name":{"type":"string"},"price_unit":{"type":"string"},"type":{"enum":["standard","standard_with_file_transfer","file_transfer"],"type":"string"},"visible_on_booking":{"type":"boolean"}},"required":["name","base_price"],"title":"AddonCreateRequest","type":"object"},"SubscriptionPlanAuthoring":{"additionalProperties":false,"properties":{"addons":{"additionalProperties":false,"properties":{"entries":{"items":{"additionalProperties":false,"properties":{"addon_id":{"format":"uuid","type":"string"},"billing_scope":{"type":"string"},"id":{"format":"uuid","type":"string"},"quantity":{"type":"integer"}},"required":["addon_id","quantity","billing_scope"],"type":"object"},"type":"array"},"page":{"type":"integer"},"per_page":{"type":"integer"},"total":{"type":"integer"}},"required":["entries","page","per_page","total"],"type":"object"},"cancellation_fee_amount":{"nullable":true,"type":"string"},"cancellation_policy":{"nullable":true,"type":"string"},"card_color":{"nullable":true,"type":"string"},"custom":{"type":"boolean"},"description":{"nullable":true,"type":"string"},"duration_minutes":{"type":"integer"},"id":{"format":"uuid","type":"string"},"images":{"additionalProperties":true,"type":"object"},"is_active":{"type":"boolean"},"is_special_offer":{"type":"boolean"},"metadata":{"additionalProperties":true,"type":"object"},"name":{"type":"string"},"offer_expires_at":{"format":"date-time","nullable":true,"type":"string"},"options":{"additionalProperties":false,"properties":{"entries":{"items":{"additionalProperties":false,"properties":{"discount_type":{"type":"string"},"discount_value":{"type":"string"},"id":{"format":"uuid","type":"string"},"period_months":{"type":"integer"},"price":{"type":"string"},"session_count":{"type":"integer"},"show_on_home":{"type":"boolean"},"sort_order":{"type":"integer"}},"required":["id","session_count","price"],"type":"object"},"type":"array"},"page":{"type":"integer"},"per_page":{"type":"integer"},"total":{"type":"integer"}},"required":["entries","page","per_page","total"],"type":"object"},"rollover_days":{"type":"integer"},"rollover_unlimited":{"type":"boolean"},"service_id":{"format":"uuid","nullable":true,"type":"string"},"show_in_top_bar":{"type":"boolean"},"special_offer_badge":{"nullable":true,"type":"string"},"special_offer_card_title":{"nullable":true,"type":"string"},"special_offer_images":{"additionalProperties":true,"type":"object"},"special_offer_text":{"nullable":true,"type":"string"},"target_user_id":{"format":"uuid","nullable":true,"type":"string"},"version_id":{"format":"uuid","type":"string"},"version_number":{"type":"integer"}},"required":["id","version_id","version_number","is_active","name","options","addons"],"title":"SubscriptionPlanAuthoring","type":"object"},"SubscriptionCancellationInput":{"additionalProperties":false,"properties":{},"type":"object"},"ExternalPaymentReport":{"additionalProperties":false,"properties":{"acceptance":{"additionalProperties":false,"properties":{"action":{"type":"string"},"booking_id":{"format":"uuid","nullable":true,"type":"string"},"client_id":{"format":"uuid","nullable":true,"type":"string"},"http_status":{"type":"integer"},"payment_id":{"format":"uuid","nullable":true,"type":"string"},"reason_code":{"nullable":true,"type":"string"}},"required":["action","http_status"],"type":"object"},"action_required":{"additionalProperties":false,"nullable":true,"properties":{"amount":{"nullable":true,"type":"string"},"currency":{"nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"kind":{"type":"string"},"status":{"type":"string"}},"required":["id","kind","status"],"type":"object"},"amount":{"nullable":true,"type":"string"},"amount_due":{"nullable":true,"type":"string"},"application_status":{"enum":["applied","underfunded","action_required","requires_reconciliation"],"type":"string"},"booking_id":{"format":"uuid","nullable":true,"type":"string"},"booking_status":{"nullable":true,"type":"string"},"collected_amount":{"type":"string"},"collection_id":{"format":"uuid","type":"string"},"coverage":{"enum":["underfunded","covered","unresolved"],"type":"string"},"currency":{"nullable":true,"type":"string"},"fulfillment_status":{"nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"invoice":{"allOf":[{"$ref":"#/components/schemas/InvoiceOutcome"}],"nullable":true},"notifications":{"allOf":[{"$ref":"#/components/schemas/NotificationProcessing"}],"nullable":true},"payment_id":{"format":"uuid","nullable":true,"type":"string"},"payment_status":{"nullable":true,"type":"string"},"refunded_amount":{"type":"string"},"required_action_amount":{"nullable":true,"type":"string"},"required_action_count":{"minimum":0,"type":"integer"}},"required":["id","collection_id","acceptance","application_status","collected_amount","refunded_amount","coverage"],"type":"object"},"BundleQuoteSelection":{"additionalProperties":false,"properties":{"bundle_plan_id":{"format":"uuid","type":"string"},"bundle_plan_tier_id":{"format":"uuid","type":"string"},"bundle_plan_version_id":{"format":"uuid","type":"string"},"currency":{"type":"string"},"description":{"nullable":true,"type":"string"},"duration_minutes":{"minimum":1,"type":"integer"},"gross":{"pattern":"^-?[0-9]+(\\.[0-9]+)?$","type":"string"},"name":{"type":"string"},"net":{"pattern":"^-?[0-9]+(\\.[0-9]+)?$","type":"string"},"offer_expires_at":{"format":"date-time","nullable":true,"type":"string"},"offer_kind":{"enum":["public","custom"],"type":"string"},"price":{"pattern":"^-?[0-9]+(\\.[0-9]+)?$","type":"string"},"price_basis":{"enum":["catalog_rate"],"type":"string"},"requested_tier_id":{"format":"uuid","type":"string"},"resolution":{"enum":["current","translated"],"type":"string"},"service":{"additionalProperties":false,"nullable":true,"properties":{"id":{"format":"uuid","type":"string"},"name":{"type":"string"}},"required":["id","name"],"type":"object"},"session_count":{"minimum":1,"type":"integer"},"tax":{"pattern":"^-?[0-9]+(\\.[0-9]+)?$","type":"string"},"tax_mode":{"enum":["including_tax","excluding_tax"],"type":"string"},"tax_rate":{"nullable":true,"pattern":"^-?[0-9]+(\\.[0-9]+)?$","type":"string"},"validity_days":{"minimum":1,"nullable":true,"type":"integer"}},"required":["bundle_plan_id","bundle_plan_tier_id","bundle_plan_version_id","currency","description","duration_minutes","gross","name","net","offer_expires_at","offer_kind","price","price_basis","requested_tier_id","resolution","service","session_count","tax","tax_mode","tax_rate","validity_days"],"type":"object"},"PackageQuoteInput":{"additionalProperties":false,"properties":{"date":{"format":"date","type":"string"},"duration_minutes":{"minimum":1,"type":"integer"},"member_package_id":{"format":"uuid","type":"string"},"recording_seats":{"minimum":1,"type":"integer"},"selected_one_off_addon_ids":{"items":{"format":"uuid","type":"string"},"type":"array"},"setup_id":{"format":"uuid","type":"string"},"start_time":{"pattern":"^\\d{2}:\\d{2}(:\\d{2})?$","type":"string"}},"required":["date","member_package_id","setup_id","start_time"],"type":"object"},"AddonAuthoring":{"additionalProperties":false,"properties":{"base_price":{"description":"Configured decimal amount in studio currency; domain validates precision and rules","pattern":"^[0-9]+(?:\\.[0-9]+)?$","type":"string"},"configured_prices":{"$ref":"#/components/schemas/ConfiguredPrices"},"description":{"nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"images":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"includes_file_transfer":{"type":"boolean"},"is_active":{"type":"boolean"},"max_quantity":{"nullable":true,"type":"integer"},"metadata":{"additionalProperties":true,"type":"object"},"min_quantity":{"nullable":true,"type":"integer"},"name":{"type":"string"},"price":{"$ref":"#/components/schemas/ConfiguredRate"},"price_unit":{"type":"string"},"type":{"enum":["standard","standard_with_file_transfer","file_transfer"],"type":"string"},"version_id":{"format":"uuid","type":"string"},"version_number":{"type":"integer"},"visible_on_booking":{"type":"boolean"}},"required":["id","version_id","version_number","is_active","name","images"],"title":"AddonAuthoring","type":"object"},"ServiceAuthoring":{"additionalProperties":false,"properties":{"addon_ids":{"items":{"format":"uuid","type":"string"},"type":"array"},"available_for_bundles":{"type":"boolean"},"available_for_subscriptions":{"type":"boolean"},"base_price":{"description":"Configured decimal amount in studio currency; domain validates precision and rules","pattern":"^[0-9]+(?:\\.[0-9]+)?$","type":"string"},"configured_prices":{"$ref":"#/components/schemas/ConfiguredPrices"},"day_rates":{"items":{"additionalProperties":false,"properties":{"id":{"format":"uuid","type":"string"},"min_duration_minutes":{"type":"integer"},"name":{"type":"string"},"price":{"$ref":"#/components/schemas/ConfiguredRate"}},"required":["id","name","min_duration_minutes","price"],"type":"object"},"type":"array"},"description":{"nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"images":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"is_active":{"type":"boolean"},"metadata":{"additionalProperties":true,"type":"object"},"name":{"type":"string"},"price":{"$ref":"#/components/schemas/ConfiguredRate"},"price_unit":{"type":"string"},"promotion":{"additionalProperties":true,"type":"object"},"short_description":{"nullable":true,"type":"string"},"show_day_rates_on_card":{"type":"boolean"},"version_id":{"format":"uuid","type":"string"},"version_number":{"type":"integer"},"visible_on_booking":{"type":"boolean"}},"required":["id","version_id","version_number","is_active","name","images"],"title":"ServiceAuthoring","type":"object"},"ExternalPayableOutcomeInput":{"additionalProperties":false,"properties":{"outcome":{"enum":["failed","void"],"type":"string"},"outcome_id":{"format":"uuid","type":"string"}},"required":["outcome_id","outcome"],"type":"object"},"BundlePurchaseRequest":{"additionalProperties":false,"properties":{"bundle_plan_id":{"format":"uuid","type":"string"},"consents":{"additionalProperties":false,"properties":{"refund_policy":{"type":"boolean"},"short_terms":{"type":"boolean"},"terms":{"type":"boolean"}},"type":"object"},"credit_choice":{"enum":["auto","use","none"],"type":"string"},"email":{"format":"email","type":"string"},"invoice_profile":{"additionalProperties":false,"properties":{"billing_fields":{"additionalProperties":{"type":"string"},"type":"object"},"type":{"enum":["individual","business"],"type":"string"}},"type":"object"},"promo_code":{"type":"string"},"tier_id":{"format":"uuid","type":"string"}},"required":["email"],"title":"BundlePurchaseRequest","type":"object"},"BundleQuoteRequest":{"additionalProperties":false,"properties":{"bundle_plan_id":{"format":"uuid","type":"string"},"client_id":{"format":"uuid","type":"string"},"consents":{"additionalProperties":false,"properties":{"refund_policy":{"type":"boolean"},"short_terms":{"type":"boolean"},"terms":{"type":"boolean"}},"type":"object"},"credit_choice":{"enum":["auto","use","none"],"type":"string"},"invoice_profile":{"additionalProperties":false,"properties":{"billing_fields":{"additionalProperties":{"type":"string"},"type":"object"},"type":{"enum":["individual","business"],"type":"string"}},"type":"object"},"page":{"minimum":1,"type":"integer"},"per_page":{"maximum":100,"minimum":1,"type":"integer"},"promo_code":{"type":"string"},"tier_id":{"format":"uuid","type":"string"}},"title":"BundleQuoteRequest","type":"object"},"SubscriptionPlanOffer":{"additionalProperties":false,"properties":{"addons":{"items":{"additionalProperties":false,"properties":{"billing_scope":{"type":"string"},"id":{"format":"uuid","type":"string"},"name":{"type":"string"},"quantity":{"type":"integer"}},"required":["id","name","quantity","billing_scope"],"type":"object"},"type":"array"},"addons_pagination":{"additionalProperties":false,"properties":{"page":{"type":"integer"},"per_page":{"type":"integer"},"total":{"type":"integer"}},"required":["page","per_page","total"],"type":"object"},"currency":{"type":"string"},"description":{"nullable":true,"type":"string"},"duration_minutes":{"type":"integer"},"id":{"format":"uuid","type":"string"},"images":{"additionalProperties":true,"type":"object"},"included_items":{"items":{"type":"string"},"type":"array"},"included_items_pagination":{"additionalProperties":false,"properties":{"page":{"type":"integer"},"per_page":{"type":"integer"},"total":{"type":"integer"}},"required":["page","per_page","total"],"type":"object"},"name":{"type":"string"},"options":{"items":{"additionalProperties":false,"properties":{"amount":{"type":"string"},"basis":{"type":"string"},"currency":{"type":"string"},"id":{"format":"uuid","type":"string"},"period_months":{"type":"integer"},"sessions_per_month":{"type":"integer"},"tax_mode":{"type":"string"},"total_sessions":{"type":"integer"},"unit":{"type":"string"}},"required":["id","amount","currency","unit","tax_mode","basis"],"type":"object"},"type":"array"},"options_pagination":{"additionalProperties":false,"properties":{"page":{"type":"integer"},"per_page":{"type":"integer"},"total":{"type":"integer"}},"required":["page","per_page","total"],"type":"object"},"service":{"additionalProperties":false,"nullable":true,"properties":{"id":{"format":"uuid","type":"string"},"name":{"type":"string"}},"required":["id","name"],"type":"object"},"terms":{"additionalProperties":false,"properties":{"cancellation_fee_amount":{"nullable":true,"type":"string"},"cancellation_policy":{"nullable":true,"type":"string"},"rollover_days":{"type":"integer"},"rollover_unlimited":{"type":"boolean"}},"required":["rollover_days","rollover_unlimited","cancellation_policy","cancellation_fee_amount"],"type":"object"},"version_id":{"format":"uuid","type":"string"}},"required":["id","version_id","name","options","options_pagination","addons","addons_pagination","included_items","included_items_pagination","images"],"title":"SubscriptionPlanOffer","type":"object"},"TourPriceQuote":{"additionalProperties":false,"properties":{"addons_total":{"type":"string"},"currency":{"type":"string"},"entered":{"type":"string"},"line_items":{"items":{"additionalProperties":false,"properties":{"addon_version_id":{"format":"uuid","type":"string"},"base_price":{"type":"string"},"line_total":{"type":"string"},"name":{"type":"string"},"quantity":{"minimum":1,"type":"integer"},"unit_price":{"type":"string"}},"required":["addon_version_id","name","quantity","unit_price","base_price","line_total"],"type":"object"},"type":"array"},"subtotal":{"type":"string"},"tax_amount":{"type":"string"},"tax_rate":{"type":"string"},"total":{"type":"string"},"tour_line":{"type":"string"}},"required":["addons_total","currency","entered","line_items","subtotal","tax_amount","tax_rate","total","tour_line"],"type":"object"},"ServiceCreateRequest":{"additionalProperties":false,"properties":{"addon_ids":{"items":{"format":"uuid","type":"string"},"type":"array"},"available_for_bundles":{"type":"boolean"},"available_for_subscriptions":{"type":"boolean"},"base_price":{"description":"Configured decimal amount in studio currency; domain validates precision and rules","pattern":"^[0-9]+(?:\\.[0-9]+)?$","type":"string"},"day_rates":{"items":{"additionalProperties":false,"properties":{"min_duration_minutes":{"type":"integer"},"name":{"type":"string"},"price":{"description":"Configured decimal amount in studio currency; domain validates precision and rules","pattern":"^[0-9]+(?:\\.[0-9]+)?$","type":"string"}},"required":["name","min_duration_minutes","price"],"type":"object"},"type":"array"},"description":{"nullable":true,"type":"string"},"images":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"metadata":{"additionalProperties":true,"type":"object"},"name":{"type":"string"},"price_unit":{"type":"string"},"promotion":{"additionalProperties":true,"type":"object"},"short_description":{"nullable":true,"type":"string"},"show_day_rates_on_card":{"type":"boolean"},"visible_on_booking":{"type":"boolean"}},"required":["name","base_price"],"title":"ServiceCreateRequest","type":"object"}},"securitySchemes":{"ApiKeyAuth":{"bearerFormat":"opaque API key","description":"Send Authorization: Bearer pdyx_<secret>. The opaque API key resolves its own studio; credentials in query parameters or request bodies are not accepted.","scheme":"bearer","type":"http"}}},"info":{"description":"Build your studio booking experience from independently usable resources. Your API key resolves the studio and its current permissions. Quotes are advisory; mutations require a UUID Idempotency-Key. Fetch accepted resources for current state.","title":"Podyx Studio API","version":"2.0.0"},"openapi":"3.0.0","paths":{"/api/v2/external-refunds/{id}/outcomes":{"post":{"callbacks":{},"deprecated":false,"description":"Acceptance is an immutable delivery receipt. A refund request reserves a real outstanding obligation; only a studio report of actual success counts returned money. Studio refund UUIDs are independent from HTTP keys. Replacements explicitly name a failed or reversed attempt in the identical frozen scope and share its obligation. GET exposes current money and cancellation state. Recovery requires current key, tenant and owning-resource authority even after new commercial entry is disabled. Provider IDs are never accepted or manufactured.","operationId":"v2ReportExternalRefund","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExternalRefundOutcomeInput"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/ExternalRecoveryAcceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance or current actual recovery state"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Report external refund","tags":["Studio external recovery"]}},"/api/v2/purchases/{id}/payment/tokens":{"post":{"callbacks":{},"deprecated":false,"description":"Email resolves the studio-owned Client and never authenticates the visitor. New purchase entry requires headless_api plus the family purchase permission, clients:read and payments:collect; clients:create is conditional on creating a Client association. GET requires payments:read plus the purchased family's read permission. Recovery requires payments:collect, clients:read and that family's read permission under current studio key/account/public_api authority; accepted recovery remains available with headless new entry disabled. Native provider, credit, promo, approval, private-offer and consent policies apply. Acceptance atomically records a frozen purchase obligation, immutable receipt and required work; no provider IO runs before commit. Instructions carry public SDK capabilities, never proof of settlement. Fetch current state for money, approval and rights separately. Unknown outcomes resume the original frozen tender identity; outcomes beyond the safe replay window require reconciliation and never create another recurring subscription. Cancellation retires unpaid capability before completing; money in flight remains undetermined. No external settlement reports, renewal, aftercare or raw status writes are accepted.","operationId":"v2SubmitPurchaseToken","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SquareTokenRequest"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/Acceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable command acceptance; fetch purchase current state"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Native payment or offer requires reconciliation"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Submit a private Square token for the owned purchase","tags":["Studio native purchases"]}},"/api/v2/subscriptions/{id}/cycles":{"post":{"callbacks":{},"deprecated":false,"description":"The studio key owns the tenant. Cycle UUID, financial collection UUID, delivery Idempotency-Key and monthly grant period are distinct. The predecessor must be the subscription's committed local cycle; dates and recurring amount come from the purchased snapshot. Paid outcomes use actual aggregate external coverage and shared fulfillment. Partial coverage grants nothing; approval remains separate. Failed renewal marks overdue; recovery extends that same term once. Cancellation/nonrenewal and terminal access remain authoritative: collected money stays recorded with an action instead of resurrecting rights. POST requires subscriptions:report_external_cycle plus payments:report_external under current account/key authority; GET requires subscriptions:read plus payments:read. New cycles require headless entry and external writer readiness; accepted cycle recovery survives commercial disable. Native provider subscription IDs cannot be reported here.","operationId":"v2ReportExternalSubscriptionCycle","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExternalSubscriptionCycleInput"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/ExternalSubscriptionCycleAcceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable cycle outcome acceptance; use GET for current state"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Report failed or paid outcome for a local subscription term","tags":["Studio external subscriptions"]}},"/api/v2/addon-purchases/quotes":{"post":{"callbacks":{},"deprecated":false,"description":"Read-only POST: incomplete selections return status=incomplete and missing_inputs, with current CMS-configured forms, guest limit, recording seats, invoice fields, rail-specific displayed consent documents and paginated file-transfer choices. No client, booking, hold, payment or receipt is created. Prices, tax, promo eligibility and credits are resolved by Podyx; amounts or provider IDs in input are refused. A fingerprint identifies advisory facts, never a price lock or permission to charge. Complete means required selections, details, invoice fields and consent acceptance are supplied; later commands must revalidate. client_id means a currently owned studio Client, requires clients:read in addition to the family read permission, and is never visitor login. Omit it for anonymous preview; email is not accepted here. Existing public_api/account/current-key authority remains required, including after reads. Disabling headless new entry preserves authorized quote reads. Booking sessions are explicit and multi-session; Studio Tour has its own published quote and booking operations. Subscription quotes additionally accept payment_source=native|external, default native: external previews studio collection independently of native provider cadence restrictions; actual studio approval still applies and no collection is reported. Other quote families do not accept payment_source. Bundle/subscription never ask for refund policy; tour consent remains terms only. page/per_page page file-transfer choices only, using the existing 1..100 bounds.","operationId":"v2AddonQuote","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddonQuoteRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/CustomerQuote"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Advisory complete or incomplete quote; no hold"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"additionalProperties":true,"properties":{"code":{"description":"Stable machine-readable error code; clients must tolerate new codes.","type":"string"},"errors":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"description":"Field validation messages when code is validation_failed.","type":"object"},"feature":{"description":"Required studio entitlement when code is feature_disabled; clients must tolerate new features.","type":"string"},"permissions":{"description":"Required permissions when code is permission_required.","items":{"$ref":"#/components/schemas/ApiPermission"},"type":"array"},"request_id":{"description":"Request correlation identifier.","type":"string"},"setup_choices":{"description":"Eligible destination setups when code is setup_selection_required.","items":{"additionalProperties":false,"properties":{"id":{"format":"uuid","type":"string"},"name":{"nullable":true,"type":"string"},"room_name":{"nullable":true,"type":"string"}},"required":["id","name","room_name"],"type":"object"},"type":"array"},"status":{"description":"HTTP response status.","type":"integer"},"title":{"type":"string"}},"required":["status","code","title","request_id"],"title":"ApiErrorResponse","type":"object"}}},"description":"Current selection is unavailable or no longer offered"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Preview current customer addon selections and checkout requirements","tags":["Studio customer quotes"]}},"/api/v2/member-bundles/{id}/approvals":{"post":{"callbacks":{},"deprecated":false,"description":"Package kind is fixed by the route. Purchased snapshots and current ledger allowance determine rights and effective session lengths. Quotes are advisory. Redemption atomically creates all sessions and required delivery intents, or writes nothing. Paid extras use the existing separate session add-on purchase flow. Current authority is checked on replay. Cancellation uses the existing subscription cancellation routes. Native provider work is deferred; management GET exposes pending, ready or failed delivery. A ready billing portal URL is disclosed only to a key with current subscriptions:manage authority; read-only keys retain state and capability visibility without the live instruction. Plan changes, pause and resume are unsupported. Paid external decline retains an actionable refund obligation without executing a refund.","operationId":"v2PackagesApproveBundle","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyInput"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/PackageAcceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance; fetch current state separately"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Approve bundle","tags":["Studio package rights and management"]}},"/api/v2/subscription-plans/private-offers":{"post":{"callbacks":{},"deprecated":false,"description":"Packages owns JSON normalization, scoped references, computed prices, version snapshots and lifecycle. Public authoring permits repairable drafts and never grants. Omitted options/addons preserve; [] clears. Authoring scope=private/all also requires clients:read. view=offers uses current public purchasability and excludes private plans; images and terms are available for display. options_page/options_per_page and addons_page/addons_per_page independently bound nested collections. Private commands require clients:read. Direct grants separately require grant. Subscription sales require resend_payment_link; bundle sales use create/update authority. Explicit bundle payment-link saves use the shared default validity window when omitted, including private edits; resends preserve the stored deadline. Bundle grants remain open-ended; subscription private deadlines and targets are immutable. Archive deactivates without changing prior purchases. UUID Idempotency-Key required; replay checks current authority and returns immutable acceptance only. GET reads current state.","operationId":"v2CreatePrivateOfferSubscriptionPlan","parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionPlanPrivateOfferRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandResponse"}}},"description":"Immutable resource acceptance"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Current offer state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"CreatePrivateOffer subscription-plans","tags":["Studio package offers"]}},"/api/v2/subscriptions/{id}/management-options":{"get":{"callbacks":{},"deprecated":false,"description":"Package kind is fixed by the route. Purchased snapshots and current ledger allowance determine rights and effective session lengths. Quotes are advisory. Redemption atomically creates all sessions and required delivery intents, or writes nothing. Paid extras use the existing separate session add-on purchase flow. Current authority is checked on replay. Cancellation uses the existing subscription cancellation routes. Native provider work is deferred; management GET exposes pending, ready or failed delivery. A ready billing portal URL is disclosed only to a key with current subscriptions:manage authority; read-only keys retain state and capability visibility without the live instruction. Plan changes, pause and resume are unsupported. Paid external decline retains an actionable refund obligation without executing a refund.","operationId":"v2PackagesSubscriptionManagement","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/SubscriptionManagement"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Current purchased rights or advisory quote"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Subscription management","tags":["Studio package rights and management"]}},"/api/v2/addon-purchases/{id}/payment/confirmations":{"post":{"callbacks":{},"deprecated":false,"description":"Current key authority and stored tenant ownership apply. Customer policies differ from explicit staff actions. Acceptance freezes the target and selection; GET states actual payment, approval and fulfillment. Provider instructions are fetched separately after preparation; external money is reported by the studio.","operationId":"v2AftercareConfirmAddon","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyInput"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/AftercareAcceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Confirm addon","tags":["Studio booking aftercare"]}},"/api/v2/external-subscription-purchases":{"post":{"callbacks":{},"deprecated":false,"description":"Email resolves the studio-owned Client and never authenticates a visitor. External purchase requires family:purchase, payments:report_external and clients:read (clients:create when associating a new Client). The command commits one validated frozen purchase and a pending external/off_platform payable without provider IO or an invented provider subscription ID. Report actual collections through external-payment-reports; partial coverage grants nothing. Approval, fulfillment and collection remain separate. GET purchases exposes the actual pending member and local initial subscription_cycle_id. All new entry requires public_api/headless_api plus deployment external-money readiness; immutable replay and accepted recovery refresh current authority. Native provider configuration is unchanged.","operationId":"v2PurchaseExternalSubscription","parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionPurchaseRequest"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/Acceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable command acceptance; fetch purchase current state"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Native payment or offer requires reconciliation"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Accept an external initial subscription with a local term cycle","tags":["Studio native purchases"]}},"/api/v2/subscription-plans/{id}/archival":{"delete":{"callbacks":{},"deprecated":false,"description":"Packages owns JSON normalization, scoped references, computed prices, version snapshots and lifecycle. Public authoring permits repairable drafts and never grants. Omitted options/addons preserve; [] clears. Authoring scope=private/all also requires clients:read. view=offers uses current public purchasability and excludes private plans; images and terms are available for display. options_page/options_per_page and addons_page/addons_per_page independently bound nested collections. Private commands require clients:read. Direct grants separately require grant. Subscription sales require resend_payment_link; bundle sales use create/update authority. Explicit bundle payment-link saves use the shared default validity window when omitted, including private edits; resends preserve the stored deadline. Bundle grants remain open-ended; subscription private deadlines and targets are immutable. Archive deactivates without changing prior purchases. UUID Idempotency-Key required; replay checks current authority and returns immutable acceptance only. GET reads current state.","operationId":"v2RestoreSubscriptionPlan","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{},"type":"object"}}},"required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandResponse"}}},"description":"Immutable resource acceptance"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Current offer state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Restore subscription-plans","tags":["Studio package offers"]},"put":{"callbacks":{},"deprecated":false,"description":"Packages owns JSON normalization, scoped references, computed prices, version snapshots and lifecycle. Public authoring permits repairable drafts and never grants. Omitted options/addons preserve; [] clears. Authoring scope=private/all also requires clients:read. view=offers uses current public purchasability and excludes private plans; images and terms are available for display. options_page/options_per_page and addons_page/addons_per_page independently bound nested collections. Private commands require clients:read. Direct grants separately require grant. Subscription sales require resend_payment_link; bundle sales use create/update authority. Explicit bundle payment-link saves use the shared default validity window when omitted, including private edits; resends preserve the stored deadline. Bundle grants remain open-ended; subscription private deadlines and targets are immutable. Archive deactivates without changing prior purchases. UUID Idempotency-Key required; replay checks current authority and returns immutable acceptance only. GET reads current state.","operationId":"v2ArchiveSubscriptionPlan","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{},"type":"object"}}},"required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandResponse"}}},"description":"Immutable resource acceptance"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Current offer state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Archive subscription-plans","tags":["Studio package offers"]}},"/api/v2/addon-purchases/{id}/approvals":{"post":{"callbacks":{},"deprecated":false,"description":"Current key authority and stored tenant ownership apply. Customer policies differ from explicit staff actions. Acceptance freezes the target and selection; GET states actual payment, approval and fulfillment. Provider instructions are fetched separately after preparation; external money is reported by the studio.","operationId":"v2AftercareApproveAddon","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyInput"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/AftercareAcceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Approve addon","tags":["Studio booking aftercare"]}},"/api/v2/addon-purchases/{id}/declines":{"post":{"callbacks":{},"deprecated":false,"description":"Current key authority and stored tenant ownership apply. Customer policies differ from explicit staff actions. Acceptance freezes the target and selection; GET states actual payment, approval and fulfillment. Provider instructions are fetched separately after preparation; external money is reported by the studio.","operationId":"v2AftercareDeclineAddon","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyInput"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/AftercareAcceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Decline addon","tags":["Studio booking aftercare"]}},"/api/v2/subscription-redemptions/{id}":{"get":{"callbacks":{},"deprecated":false,"description":"Package kind is fixed by the route. Purchased snapshots and current ledger allowance determine rights and effective session lengths. Quotes are advisory. Redemption atomically creates all sessions and required delivery intents, or writes nothing. Paid extras use the existing separate session add-on purchase flow. Current authority is checked on replay. Cancellation uses the existing subscription cancellation routes. Native provider work is deferred; management GET exposes pending, ready or failed delivery. A ready billing portal URL is disclosed only to a key with current subscriptions:manage authority; read-only keys retain state and capability visibility without the live instruction. Plan changes, pause and resume are unsupported. Paid external decline retains an actionable refund obligation without executing a refund.","operationId":"v2PackagesSubscriptionRedemption","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/PackageRedemption"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Current purchased rights or advisory quote"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Subscription redemption","tags":["Studio package rights and management"]}},"/api/v2/rooms":{"get":{"callbacks":{},"deprecated":false,"description":"Catalog owns JSON normalization, versioning, links, configured prices and lifecycle. Authoring includes drafts; view=offers reuses customer buyability. Configured prices are independently paginated with prices_page/prices_per_page and refer to current service versions. Amounts are configured catalog rates, not a dated customer quote. Omitted links/override sections preserve; [] clears the submitted collection. Archive deactivates; restore reactivates and enforces existing room allowances. Mutations require a UUID Idempotency-Key and current primary/linked-resource authority, including receipt replay.","operationId":"v2ListRoom","parameters":[{"in":"query","name":"page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"per_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"prices_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"prices_per_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"view","schema":{"default":"authoring","enum":["authoring","offers"],"type":"string"}},{"in":"query","name":"include_inactive","schema":{"type":"boolean"}},{"in":"query","name":"room_id","schema":{"format":"uuid","type":"string"}},{"in":"query","name":"setup_id","schema":{"format":"uuid","type":"string"}},{"in":"query","name":"service_id","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"additionalProperties":false,"properties":{"configured_prices":{"$ref":"#/components/schemas/ConfiguredPrices"},"entries":{"items":{"anyOf":[{"$ref":"#/components/schemas/RoomAuthoring"},{"$ref":"#/components/schemas/RoomOffer"}]},"type":"array"},"page":{"type":"integer"},"per_page":{"type":"integer"},"total":{"minimum":0,"type":"integer"}},"required":["entries","page","per_page","total","configured_prices"],"type":"object"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"SQL-paginated authoring or customer offers and configured price conditions"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"List catalog rooms","tags":["Studio catalog"]},"post":{"callbacks":{},"deprecated":false,"description":"Catalog owns JSON normalization, versioning, links, configured prices and lifecycle. Authoring includes drafts; view=offers reuses customer buyability. Configured prices are independently paginated with prices_page/prices_per_page and refer to current service versions. Amounts are configured catalog rates, not a dated customer quote. Omitted links/override sections preserve; [] clears the submitted collection. Archive deactivates; restore reactivates and enforces existing room allowances. Mutations require a UUID Idempotency-Key and current primary/linked-resource authority, including receipt replay.","operationId":"v2CreateRoom","parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoomCreateRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandResponse"}}},"description":"Immutable resource acceptance; GET for current version"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Create catalog rooms","tags":["Studio catalog"]}},"/api/v2/purchases/{id}":{"get":{"callbacks":{},"deprecated":false,"description":"Email resolves the studio-owned Client and never authenticates the visitor. New purchase entry requires headless_api plus the family purchase permission, clients:read and payments:collect; clients:create is conditional on creating a Client association. GET requires payments:read plus the purchased family's read permission. Recovery requires payments:collect, clients:read and that family's read permission under current studio key/account/public_api authority; accepted recovery remains available with headless new entry disabled. Native provider, credit, promo, approval, private-offer and consent policies apply. Acceptance atomically records a frozen purchase obligation, immutable receipt and required work; no provider IO runs before commit. Instructions carry public SDK capabilities, never proof of settlement. Fetch current state for money, approval and rights separately. Unknown outcomes resume the original frozen tender identity; outcomes beyond the safe replay window require reconciliation and never create another recurring subscription. Cancellation retires unpaid capability before completing; money in flight remains undetermined. No external settlement reports, renewal, aftercare or raw status writes are accepted.","operationId":"v2GetPurchase","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/Purchase"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Current authorized native purchase"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Native payment or offer requires reconciliation"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Read current purchase instructions, settlement, approval and fulfillment","tags":["Studio native purchases"]}},"/api/v2/clients/{id}/activation-requests":{"post":{"callbacks":{},"deprecated":false,"operationId":"v2RequestClientActivation","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivationRequest"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandResponse"}}},"description":"Immutable acceptance; fetch client for current account lifecycle"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Request explicit email-owner activation of an external client","tags":["Studio clients"]}},"/api/v2/external-bundle-purchases":{"post":{"callbacks":{},"deprecated":false,"description":"Email resolves the studio-owned Client and never authenticates a visitor. External purchase requires family:purchase, payments:report_external and clients:read (clients:create when associating a new Client). The command commits one validated frozen purchase and a pending external/off_platform payable without provider IO or an invented provider subscription ID. Report actual collections through external-payment-reports; partial coverage grants nothing. Approval, fulfillment and collection remain separate. GET purchases exposes the actual pending member and local initial subscription_cycle_id. All new entry requires public_api/headless_api plus deployment external-money readiness; immutable replay and accepted recovery refresh current authority. Native provider configuration is unchanged.","operationId":"v2PurchaseExternalBundle","parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BundlePurchaseRequest"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/Acceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable command acceptance; fetch purchase current state"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Native payment or offer requires reconciliation"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Accept a studio-collected external bundle purchase","tags":["Studio native purchases"]}},"/api/v2/subscription-plans":{"get":{"callbacks":{},"deprecated":false,"description":"Packages owns JSON normalization, scoped references, computed prices, version snapshots and lifecycle. Public authoring permits repairable drafts and never grants. Omitted options/addons preserve; [] clears. Authoring scope=private/all also requires clients:read. view=offers uses current public purchasability and excludes private plans; images and terms are available for display. options_page/options_per_page and addons_page/addons_per_page independently bound nested collections. Private commands require clients:read. Direct grants separately require grant. Subscription sales require resend_payment_link; bundle sales use create/update authority. Explicit bundle payment-link saves use the shared default validity window when omitted, including private edits; resends preserve the stored deadline. Bundle grants remain open-ended; subscription private deadlines and targets are immutable. Archive deactivates without changing prior purchases. UUID Idempotency-Key required; replay checks current authority and returns immutable acceptance only. GET reads current state.","operationId":"v2ListSubscriptionPlan","parameters":[{"in":"query","name":"page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"per_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"included_items_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"included_items_per_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"options_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"options_per_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"addons_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"addons_per_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"view","schema":{"default":"authoring","enum":["authoring","offers"],"type":"string"}},{"in":"query","name":"scope","schema":{"default":"public","enum":["public","private","all"],"type":"string"}},{"in":"query","name":"include_inactive","schema":{"type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"additionalProperties":false,"properties":{"entries":{"items":{"anyOf":[{"$ref":"#/components/schemas/SubscriptionPlanAuthoring"},{"$ref":"#/components/schemas/SubscriptionPlanOffer"}]},"type":"array"},"page":{"type":"integer"},"per_page":{"type":"integer"},"total":{"type":"integer"}},"required":["entries","page","per_page","total"],"type":"object"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Bounded authoring or consumer offer page"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Current offer state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"List subscription-plans","tags":["Studio package offers"]},"post":{"callbacks":{},"deprecated":false,"description":"Packages owns JSON normalization, scoped references, computed prices, version snapshots and lifecycle. Public authoring permits repairable drafts and never grants. Omitted options/addons preserve; [] clears. Authoring scope=private/all also requires clients:read. view=offers uses current public purchasability and excludes private plans; images and terms are available for display. options_page/options_per_page and addons_page/addons_per_page independently bound nested collections. Private commands require clients:read. Direct grants separately require grant. Subscription sales require resend_payment_link; bundle sales use create/update authority. Explicit bundle payment-link saves use the shared default validity window when omitted, including private edits; resends preserve the stored deadline. Bundle grants remain open-ended; subscription private deadlines and targets are immutable. Archive deactivates without changing prior purchases. UUID Idempotency-Key required; replay checks current authority and returns immutable acceptance only. GET reads current state.","operationId":"v2CreateSubscriptionPlan","parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionPlanCreateRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandResponse"}}},"description":"Immutable resource acceptance"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Current offer state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Create subscription-plans","tags":["Studio package offers"]}},"/api/v2/studio-tours/{tour_id}/bookings":{"post":{"callbacks":{},"deprecated":false,"description":"Email resolves a studio Client and never authenticates a visitor. Requires sessions:create and clients:read; clients:create only when a Client association must be created. payment_source defaults to native, which requires payments:collect; explicit native and omission share the same receipt input. External requires payments:report_external and current external-money readiness for new entry. A positive external total reserves an off-platform payable for later reporting through /external-payment-reports; no native provider configuration is needed. Zero totals confirm through the native no-payment flow and create no payment. Current tour geometry, availability, setup, questions, phone, guests, invoice and consent rules apply before acceptance; custom_form_answers contains question responses, and phone-required tours need a valid phone in the client's owned profile. Prices always come from current native Tour pricing, including selected addons. Caller prices, provider and paid flags are refused. Booking approval and payment settlement stay separate. New entry requires headless_api and studio_tour. Current key/account/public_api and source-specific permissions apply before receipt replay; replay precedes the new-entry readiness gate. Fetch the returned native checkout or external payable for current money, approval and fulfillment.","operationId":"v2CheckoutTour","parameters":[{"in":"path","name":"tour_id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TourBookingRequest"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/Acceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance; fetch the returned native checkout or external payable for current money, approval and fulfillment"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Accept a complete published Studio Tour booking by email","tags":["Studio native checkout"]}},"/api/v2/rooms/{id}/archival":{"delete":{"callbacks":{},"deprecated":false,"description":"Catalog owns JSON normalization, versioning, links, configured prices and lifecycle. Authoring includes drafts; view=offers reuses customer buyability. Configured prices are independently paginated with prices_page/prices_per_page and refer to current service versions. Amounts are configured catalog rates, not a dated customer quote. Omitted links/override sections preserve; [] clears the submitted collection. Archive deactivates; restore reactivates and enforces existing room allowances. Mutations require a UUID Idempotency-Key and current primary/linked-resource authority, including receipt replay.","operationId":"v2RestoreRoom","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{},"type":"object"}}},"required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandResponse"}}},"description":"Immutable resource acceptance; GET for current version"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Restore catalog rooms","tags":["Studio catalog"]},"put":{"callbacks":{},"deprecated":false,"description":"Catalog owns JSON normalization, versioning, links, configured prices and lifecycle. Authoring includes drafts; view=offers reuses customer buyability. Configured prices are independently paginated with prices_page/prices_per_page and refer to current service versions. Amounts are configured catalog rates, not a dated customer quote. Omitted links/override sections preserve; [] clears the submitted collection. Archive deactivates; restore reactivates and enforces existing room allowances. Mutations require a UUID Idempotency-Key and current primary/linked-resource authority, including receipt replay.","operationId":"v2ArchiveRoom","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{},"type":"object"}}},"required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandResponse"}}},"description":"Immutable resource acceptance; GET for current version"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Archive catalog rooms","tags":["Studio catalog"]}},"/api/v2/cancellations/{id}":{"get":{"callbacks":{},"deprecated":false,"description":"Acceptance is an immutable delivery receipt. A refund request reserves a real outstanding obligation; only a studio report of actual success counts returned money. Studio refund UUIDs are independent from HTTP keys. Replacements explicitly name a failed or reversed attempt in the identical frozen scope and share its obligation. GET exposes current money and cancellation state. Recovery requires current key, tenant and owning-resource authority even after new commercial entry is disabled. Provider IDs are never accepted or manufactured.","operationId":"v2GetCancellation","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/Cancellation"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance or current actual recovery state"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Get cancellation","tags":["Studio external recovery"]}},"/api/v2/bundle-plans/{id}/archival":{"delete":{"callbacks":{},"deprecated":false,"description":"Packages owns JSON normalization, scoped references, computed prices, version snapshots and lifecycle. Public authoring permits repairable drafts and never grants. Omitted options/addons preserve; [] clears. Authoring scope=private/all also requires clients:read. view=offers uses current public purchasability and excludes private plans; images and terms are available for display. options_page/options_per_page and addons_page/addons_per_page independently bound nested collections. Private commands require clients:read. Direct grants separately require grant. Subscription sales require resend_payment_link; bundle sales use create/update authority. Explicit bundle payment-link saves use the shared default validity window when omitted, including private edits; resends preserve the stored deadline. Bundle grants remain open-ended; subscription private deadlines and targets are immutable. Archive deactivates without changing prior purchases. UUID Idempotency-Key required; replay checks current authority and returns immutable acceptance only. GET reads current state.","operationId":"v2RestoreBundlePlan","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{},"type":"object"}}},"required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandResponse"}}},"description":"Immutable resource acceptance"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Current offer state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Restore bundle-plans","tags":["Studio package offers"]},"put":{"callbacks":{},"deprecated":false,"description":"Packages owns JSON normalization, scoped references, computed prices, version snapshots and lifecycle. Public authoring permits repairable drafts and never grants. Omitted options/addons preserve; [] clears. Authoring scope=private/all also requires clients:read. view=offers uses current public purchasability and excludes private plans; images and terms are available for display. options_page/options_per_page and addons_page/addons_per_page independently bound nested collections. Private commands require clients:read. Direct grants separately require grant. Subscription sales require resend_payment_link; bundle sales use create/update authority. Explicit bundle payment-link saves use the shared default validity window when omitted, including private edits; resends preserve the stored deadline. Bundle grants remain open-ended; subscription private deadlines and targets are immutable. Archive deactivates without changing prior purchases. UUID Idempotency-Key required; replay checks current authority and returns immutable acceptance only. GET reads current state.","operationId":"v2ArchiveBundlePlan","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{},"type":"object"}}},"required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandResponse"}}},"description":"Immutable resource acceptance"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Current offer state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Archive bundle-plans","tags":["Studio package offers"]}},"/api/v2/setups":{"get":{"callbacks":{},"deprecated":false,"description":"Catalog owns JSON normalization, versioning, links, configured prices and lifecycle. Authoring includes drafts; view=offers reuses customer buyability. Configured prices are independently paginated with prices_page/prices_per_page and refer to current service versions. Amounts are configured catalog rates, not a dated customer quote. Omitted links/override sections preserve; [] clears the submitted collection. Archive deactivates; restore reactivates and enforces existing room allowances. Mutations require a UUID Idempotency-Key and current primary/linked-resource authority, including receipt replay.","operationId":"v2ListSetup","parameters":[{"in":"query","name":"page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"per_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"prices_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"prices_per_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"view","schema":{"default":"authoring","enum":["authoring","offers"],"type":"string"}},{"in":"query","name":"include_inactive","schema":{"type":"boolean"}},{"in":"query","name":"room_id","schema":{"format":"uuid","type":"string"}},{"in":"query","name":"setup_id","schema":{"format":"uuid","type":"string"}},{"in":"query","name":"service_id","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"additionalProperties":false,"properties":{"configured_prices":{"$ref":"#/components/schemas/ConfiguredPrices"},"entries":{"items":{"anyOf":[{"$ref":"#/components/schemas/SetupAuthoring"},{"$ref":"#/components/schemas/SetupOffer"}]},"type":"array"},"page":{"type":"integer"},"per_page":{"type":"integer"},"total":{"minimum":0,"type":"integer"}},"required":["entries","page","per_page","total","configured_prices"],"type":"object"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"SQL-paginated authoring or customer offers and configured price conditions"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"List catalog setups","tags":["Studio catalog"]},"post":{"callbacks":{},"deprecated":false,"description":"Catalog owns JSON normalization, versioning, links, configured prices and lifecycle. Authoring includes drafts; view=offers reuses customer buyability. Configured prices are independently paginated with prices_page/prices_per_page and refer to current service versions. Amounts are configured catalog rates, not a dated customer quote. Omitted links/override sections preserve; [] clears the submitted collection. Archive deactivates; restore reactivates and enforces existing room allowances. Mutations require a UUID Idempotency-Key and current primary/linked-resource authority, including receipt replay.","operationId":"v2CreateSetup","parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupCreateRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandResponse"}}},"description":"Immutable resource acceptance; GET for current version"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Create catalog setups","tags":["Studio catalog"]}},"/api/v2/rooms/{id}":{"get":{"callbacks":{},"deprecated":false,"description":"Catalog owns JSON normalization, versioning, links, configured prices and lifecycle. Authoring includes drafts; view=offers reuses customer buyability. Configured prices are independently paginated with prices_page/prices_per_page and refer to current service versions. Amounts are configured catalog rates, not a dated customer quote. Omitted links/override sections preserve; [] clears the submitted collection. Archive deactivates; restore reactivates and enforces existing room allowances. Mutations require a UUID Idempotency-Key and current primary/linked-resource authority, including receipt replay.","operationId":"v2GetRoom","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"query","name":"prices_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"prices_per_page","schema":{"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/RoomAuthoring"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Current authorized authoring record, including inactive drafts"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Get catalog rooms","tags":["Studio catalog"]},"patch":{"callbacks":{},"deprecated":false,"description":"Catalog owns JSON normalization, versioning, links, configured prices and lifecycle. Authoring includes drafts; view=offers reuses customer buyability. Configured prices are independently paginated with prices_page/prices_per_page and refer to current service versions. Amounts are configured catalog rates, not a dated customer quote. Omitted links/override sections preserve; [] clears the submitted collection. Archive deactivates; restore reactivates and enforces existing room allowances. Mutations require a UUID Idempotency-Key and current primary/linked-resource authority, including receipt replay.","operationId":"v2UpdateRoom","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoomUpdateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandResponse"}}},"description":"Immutable resource acceptance; GET for current version"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Update catalog rooms","tags":["Studio catalog"]}},"/api/v2/subscriptions/{id}/cancellations":{"post":{"callbacks":{},"deprecated":false,"description":"Acceptance is an immutable delivery receipt. A refund request reserves a real outstanding obligation; only a studio report of actual success counts returned money. Studio refund UUIDs are independent from HTTP keys. Replacements explicitly name a failed or reversed attempt in the identical frozen scope and share its obligation. GET exposes current money and cancellation state. Recovery requires current key, tenant and owning-resource authority even after new commercial entry is disabled. Provider IDs are never accepted or manufactured.","operationId":"v2CancelSubscription","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionCancellationInput"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/ExternalRecoveryAcceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance or current actual recovery state"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Cancel subscription","tags":["Studio external recovery"]}},"/api/v2/bundle-redemptions/{id}":{"get":{"callbacks":{},"deprecated":false,"description":"Package kind is fixed by the route. Purchased snapshots and current ledger allowance determine rights and effective session lengths. Quotes are advisory. Redemption atomically creates all sessions and required delivery intents, or writes nothing. Paid extras use the existing separate session add-on purchase flow. Current authority is checked on replay. Cancellation uses the existing subscription cancellation routes. Native provider work is deferred; management GET exposes pending, ready or failed delivery. A ready billing portal URL is disclosed only to a key with current subscriptions:manage authority; read-only keys retain state and capability visibility without the live instruction. Plan changes, pause and resume are unsupported. Paid external decline retains an actionable refund obligation without executing a refund.","operationId":"v2PackagesBundleRedemption","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/PackageRedemption"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Current purchased rights or advisory quote"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Bundle redemption","tags":["Studio package rights and management"]}},"/api/v2/sessions/{id}/reschedules":{"post":{"callbacks":{},"deprecated":false,"description":"Current key authority and stored tenant ownership apply. Customer policies differ from explicit staff actions. Acceptance freezes the target and selection; GET states actual payment, approval and fulfillment. Provider instructions are fetched separately after preparation; external money is reported by the studio. Moves retain the sold duration. The setup_id selection applies to studio-tour sessions only; ordinary sessions retain their booked setup. To change an ordinary session's setup, preview /sessions/{id}/amendments/quotes, then accept /sessions/{id}/amendments with the returned version and required financial choices.","operationId":"v2AftercareReschedule","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoveInput"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/AftercareAcceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Reschedule","tags":["Studio booking aftercare"]}},"/api/v2/clients/{id}/bundle-redemptions/quotes":{"post":{"callbacks":{},"deprecated":false,"description":"Package kind is fixed by the route. Purchased snapshots and current ledger allowance determine rights and effective session lengths. Quotes are advisory. Redemption atomically creates all sessions and required delivery intents, or writes nothing. Paid extras use the existing separate session add-on purchase flow. Current authority is checked on replay. Cancellation uses the existing subscription cancellation routes. Native provider work is deferred; management GET exposes pending, ready or failed delivery. A ready billing portal URL is disclosed only to a key with current subscriptions:manage authority; read-only keys retain state and capability visibility without the live instruction. Plan changes, pause and resume are unsupported. Paid external decline retains an actionable refund obligation without executing a refund.","operationId":"v2PackagesBundleQuote","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackageQuoteInput"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/PackageQuote"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Current purchased rights or advisory quote"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Bundle quote","tags":["Studio package rights and management"]}},"/api/v2/amendments/{id}/approvals":{"post":{"callbacks":{},"deprecated":false,"description":"Current key authority and stored tenant ownership apply. Customer policies differ from explicit staff actions. Acceptance freezes the target and selection; GET states actual payment, approval and fulfillment. Provider instructions are fetched separately after preparation; external money is reported by the studio.","operationId":"v2AftercareApproveAmendment","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyInput"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/AftercareAcceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Approve amendment","tags":["Studio booking aftercare"]}},"/api/v2/addon-purchases/{id}/payment/tokens":{"post":{"callbacks":{},"deprecated":false,"description":"Current key authority and stored tenant ownership apply. Customer policies differ from explicit staff actions. Acceptance freezes the target and selection; GET states actual payment, approval and fulfillment. Provider instructions are fetched separately after preparation; external money is reported by the studio.","operationId":"v2AftercareSubmitAddon","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SquareTokenRequest"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/AftercareAcceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Submit addon","tags":["Studio booking aftercare"]}},"/api/v2/amendments/{id}/withdrawals":{"post":{"callbacks":{},"deprecated":false,"description":"Current key authority and stored tenant ownership apply. Customer policies differ from explicit staff actions. Acceptance freezes the target and selection; GET states actual payment, approval and fulfillment. Provider instructions are fetched separately after preparation; external money is reported by the studio.","operationId":"v2AftercareWithdrawAmendment","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyInput"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/AftercareAcceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Withdraw amendment","tags":["Studio booking aftercare"]}},"/api/v2/purchases/{id}/payment/cancellation-requests":{"post":{"callbacks":{},"deprecated":false,"description":"Email resolves the studio-owned Client and never authenticates the visitor. New purchase entry requires headless_api plus the family purchase permission, clients:read and payments:collect; clients:create is conditional on creating a Client association. GET requires payments:read plus the purchased family's read permission. Recovery requires payments:collect, clients:read and that family's read permission under current studio key/account/public_api authority; accepted recovery remains available with headless new entry disabled. Native provider, credit, promo, approval, private-offer and consent policies apply. Acceptance atomically records a frozen purchase obligation, immutable receipt and required work; no provider IO runs before commit. Instructions carry public SDK capabilities, never proof of settlement. Fetch current state for money, approval and rights separately. Unknown outcomes resume the original frozen tender identity; outcomes beyond the safe replay window require reconciliation and never create another recurring subscription. Cancellation retires unpaid capability before completing; money in flight remains undetermined. No external settlement reports, renewal, aftercare or raw status writes are accepted.","operationId":"v2CancelPurchase","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutEmptyRequest"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/Acceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable command acceptance; fetch purchase current state"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Native payment or offer requires reconciliation"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Request retirement of an unpaid native purchase","tags":["Studio native purchases"]}},"/api/v2/addon-purchases/{id}":{"get":{"callbacks":{},"deprecated":false,"description":"Current key authority and stored tenant ownership apply. Customer policies differ from explicit staff actions. Acceptance freezes the target and selection; GET states actual payment, approval and fulfillment. Provider instructions are fetched separately after preparation; external money is reported by the studio.","operationId":"v2AftercareAddon","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/AddonPurchaseCurrent"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Current state or optional preview"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Addon","tags":["Studio booking aftercare"]}},"/api/v2/external-payment-reports/{id}":{"get":{"callbacks":{},"deprecated":false,"description":"A studio collection UUID belongs to the tenant independently of each key-bound HTTP receipt. Report only studio-collected money; native Stripe/Square/cash tenders cannot be externally settled. No provider integration or provider proof is required. Inline complete booking selections use current customer policy. Booking refusal retains collected money and an action obligation; it never claims a refund happened. Same immutable collection facts are a financial no-op across keys; repair is a separate resolution command. GET separates original immutable acceptance from current coverage/action state. New commercial entry is deployment-disabled until external recovery/projection readiness; current authority and owned recovery remain required after disablement.","operationId":"v2GetExternalPaymentReport","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/ExternalPaymentReport"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance or current studio-owned external state"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Get external payment report","tags":["Studio external payments"]}},"/api/v2/addons":{"get":{"callbacks":{},"deprecated":false,"description":"Catalog owns JSON normalization, versioning, links, configured prices and lifecycle. Authoring includes drafts; view=offers reuses customer buyability. Configured prices are independently paginated with prices_page/prices_per_page and refer to current service versions. Amounts are configured catalog rates, not a dated customer quote. Omitted links/override sections preserve; [] clears the submitted collection. Archive deactivates; restore reactivates and enforces existing room allowances. Mutations require a UUID Idempotency-Key and current primary/linked-resource authority, including receipt replay.","operationId":"v2ListAddon","parameters":[{"in":"query","name":"page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"per_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"prices_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"prices_per_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"view","schema":{"default":"authoring","enum":["authoring","offers"],"type":"string"}},{"in":"query","name":"include_inactive","schema":{"type":"boolean"}},{"in":"query","name":"room_id","schema":{"format":"uuid","type":"string"}},{"in":"query","name":"setup_id","schema":{"format":"uuid","type":"string"}},{"in":"query","name":"service_id","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"additionalProperties":false,"properties":{"configured_prices":{"$ref":"#/components/schemas/ConfiguredPrices"},"entries":{"items":{"anyOf":[{"$ref":"#/components/schemas/AddonAuthoring"},{"$ref":"#/components/schemas/AddonOffer"}]},"type":"array"},"page":{"type":"integer"},"per_page":{"type":"integer"},"total":{"minimum":0,"type":"integer"}},"required":["entries","page","per_page","total","configured_prices"],"type":"object"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"SQL-paginated authoring or customer offers and configured price conditions"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"List catalog addons","tags":["Studio catalog"]},"post":{"callbacks":{},"deprecated":false,"description":"Catalog owns JSON normalization, versioning, links, configured prices and lifecycle. Authoring includes drafts; view=offers reuses customer buyability. Configured prices are independently paginated with prices_page/prices_per_page and refer to current service versions. Amounts are configured catalog rates, not a dated customer quote. Omitted links/override sections preserve; [] clears the submitted collection. Archive deactivates; restore reactivates and enforces existing room allowances. Mutations require a UUID Idempotency-Key and current primary/linked-resource authority, including receipt replay.","operationId":"v2CreateAddon","parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddonCreateRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandResponse"}}},"description":"Immutable resource acceptance; GET for current version"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Create catalog addons","tags":["Studio catalog"]}},"/api/v2/services/{id}":{"get":{"callbacks":{},"deprecated":false,"description":"Catalog owns JSON normalization, versioning, links, configured prices and lifecycle. Authoring includes drafts; view=offers reuses customer buyability. Configured prices are independently paginated with prices_page/prices_per_page and refer to current service versions. Amounts are configured catalog rates, not a dated customer quote. Omitted links/override sections preserve; [] clears the submitted collection. Archive deactivates; restore reactivates and enforces existing room allowances. Mutations require a UUID Idempotency-Key and current primary/linked-resource authority, including receipt replay.","operationId":"v2GetService","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"query","name":"prices_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"prices_per_page","schema":{"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/ServiceAuthoring"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Current authorized authoring record, including inactive drafts"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Get catalog services","tags":["Studio catalog"]},"patch":{"callbacks":{},"deprecated":false,"description":"Catalog owns JSON normalization, versioning, links, configured prices and lifecycle. Authoring includes drafts; view=offers reuses customer buyability. Configured prices are independently paginated with prices_page/prices_per_page and refer to current service versions. Amounts are configured catalog rates, not a dated customer quote. Omitted links/override sections preserve; [] clears the submitted collection. Archive deactivates; restore reactivates and enforces existing room allowances. Mutations require a UUID Idempotency-Key and current primary/linked-resource authority, including receipt replay.","operationId":"v2UpdateService","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceUpdateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandResponse"}}},"description":"Immutable resource acceptance; GET for current version"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Update catalog services","tags":["Studio catalog"]}},"/api/v2/bundle-plans/{id}":{"get":{"callbacks":{},"deprecated":false,"description":"Packages owns JSON normalization, scoped references, computed prices, version snapshots and lifecycle. Public authoring permits repairable drafts and never grants. Omitted options/addons preserve; [] clears. Authoring scope=private/all also requires clients:read. view=offers uses current public purchasability and excludes private plans; images and terms are available for display. options_page/options_per_page and addons_page/addons_per_page independently bound nested collections. Private commands require clients:read. Direct grants separately require grant. Subscription sales require resend_payment_link; bundle sales use create/update authority. Explicit bundle payment-link saves use the shared default validity window when omitted, including private edits; resends preserve the stored deadline. Bundle grants remain open-ended; subscription private deadlines and targets are immutable. Archive deactivates without changing prior purchases. UUID Idempotency-Key required; replay checks current authority and returns immutable acceptance only. GET reads current state.","operationId":"v2GetBundlePlan","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"query","name":"options_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"options_per_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"addons_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"addons_per_page","schema":{"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/BundlePlanAuthoring"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Current authorized authoring record"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Current offer state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Get bundle-plans","tags":["Studio package offers"]},"patch":{"callbacks":{},"deprecated":false,"description":"Packages owns JSON normalization, scoped references, computed prices, version snapshots and lifecycle. Public authoring permits repairable drafts and never grants. Omitted options/addons preserve; [] clears. Authoring scope=private/all also requires clients:read. view=offers uses current public purchasability and excludes private plans; images and terms are available for display. options_page/options_per_page and addons_page/addons_per_page independently bound nested collections. Private commands require clients:read. Direct grants separately require grant. Subscription sales require resend_payment_link; bundle sales use create/update authority. Explicit bundle payment-link saves use the shared default validity window when omitted, including private edits; resends preserve the stored deadline. Bundle grants remain open-ended; subscription private deadlines and targets are immutable. Archive deactivates without changing prior purchases. UUID Idempotency-Key required; replay checks current authority and returns immutable acceptance only. GET reads current state.","operationId":"v2UpdateBundlePlan","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BundlePlanUpdateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandResponse"}}},"description":"Immutable resource acceptance"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Current offer state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Update bundle-plans","tags":["Studio package offers"]}},"/api/v2/studio-tours/published":{"get":{"callbacks":{},"deprecated":false,"description":"Studio-owned native checkout. Current key/account/public_api authority and tenant ownership apply on reads, writes and receipt replay. A permitted replacement studio key may recover a known checkout. Accepted obligations remain recoverable when headless new entry is disabled. Instructions are browser capabilities, never proof of settlement. Confirmation verifies the native provider. An uncertain provider outcome retains its frozen request identity; do not create another tender. Token payloads are never in receipts or job arguments.","operationId":"v2GetPublishedTour","parameters":[{"description":"Published slug; omit for a published home tour","in":"query","name":"slug","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/TourOffer"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Current authorized studio resource"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Read the currently published tour, required questions, guest policy and consent metadata","tags":["Studio native checkout"]}},"/api/v2/services/{id}/archival":{"delete":{"callbacks":{},"deprecated":false,"description":"Catalog owns JSON normalization, versioning, links, configured prices and lifecycle. Authoring includes drafts; view=offers reuses customer buyability. Configured prices are independently paginated with prices_page/prices_per_page and refer to current service versions. Amounts are configured catalog rates, not a dated customer quote. Omitted links/override sections preserve; [] clears the submitted collection. Archive deactivates; restore reactivates and enforces existing room allowances. Mutations require a UUID Idempotency-Key and current primary/linked-resource authority, including receipt replay.","operationId":"v2RestoreService","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{},"type":"object"}}},"required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandResponse"}}},"description":"Immutable resource acceptance; GET for current version"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Restore catalog services","tags":["Studio catalog"]},"put":{"callbacks":{},"deprecated":false,"description":"Catalog owns JSON normalization, versioning, links, configured prices and lifecycle. Authoring includes drafts; view=offers reuses customer buyability. Configured prices are independently paginated with prices_page/prices_per_page and refer to current service versions. Amounts are configured catalog rates, not a dated customer quote. Omitted links/override sections preserve; [] clears the submitted collection. Archive deactivates; restore reactivates and enforces existing room allowances. Mutations require a UUID Idempotency-Key and current primary/linked-resource authority, including receipt replay.","operationId":"v2ArchiveService","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{},"type":"object"}}},"required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandResponse"}}},"description":"Immutable resource acceptance; GET for current version"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Archive catalog services","tags":["Studio catalog"]}},"/api/v2/amendments/{id}/payment/preparations":{"post":{"callbacks":{},"deprecated":false,"description":"Current key authority and stored tenant ownership apply. Customer policies differ from explicit staff actions. Acceptance freezes the target and selection; GET states actual payment, approval and fulfillment. Provider instructions are fetched separately after preparation; external money is reported by the studio.","operationId":"v2AftercarePrepareAmendment","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AftercareCreditChoice"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/AftercareAcceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Prepare amendment","tags":["Studio booking aftercare"]}},"/api/v2/external-checkouts/{id}":{"get":{"callbacks":{},"deprecated":false,"description":"A studio collection UUID belongs to the tenant independently of each key-bound HTTP receipt. Report only studio-collected money; native Stripe/Square/cash tenders cannot be externally settled. No provider integration or provider proof is required. Inline complete booking selections use current customer policy. Booking refusal retains collected money and an action obligation; it never claims a refund happened. Same immutable collection facts are a financial no-op across keys; repair is a separate resolution command. GET separates original immutable acceptance from current coverage/action state. New commercial entry is deployment-disabled until external recovery/projection readiness; current authority and owned recovery remain required after disablement.","operationId":"v2GetExternalCheckout","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/ExternalPayable"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance or current studio-owned external state"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Get external checkout","tags":["Studio external payments"]}},"/api/v2/external-refunds":{"post":{"callbacks":{},"deprecated":false,"description":"Acceptance is an immutable delivery receipt. A refund request reserves a real outstanding obligation; only a studio report of actual success counts returned money. Studio refund UUIDs are independent from HTTP keys. Replacements explicitly name a failed or reversed attempt in the identical frozen scope and share its obligation. GET exposes current money and cancellation state. Recovery requires current key, tenant and owning-resource authority even after new commercial entry is disabled. Provider IDs are never accepted or manufactured.","operationId":"v2RequestExternalRefund","parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExternalRefundInput"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/ExternalRecoveryAcceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance or current actual recovery state"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Request external refund","tags":["Studio external recovery"]}},"/api/v2/external-checkouts/{id}/outcomes":{"post":{"callbacks":{},"deprecated":false,"description":"Acceptance is an immutable delivery receipt. A refund request reserves a real outstanding obligation; only a studio report of actual success counts returned money. Studio refund UUIDs are independent from HTTP keys. Replacements explicitly name a failed or reversed attempt in the identical frozen scope and share its obligation. GET exposes current money and cancellation state. Recovery requires current key, tenant and owning-resource authority even after new commercial entry is disabled. Provider IDs are never accepted or manufactured.","operationId":"v2ReportExternalPayableOutcome","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExternalPayableOutcomeInput"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/ExternalRecoveryAcceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance or current actual recovery state"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Report external payable outcome","tags":["Studio external recovery"]}},"/api/v2/external-payment-reports/{id}/resolutions":{"post":{"callbacks":{},"deprecated":false,"description":"A studio collection UUID belongs to the tenant independently of each key-bound HTTP receipt. Report only studio-collected money; native Stripe/Square/cash tenders cannot be externally settled. No provider integration or provider proof is required. Inline complete booking selections use current customer policy. Booking refusal retains collected money and an action obligation; it never claims a refund happened. Same immutable collection facts are a financial no-op across keys; repair is a separate resolution command. GET separates original immutable acceptance from current coverage/action state. New commercial entry is deployment-disabled until external recovery/projection readiness; current authority and owned recovery remain required after disablement.","operationId":"v2ResolveExternalPaymentReport","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExternalPaymentResolutionRequest"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/Acceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance or current studio-owned external state"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Resolve external payment report","tags":["Studio external payments"]}},"/api/v2/addon-purchases/{id}/payment/preparations":{"post":{"callbacks":{},"deprecated":false,"description":"Current key authority and stored tenant ownership apply. Customer policies differ from explicit staff actions. Acceptance freezes the target and selection; GET states actual payment, approval and fulfillment. Provider instructions are fetched separately after preparation; external money is reported by the studio.","operationId":"v2AftercarePrepareAddon","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyInput"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/AftercareAcceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Prepare addon","tags":["Studio booking aftercare"]}},"/api/v2/addons/{id}":{"get":{"callbacks":{},"deprecated":false,"description":"Catalog owns JSON normalization, versioning, links, configured prices and lifecycle. Authoring includes drafts; view=offers reuses customer buyability. Configured prices are independently paginated with prices_page/prices_per_page and refer to current service versions. Amounts are configured catalog rates, not a dated customer quote. Omitted links/override sections preserve; [] clears the submitted collection. Archive deactivates; restore reactivates and enforces existing room allowances. Mutations require a UUID Idempotency-Key and current primary/linked-resource authority, including receipt replay.","operationId":"v2GetAddon","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"query","name":"prices_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"prices_per_page","schema":{"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/AddonAuthoring"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Current authorized authoring record, including inactive drafts"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Get catalog addons","tags":["Studio catalog"]},"patch":{"callbacks":{},"deprecated":false,"description":"Catalog owns JSON normalization, versioning, links, configured prices and lifecycle. Authoring includes drafts; view=offers reuses customer buyability. Configured prices are independently paginated with prices_page/prices_per_page and refer to current service versions. Amounts are configured catalog rates, not a dated customer quote. Omitted links/override sections preserve; [] clears the submitted collection. Archive deactivates; restore reactivates and enforces existing room allowances. Mutations require a UUID Idempotency-Key and current primary/linked-resource authority, including receipt replay.","operationId":"v2UpdateAddon","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddonUpdateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandResponse"}}},"description":"Immutable resource acceptance; GET for current version"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Update catalog addons","tags":["Studio catalog"]}},"/api/v2/amendments/{id}":{"get":{"callbacks":{},"deprecated":false,"description":"Current key authority and stored tenant ownership apply. Customer policies differ from explicit staff actions. Acceptance freezes the target and selection; GET states actual payment, approval and fulfillment. Provider instructions are fetched separately after preparation; external money is reported by the studio.","operationId":"v2AftercareAmendment","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/SessionAmendmentCurrent"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Current state or optional preview"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Amendment","tags":["Studio booking aftercare"]}},"/api/v2/external-checkouts/{id}/collections":{"get":{"callbacks":{},"deprecated":false,"description":"Acceptance is an immutable delivery receipt. A refund request reserves a real outstanding obligation; only a studio report of actual success counts returned money. Studio refund UUIDs are independent from HTTP keys. Replacements explicitly name a failed or reversed attempt in the identical frozen scope and share its obligation. GET exposes current money and cancellation state. Recovery requires current key, tenant and owning-resource authority even after new commercial entry is disabled. Provider IDs are never accepted or manufactured.","operationId":"v2ListExternalRefundCollections","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"query","name":"after","schema":{"type":"string"}},{"in":"query","name":"limit","schema":{"default":25,"maximum":100,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/ExternalRefundCollectionPage"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance or current actual recovery state"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"List external refund collections","tags":["Studio external recovery"]}},"/api/v2/sessions/{id}/amendment-options":{"get":{"callbacks":{},"deprecated":false,"description":"Current key authority and stored tenant ownership apply. Customer policies differ from explicit staff actions. Acceptance freezes the target and selection; GET states actual payment, approval and fulfillment. Provider instructions are fetched separately after preparation; external money is reported by the studio.","operationId":"v2AftercareStartAmendment","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/AmendmentStart"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Current state or optional preview"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Start amendment","tags":["Studio booking aftercare"]}},"/api/v2/bookings":{"post":{"callbacks":{},"deprecated":false,"description":"Email resolves a studio Client and never authenticates a visitor. Requires sessions:create and clients:read; clients:create only when a Client association must be created; payments:collect is required for the native checkout. Podyx revalidates complete current selection, amount, details and consent before writing one hold/obligation/immutable receipt/required job in one transaction. No payment provider request runs before commit. Ordinary bookings run the configured native final Google Calendar guard before acceptance; current local inventory and selection are revalidated during acceptance. Booking approval and payment settlement stay separate. No caller price, provider or paid flag is accepted. New entry requires headless_api; tours also require current studio_tour entitlement. Existing customer/CMS semantics are preserved. Tour answers use the private custom_form_answers container; phone-required tours need the client's owned profile to contain a valid phone, obtainable through the separate client API.","operationId":"v2CheckoutBooking","parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingCheckoutRequest"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/Acceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance; fetch the checkout for current money, approval and fulfillment"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Accept a complete single or multi-session customer booking by email","tags":["Studio native checkout"]}},"/api/v2/amendments/{id}/payment/cancellation-requests":{"post":{"callbacks":{},"deprecated":false,"description":"Current key authority and stored tenant ownership apply. Customer policies differ from explicit staff actions. Acceptance freezes the target and selection; GET states actual payment, approval and fulfillment. Provider instructions are fetched separately after preparation; external money is reported by the studio.","operationId":"v2AftercareCancelAmendment","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyInput"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/AftercareAcceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Cancel amendment","tags":["Studio booking aftercare"]}},"/api/v2/subscription-plans/{id}":{"get":{"callbacks":{},"deprecated":false,"description":"Packages owns JSON normalization, scoped references, computed prices, version snapshots and lifecycle. Public authoring permits repairable drafts and never grants. Omitted options/addons preserve; [] clears. Authoring scope=private/all also requires clients:read. view=offers uses current public purchasability and excludes private plans; images and terms are available for display. options_page/options_per_page and addons_page/addons_per_page independently bound nested collections. Private commands require clients:read. Direct grants separately require grant. Subscription sales require resend_payment_link; bundle sales use create/update authority. Explicit bundle payment-link saves use the shared default validity window when omitted, including private edits; resends preserve the stored deadline. Bundle grants remain open-ended; subscription private deadlines and targets are immutable. Archive deactivates without changing prior purchases. UUID Idempotency-Key required; replay checks current authority and returns immutable acceptance only. GET reads current state.","operationId":"v2GetSubscriptionPlan","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"query","name":"options_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"options_per_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"addons_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"addons_per_page","schema":{"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/SubscriptionPlanAuthoring"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Current authorized authoring record"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Current offer state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Get subscription-plans","tags":["Studio package offers"]},"patch":{"callbacks":{},"deprecated":false,"description":"Packages owns JSON normalization, scoped references, computed prices, version snapshots and lifecycle. Public authoring permits repairable drafts and never grants. Omitted options/addons preserve; [] clears. Authoring scope=private/all also requires clients:read. view=offers uses current public purchasability and excludes private plans; images and terms are available for display. options_page/options_per_page and addons_page/addons_per_page independently bound nested collections. Private commands require clients:read. Direct grants separately require grant. Subscription sales require resend_payment_link; bundle sales use create/update authority. Explicit bundle payment-link saves use the shared default validity window when omitted, including private edits; resends preserve the stored deadline. Bundle grants remain open-ended; subscription private deadlines and targets are immutable. Archive deactivates without changing prior purchases. UUID Idempotency-Key required; replay checks current authority and returns immutable acceptance only. GET reads current state.","operationId":"v2UpdateSubscriptionPlan","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionPlanUpdateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandResponse"}}},"description":"Immutable resource acceptance"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Current offer state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Update subscription-plans","tags":["Studio package offers"]}},"/api/v2/bundle-plans/{id}/payment-link-requests":{"post":{"callbacks":{},"deprecated":false,"description":"Packages owns JSON normalization, scoped references, computed prices, version snapshots and lifecycle. Public authoring permits repairable drafts and never grants. Omitted options/addons preserve; [] clears. Authoring scope=private/all also requires clients:read. view=offers uses current public purchasability and excludes private plans; images and terms are available for display. options_page/options_per_page and addons_page/addons_per_page independently bound nested collections. Private commands require clients:read. Direct grants separately require grant. Subscription sales require resend_payment_link; bundle sales use create/update authority. Explicit bundle payment-link saves use the shared default validity window when omitted, including private edits; resends preserve the stored deadline. Bundle grants remain open-ended; subscription private deadlines and targets are immutable. Archive deactivates without changing prior purchases. UUID Idempotency-Key required; replay checks current authority and returns immutable acceptance only. GET reads current state.","operationId":"v2RequestPaymentLinkBundlePlan","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{},"type":"object"}}},"required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandResponse"}}},"description":"Immutable resource acceptance"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Current offer state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"RequestPaymentLink bundle-plans","tags":["Studio package offers"]}},"/api/v2/bookings/quotes":{"post":{"callbacks":{},"deprecated":false,"description":"Read-only POST: incomplete selections return status=incomplete and missing_inputs, with current CMS-configured forms, guest limit, recording seats, invoice fields, rail-specific displayed consent documents and paginated file-transfer choices. No client, booking, hold, payment or receipt is created. Prices, tax, promo eligibility and credits are resolved by Podyx; amounts or provider IDs in input are refused. A fingerprint identifies advisory facts, never a price lock or permission to charge. Complete means required selections, details, invoice fields and consent acceptance are supplied; later commands must revalidate. client_id means a currently owned studio Client, requires clients:read in addition to the family read permission, and is never visitor login. Omit it for anonymous preview; email is not accepted here. Existing public_api/account/current-key authority remains required, including after reads. Disabling headless new entry preserves authorized quote reads. Booking sessions are explicit and multi-session; Studio Tour has its own published quote and booking operations. Subscription quotes additionally accept payment_source=native|external, default native: external previews studio collection independently of native provider cadence restrictions; actual studio approval still applies and no collection is reported. Other quote families do not accept payment_source. Bundle/subscription never ask for refund policy; tour consent remains terms only. page/per_page page file-transfer choices only, using the existing 1..100 bounds.","operationId":"v2BookingQuote","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingQuoteRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/CustomerQuote"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Advisory complete or incomplete quote; no hold"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"additionalProperties":true,"properties":{"code":{"description":"Stable machine-readable error code; clients must tolerate new codes.","type":"string"},"errors":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"description":"Field validation messages when code is validation_failed.","type":"object"},"feature":{"description":"Required studio entitlement when code is feature_disabled; clients must tolerate new features.","type":"string"},"permissions":{"description":"Required permissions when code is permission_required.","items":{"$ref":"#/components/schemas/ApiPermission"},"type":"array"},"request_id":{"description":"Request correlation identifier.","type":"string"},"setup_choices":{"description":"Eligible destination setups when code is setup_selection_required.","items":{"additionalProperties":false,"properties":{"id":{"format":"uuid","type":"string"},"name":{"nullable":true,"type":"string"},"room_name":{"nullable":true,"type":"string"}},"required":["id","name","room_name"],"type":"object"},"type":"array"},"status":{"description":"HTTP response status.","type":"integer"},"title":{"type":"string"}},"required":["status","code","title","request_id"],"title":"ApiErrorResponse","type":"object"}}},"description":"Current selection is unavailable or no longer offered"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Preview current customer booking selections and checkout requirements","tags":["Studio customer quotes"]}},"/api/v2/sessions/{id}/amendments":{"post":{"callbacks":{},"deprecated":false,"description":"Current key authority and stored tenant ownership apply. Customer policies differ from explicit staff actions. Acceptance freezes the target and selection; GET states actual payment, approval and fulfillment. Provider instructions are fetched separately after preparation; external money is reported by the studio.","operationId":"v2AftercareAcceptAmendment","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionAmendmentConfirmInput"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/AftercareAcceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Accept amendment","tags":["Studio booking aftercare"]}},"/api/v2/sessions/{id}/guests":{"get":{"callbacks":{},"deprecated":false,"description":"Current key authority and stored tenant ownership apply. Customer policies differ from explicit staff actions. Acceptance freezes the target and selection; GET states actual payment, approval and fulfillment. Provider instructions are fetched separately after preparation; external money is reported by the studio.","operationId":"v2AftercareGuests","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/GuestList"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Current state or optional preview"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Guests","tags":["Studio booking aftercare"]},"post":{"callbacks":{},"deprecated":false,"description":"Current key authority and stored tenant ownership apply. Customer policies differ from explicit staff actions. Acceptance freezes the target and selection; GET states actual payment, approval and fulfillment. Provider instructions are fetched separately after preparation; external money is reported by the studio.","operationId":"v2AftercareInviteGuest","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuestInput"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/AftercareAcceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Invite guest","tags":["Studio booking aftercare"]}},"/api/v2/clients":{"post":{"callbacks":{},"deprecated":false,"operationId":"v2CreateClient","parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateClientRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandResponse"}}},"description":"Immutable acceptance; fetch client for current account lifecycle"},"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandResponse"}}},"description":"Immutable acceptance; fetch client for current account lifecycle"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Find or create a studio's client without implicit login","tags":["Studio clients"]}},"/api/v2/subscriptions/{id}/session-grants":{"post":{"callbacks":{},"deprecated":false,"description":"Package kind is fixed by the route. Purchased snapshots and current ledger allowance determine rights and effective session lengths. Quotes are advisory. Redemption atomically creates all sessions and required delivery intents, or writes nothing. Paid extras use the existing separate session add-on purchase flow. Current authority is checked on replay. Cancellation uses the existing subscription cancellation routes. Native provider work is deferred; management GET exposes pending, ready or failed delivery. A ready billing portal URL is disclosed only to a key with current subscriptions:manage authority; read-only keys retain state and capability visibility without the live instruction. Plan changes, pause and resume are unsupported. Paid external decline retains an actionable refund obligation without executing a refund.","operationId":"v2PackagesGrantSessions","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionSessionGrantInput"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/PackageAcceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance; fetch current state separately"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Grant sessions","tags":["Studio package rights and management"]}},"/api/v2/services":{"get":{"callbacks":{},"deprecated":false,"description":"Catalog owns JSON normalization, versioning, links, configured prices and lifecycle. Authoring includes drafts; view=offers reuses customer buyability. Configured prices are independently paginated with prices_page/prices_per_page and refer to current service versions. Amounts are configured catalog rates, not a dated customer quote. Omitted links/override sections preserve; [] clears the submitted collection. Archive deactivates; restore reactivates and enforces existing room allowances. Mutations require a UUID Idempotency-Key and current primary/linked-resource authority, including receipt replay.","operationId":"v2ListService","parameters":[{"in":"query","name":"page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"per_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"prices_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"prices_per_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"view","schema":{"default":"authoring","enum":["authoring","offers"],"type":"string"}},{"in":"query","name":"include_inactive","schema":{"type":"boolean"}},{"in":"query","name":"room_id","schema":{"format":"uuid","type":"string"}},{"in":"query","name":"setup_id","schema":{"format":"uuid","type":"string"}},{"in":"query","name":"service_id","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"additionalProperties":false,"properties":{"configured_prices":{"$ref":"#/components/schemas/ConfiguredPrices"},"entries":{"items":{"anyOf":[{"$ref":"#/components/schemas/ServiceAuthoring"},{"$ref":"#/components/schemas/ServiceOffer"}]},"type":"array"},"page":{"type":"integer"},"per_page":{"type":"integer"},"total":{"minimum":0,"type":"integer"}},"required":["entries","page","per_page","total","configured_prices"],"type":"object"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"SQL-paginated authoring or customer offers and configured price conditions"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"List catalog services","tags":["Studio catalog"]},"post":{"callbacks":{},"deprecated":false,"description":"Catalog owns JSON normalization, versioning, links, configured prices and lifecycle. Authoring includes drafts; view=offers reuses customer buyability. Configured prices are independently paginated with prices_page/prices_per_page and refer to current service versions. Amounts are configured catalog rates, not a dated customer quote. Omitted links/override sections preserve; [] clears the submitted collection. Archive deactivates; restore reactivates and enforces existing room allowances. Mutations require a UUID Idempotency-Key and current primary/linked-resource authority, including receipt replay.","operationId":"v2CreateService","parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceCreateRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandResponse"}}},"description":"Immutable resource acceptance; GET for current version"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Create catalog services","tags":["Studio catalog"]}},"/api/v2/checkouts/{id}/payment/tokens":{"post":{"callbacks":{},"deprecated":false,"description":"Studio-owned native checkout. Current key/account/public_api authority and tenant ownership apply on reads, writes and receipt replay. A permitted replacement studio key may recover a known checkout. Accepted obligations remain recoverable when headless new entry is disabled. Instructions are browser capabilities, never proof of settlement. Confirmation verifies the native provider. An uncertain provider outcome retains its frozen request identity; do not create another tender. Token payloads are never in receipts or job arguments.","operationId":"v2SubmitCheckoutToken","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SquareTokenRequest"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/Acceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance; fetch the checkout for current money, approval and fulfillment"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Submit a Square browser token for the owned native checkout","tags":["Studio native checkout"]}},"/api/v2/subscriptions/{id}/management-requests":{"post":{"callbacks":{},"deprecated":false,"description":"Package kind is fixed by the route. Purchased snapshots and current ledger allowance determine rights and effective session lengths. Quotes are advisory. Redemption atomically creates all sessions and required delivery intents, or writes nothing. Paid extras use the existing separate session add-on purchase flow. Current authority is checked on replay. Cancellation uses the existing subscription cancellation routes. Native provider work is deferred; management GET exposes pending, ready or failed delivery. A ready billing portal URL is disclosed only to a key with current subscriptions:manage authority; read-only keys retain state and capability visibility without the live instruction. Plan changes, pause and resume are unsupported. Paid external decline retains an actionable refund obligation without executing a refund.","operationId":"v2PackagesManageSubscription","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionManagementInput"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/PackageAcceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance; fetch current state separately"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Manage subscription","tags":["Studio package rights and management"]}},"/api/v2/subscription-plans/{id}/payment-link-requests":{"post":{"callbacks":{},"deprecated":false,"description":"Packages owns JSON normalization, scoped references, computed prices, version snapshots and lifecycle. Public authoring permits repairable drafts and never grants. Omitted options/addons preserve; [] clears. Authoring scope=private/all also requires clients:read. view=offers uses current public purchasability and excludes private plans; images and terms are available for display. options_page/options_per_page and addons_page/addons_per_page independently bound nested collections. Private commands require clients:read. Direct grants separately require grant. Subscription sales require resend_payment_link; bundle sales use create/update authority. Explicit bundle payment-link saves use the shared default validity window when omitted, including private edits; resends preserve the stored deadline. Bundle grants remain open-ended; subscription private deadlines and targets are immutable. Archive deactivates without changing prior purchases. UUID Idempotency-Key required; replay checks current authority and returns immutable acceptance only. GET reads current state.","operationId":"v2RequestPaymentLinkSubscriptionPlan","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{},"type":"object"}}},"required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandResponse"}}},"description":"Immutable resource acceptance"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Current offer state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"RequestPaymentLink subscription-plans","tags":["Studio package offers"]}},"/api/v2/amendments/{id}/declines":{"post":{"callbacks":{},"deprecated":false,"description":"Current key authority and stored tenant ownership apply. Customer policies differ from explicit staff actions. Acceptance freezes the target and selection; GET states actual payment, approval and fulfillment. Provider instructions are fetched separately after preparation; external money is reported by the studio.","operationId":"v2AftercareDeclineAmendment","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyInput"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/AftercareAcceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Decline amendment","tags":["Studio booking aftercare"]}},"/api/v2/clients/{id}":{"get":{"callbacks":{},"deprecated":false,"operationId":"v2GetClient","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/Client"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Current owned client"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Read the currently owned studio client and its scoped references","tags":["Studio clients"]},"patch":{"callbacks":{},"deprecated":false,"operationId":"v2UpdateClient","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateClientRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandResponse"}}},"description":"Immutable acceptance; fetch client for current account lifecycle"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Update explicitly supplied shared client profile fields","tags":["Studio clients"]}},"/api/v2/clients/{id}/subscription-redemptions":{"post":{"callbacks":{},"deprecated":false,"description":"Package kind is fixed by the route. Purchased snapshots and current ledger allowance determine rights and effective session lengths. Quotes are advisory. Redemption atomically creates all sessions and required delivery intents, or writes nothing. Paid extras use the existing separate session add-on purchase flow. Current authority is checked on replay. Cancellation uses the existing subscription cancellation routes. Native provider work is deferred; management GET exposes pending, ready or failed delivery. A ready billing portal URL is disclosed only to a key with current subscriptions:manage authority; read-only keys retain state and capability visibility without the live instruction. Plan changes, pause and resume are unsupported. Paid external decline retains an actionable refund obligation without executing a refund.","operationId":"v2PackagesRedeemSubscription","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackageRedemptionInput"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/PackageAcceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance; fetch current state separately"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Redeem subscription","tags":["Studio package rights and management"]}},"/api/v2/subscription-purchases":{"post":{"callbacks":{},"deprecated":false,"description":"Email resolves the studio-owned Client and never authenticates the visitor. New purchase entry requires headless_api plus the family purchase permission, clients:read and payments:collect; clients:create is conditional on creating a Client association. GET requires payments:read plus the purchased family's read permission. Recovery requires payments:collect, clients:read and that family's read permission under current studio key/account/public_api authority; accepted recovery remains available with headless new entry disabled. Native provider, credit, promo, approval, private-offer and consent policies apply. Acceptance atomically records a frozen purchase obligation, immutable receipt and required work; no provider IO runs before commit. Instructions carry public SDK capabilities, never proof of settlement. Fetch current state for money, approval and rights separately. Unknown outcomes resume the original frozen tender identity; outcomes beyond the safe replay window require reconciliation and never create another recurring subscription. Cancellation retires unpaid capability before completing; money in flight remains undetermined. No external settlement reports, renewal, aftercare or raw status writes are accepted.","operationId":"v2PurchaseSubscription","parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionPurchaseRequest"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/Acceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable command acceptance; fetch purchase current state"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Native payment or offer requires reconciliation"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Accept a native initial subscription purchase by studio-owned client email","tags":["Studio native purchases"]}},"/api/v2/member-bundles/{id}/declines":{"post":{"callbacks":{},"deprecated":false,"description":"Package kind is fixed by the route. Purchased snapshots and current ledger allowance determine rights and effective session lengths. Quotes are advisory. Redemption atomically creates all sessions and required delivery intents, or writes nothing. Paid extras use the existing separate session add-on purchase flow. Current authority is checked on replay. Cancellation uses the existing subscription cancellation routes. Native provider work is deferred; management GET exposes pending, ready or failed delivery. A ready billing portal URL is disclosed only to a key with current subscriptions:manage authority; read-only keys retain state and capability visibility without the live instruction. Plan changes, pause and resume are unsupported. Paid external decline retains an actionable refund obligation without executing a refund.","operationId":"v2PackagesDeclineBundle","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyInput"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/PackageAcceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance; fetch current state separately"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Decline bundle","tags":["Studio package rights and management"]}},"/api/v2/external-refunds/{id}":{"get":{"callbacks":{},"deprecated":false,"description":"Acceptance is an immutable delivery receipt. A refund request reserves a real outstanding obligation; only a studio report of actual success counts returned money. Studio refund UUIDs are independent from HTTP keys. Replacements explicitly name a failed or reversed attempt in the identical frozen scope and share its obligation. GET exposes current money and cancellation state. Recovery requires current key, tenant and owning-resource authority even after new commercial entry is disabled. Provider IDs are never accepted or manufactured.","operationId":"v2GetExternalRefund","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/ExternalRefund"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance or current actual recovery state"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Get external refund","tags":["Studio external recovery"]}},"/api/v2/sessions/{id}/amendments/quotes":{"post":{"callbacks":{},"deprecated":false,"description":"Current key authority and stored tenant ownership apply. Customer policies differ from explicit staff actions. Acceptance freezes the target and selection; GET states actual payment, approval and fulfillment. Provider instructions are fetched separately after preparation; external money is reported by the studio.","operationId":"v2AftercareAmendmentPreview","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionAmendmentPreviewInput"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/AmendmentPreview"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Current state or optional preview"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Amendment preview","tags":["Studio booking aftercare"]}},"/api/v2/studio-tours/{id}/quotes":{"post":{"callbacks":{},"deprecated":false,"description":"Advisory selection pricing using the Tour's current price, current addon versions, quantities and duration. Malformed or unavailable selected addons are refused. This read creates no Client, booking, hold, payment, receipt or job and makes no completeness or charge-ready assertion. Read the Tour offer for required details and consents and availability for scheduling choices; checkout still validates every current requirement. Requires sessions:read, current key/account/public_api authority and studio_tour entitlement. Pricing reads remain available when headless new entry is disabled. No Idempotency-Key is required.","operationId":"v2QuoteTour","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TourQuoteRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/TourPriceQuote"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Current advisory Tour selection price"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Read advisory Tour pricing for strictly validated selected addons","tags":["Studio native checkout"]}},"/api/v2/addon-purchases/{id}/payment/cancellation-requests":{"post":{"callbacks":{},"deprecated":false,"description":"Current key authority and stored tenant ownership apply. Customer policies differ from explicit staff actions. Acceptance freezes the target and selection; GET states actual payment, approval and fulfillment. Provider instructions are fetched separately after preparation; external money is reported by the studio.","operationId":"v2AftercareCancelAddon","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyInput"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/AftercareAcceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Cancel addon","tags":["Studio booking aftercare"]}},"/api/v2/clients/{id}/subscription-rights":{"get":{"callbacks":{},"deprecated":false,"description":"Package kind is fixed by the route. Purchased snapshots and current ledger allowance determine rights and effective session lengths. Quotes are advisory. Redemption atomically creates all sessions and required delivery intents, or writes nothing. Paid extras use the existing separate session add-on purchase flow. Current authority is checked on replay. Cancellation uses the existing subscription cancellation routes. Native provider work is deferred; management GET exposes pending, ready or failed delivery. A ready billing portal URL is disclosed only to a key with current subscriptions:manage authority; read-only keys retain state and capability visibility without the live instruction. Plan changes, pause and resume are unsupported. Paid external decline retains an actionable refund obligation without executing a refund.","operationId":"v2PackagesSubscriptionRights","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"query","name":"service_id","schema":{"format":"uuid","type":"string"}},{"in":"query","name":"member_package_id","schema":{"format":"uuid","type":"string"}},{"in":"query","name":"duration_minutes","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"per_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"addons_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"addons_per_page","schema":{"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/PackageRightsPage"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Current purchased rights or advisory quote"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Subscription rights","tags":["Studio package rights and management"]}},"/api/v2/bundle-purchases":{"post":{"callbacks":{},"deprecated":false,"description":"Email resolves the studio-owned Client and never authenticates the visitor. New purchase entry requires headless_api plus the family purchase permission, clients:read and payments:collect; clients:create is conditional on creating a Client association. GET requires payments:read plus the purchased family's read permission. Recovery requires payments:collect, clients:read and that family's read permission under current studio key/account/public_api authority; accepted recovery remains available with headless new entry disabled. Native provider, credit, promo, approval, private-offer and consent policies apply. Acceptance atomically records a frozen purchase obligation, immutable receipt and required work; no provider IO runs before commit. Instructions carry public SDK capabilities, never proof of settlement. Fetch current state for money, approval and rights separately. Unknown outcomes resume the original frozen tender identity; outcomes beyond the safe replay window require reconciliation and never create another recurring subscription. Cancellation retires unpaid capability before completing; money in flight remains undetermined. No external settlement reports, renewal, aftercare or raw status writes are accepted.","operationId":"v2PurchaseBundle","parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BundlePurchaseRequest"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/Acceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable command acceptance; fetch purchase current state"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Native payment or offer requires reconciliation"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Accept a native bundle purchase by studio-owned client email","tags":["Studio native purchases"]}},"/api/v2/bookings/{id}/cancellations/quotes":{"post":{"callbacks":{},"deprecated":false,"description":"Current key authority and stored tenant ownership apply. Customer policies differ from explicit staff actions. Acceptance freezes the target and selection; GET states actual payment, approval and fulfillment. Provider instructions are fetched separately after preparation; external money is reported by the studio.","operationId":"v2AftercareCancellationPreview","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingCancellationInput"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/CancellationPreview"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Current state or optional preview"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Cancellation preview","tags":["Studio booking aftercare"]}},"/api/v2/sessions/{id}/addon-purchases":{"post":{"callbacks":{},"deprecated":false,"description":"Current key authority and stored tenant ownership apply. Customer policies differ from explicit staff actions. Acceptance freezes the target and selection; GET states actual payment, approval and fulfillment. Provider instructions are fetched separately after preparation; external money is reported by the studio.","operationId":"v2AftercareCreateAddon","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddonPurchaseInput"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/AftercareAcceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Create addon","tags":["Studio booking aftercare"]}},"/api/v2/purchases/{id}/payment/retries":{"post":{"callbacks":{},"deprecated":false,"description":"Email resolves the studio-owned Client and never authenticates the visitor. New purchase entry requires headless_api plus the family purchase permission, clients:read and payments:collect; clients:create is conditional on creating a Client association. GET requires payments:read plus the purchased family's read permission. Recovery requires payments:collect, clients:read and that family's read permission under current studio key/account/public_api authority; accepted recovery remains available with headless new entry disabled. Native provider, credit, promo, approval, private-offer and consent policies apply. Acceptance atomically records a frozen purchase obligation, immutable receipt and required work; no provider IO runs before commit. Instructions carry public SDK capabilities, never proof of settlement. Fetch current state for money, approval and rights separately. Unknown outcomes resume the original frozen tender identity; outcomes beyond the safe replay window require reconciliation and never create another recurring subscription. Cancellation retires unpaid capability before completing; money in flight remains undetermined. No external settlement reports, renewal, aftercare or raw status writes are accepted.","operationId":"v2RetryPurchase","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutEmptyRequest"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/Acceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable command acceptance; fetch purchase current state"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Native payment or offer requires reconciliation"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Recover the same purchase or retry a definitively failed native attempt","tags":["Studio native purchases"]}},"/api/v2/bundle-plans/{id}/private-offer":{"patch":{"callbacks":{},"deprecated":false,"description":"Packages owns JSON normalization, scoped references, computed prices, version snapshots and lifecycle. Public authoring permits repairable drafts and never grants. Omitted options/addons preserve; [] clears. Authoring scope=private/all also requires clients:read. view=offers uses current public purchasability and excludes private plans; images and terms are available for display. options_page/options_per_page and addons_page/addons_per_page independently bound nested collections. Private commands require clients:read. Direct grants separately require grant. Subscription sales require resend_payment_link; bundle sales use create/update authority. Explicit bundle payment-link saves use the shared default validity window when omitted, including private edits; resends preserve the stored deadline. Bundle grants remain open-ended; subscription private deadlines and targets are immutable. Archive deactivates without changing prior purchases. UUID Idempotency-Key required; replay checks current authority and returns immutable acceptance only. GET reads current state.","operationId":"v2UpdatePrivateOfferBundlePlan","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BundlePlanPrivateOfferRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandResponse"}}},"description":"Immutable resource acceptance"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Current offer state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"UpdatePrivateOffer bundle-plans","tags":["Studio package offers"]}},"/api/v2/amendments/{id}/payment/confirmations":{"post":{"callbacks":{},"deprecated":false,"description":"Current key authority and stored tenant ownership apply. Customer policies differ from explicit staff actions. Acceptance freezes the target and selection; GET states actual payment, approval and fulfillment. Provider instructions are fetched separately after preparation; external money is reported by the studio.","operationId":"v2AftercareConfirmAmendment","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyInput"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/AftercareAcceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Confirm amendment","tags":["Studio booking aftercare"]}},"/api/v2/checkouts/{id}/payment/confirmations":{"post":{"callbacks":{},"deprecated":false,"description":"Studio-owned native checkout. Current key/account/public_api authority and tenant ownership apply on reads, writes and receipt replay. A permitted replacement studio key may recover a known checkout. Accepted obligations remain recoverable when headless new entry is disabled. Instructions are browser capabilities, never proof of settlement. Confirmation verifies the native provider. An uncertain provider outcome retains its frozen request identity; do not create another tender. Token payloads are never in receipts or job arguments.","operationId":"v2ConfirmCheckout","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutEmptyRequest"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/Acceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance; fetch the checkout for current money, approval and fulfillment"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Request native provider verification of an owned checkout","tags":["Studio native checkout"]}},"/api/v2/bundle-plans":{"get":{"callbacks":{},"deprecated":false,"description":"Packages owns JSON normalization, scoped references, computed prices, version snapshots and lifecycle. Public authoring permits repairable drafts and never grants. Omitted options/addons preserve; [] clears. Authoring scope=private/all also requires clients:read. view=offers uses current public purchasability and excludes private plans; images and terms are available for display. options_page/options_per_page and addons_page/addons_per_page independently bound nested collections. Private commands require clients:read. Direct grants separately require grant. Subscription sales require resend_payment_link; bundle sales use create/update authority. Explicit bundle payment-link saves use the shared default validity window when omitted, including private edits; resends preserve the stored deadline. Bundle grants remain open-ended; subscription private deadlines and targets are immutable. Archive deactivates without changing prior purchases. UUID Idempotency-Key required; replay checks current authority and returns immutable acceptance only. GET reads current state.","operationId":"v2ListBundlePlan","parameters":[{"in":"query","name":"page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"per_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"included_items_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"included_items_per_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"options_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"options_per_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"addons_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"addons_per_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"view","schema":{"default":"authoring","enum":["authoring","offers"],"type":"string"}},{"in":"query","name":"scope","schema":{"default":"public","enum":["public","private","all"],"type":"string"}},{"in":"query","name":"include_inactive","schema":{"type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"additionalProperties":false,"properties":{"entries":{"items":{"anyOf":[{"$ref":"#/components/schemas/BundlePlanAuthoring"},{"$ref":"#/components/schemas/BundlePlanOffer"}]},"type":"array"},"page":{"type":"integer"},"per_page":{"type":"integer"},"total":{"type":"integer"}},"required":["entries","page","per_page","total"],"type":"object"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Bounded authoring or consumer offer page"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Current offer state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"List bundle-plans","tags":["Studio package offers"]},"post":{"callbacks":{},"deprecated":false,"description":"Packages owns JSON normalization, scoped references, computed prices, version snapshots and lifecycle. Public authoring permits repairable drafts and never grants. Omitted options/addons preserve; [] clears. Authoring scope=private/all also requires clients:read. view=offers uses current public purchasability and excludes private plans; images and terms are available for display. options_page/options_per_page and addons_page/addons_per_page independently bound nested collections. Private commands require clients:read. Direct grants separately require grant. Subscription sales require resend_payment_link; bundle sales use create/update authority. Explicit bundle payment-link saves use the shared default validity window when omitted, including private edits; resends preserve the stored deadline. Bundle grants remain open-ended; subscription private deadlines and targets are immutable. Archive deactivates without changing prior purchases. UUID Idempotency-Key required; replay checks current authority and returns immutable acceptance only. GET reads current state.","operationId":"v2CreateBundlePlan","parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BundlePlanCreateRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandResponse"}}},"description":"Immutable resource acceptance"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Current offer state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Create bundle-plans","tags":["Studio package offers"]}},"/api/v2/purchases/{id}/payment/confirmations":{"post":{"callbacks":{},"deprecated":false,"description":"Email resolves the studio-owned Client and never authenticates the visitor. New purchase entry requires headless_api plus the family purchase permission, clients:read and payments:collect; clients:create is conditional on creating a Client association. GET requires payments:read plus the purchased family's read permission. Recovery requires payments:collect, clients:read and that family's read permission under current studio key/account/public_api authority; accepted recovery remains available with headless new entry disabled. Native provider, credit, promo, approval, private-offer and consent policies apply. Acceptance atomically records a frozen purchase obligation, immutable receipt and required work; no provider IO runs before commit. Instructions carry public SDK capabilities, never proof of settlement. Fetch current state for money, approval and rights separately. Unknown outcomes resume the original frozen tender identity; outcomes beyond the safe replay window require reconciliation and never create another recurring subscription. Cancellation retires unpaid capability before completing; money in flight remains undetermined. No external settlement reports, renewal, aftercare or raw status writes are accepted.","operationId":"v2ConfirmPurchase","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutEmptyRequest"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/Acceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable command acceptance; fetch purchase current state"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Native payment or offer requires reconciliation"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Request native provider confirmation","tags":["Studio native purchases"]}},"/api/v2/subscriptions/{id}/declines":{"post":{"callbacks":{},"deprecated":false,"description":"Package kind is fixed by the route. Purchased snapshots and current ledger allowance determine rights and effective session lengths. Quotes are advisory. Redemption atomically creates all sessions and required delivery intents, or writes nothing. Paid extras use the existing separate session add-on purchase flow. Current authority is checked on replay. Cancellation uses the existing subscription cancellation routes. Native provider work is deferred; management GET exposes pending, ready or failed delivery. A ready billing portal URL is disclosed only to a key with current subscriptions:manage authority; read-only keys retain state and capability visibility without the live instruction. Plan changes, pause and resume are unsupported. Paid external decline retains an actionable refund obligation without executing a refund.","operationId":"v2PackagesDeclineSubscription","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyInput"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/PackageAcceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance; fetch current state separately"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Decline subscription","tags":["Studio package rights and management"]}},"/api/v2/subscription-cycles/{id}":{"get":{"callbacks":{},"deprecated":false,"description":"The studio key owns the tenant. Cycle UUID, financial collection UUID, delivery Idempotency-Key and monthly grant period are distinct. The predecessor must be the subscription's committed local cycle; dates and recurring amount come from the purchased snapshot. Paid outcomes use actual aggregate external coverage and shared fulfillment. Partial coverage grants nothing; approval remains separate. Failed renewal marks overdue; recovery extends that same term once. Cancellation/nonrenewal and terminal access remain authoritative: collected money stays recorded with an action instead of resurrecting rights. POST requires subscriptions:report_external_cycle plus payments:report_external under current account/key authority; GET requires subscriptions:read plus payments:read. New cycles require headless entry and external writer readiness; accepted cycle recovery survives commercial disable. Native provider subscription IDs cannot be reported here.","operationId":"v2GetExternalSubscriptionCycle","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/ExternalSubscriptionCycle"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Current authorized cycle and actual collection/application"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Read a local external subscription term cycle","tags":["Studio external subscriptions"]}},"/api/v2/checkouts/{id}/payment/retries":{"post":{"callbacks":{},"deprecated":false,"description":"Studio-owned native checkout. Current key/account/public_api authority and tenant ownership apply on reads, writes and receipt replay. A permitted replacement studio key may recover a known checkout. Accepted obligations remain recoverable when headless new entry is disabled. Instructions are browser capabilities, never proof of settlement. Confirmation verifies the native provider. An uncertain provider outcome retains its frozen request identity; do not create another tender. Token payloads are never in receipts or job arguments.","operationId":"v2RetryCheckout","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutEmptyRequest"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/Acceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance; fetch the checkout for current money, approval and fulfillment"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Resume the existing checkout and its frozen provider identity","tags":["Studio native checkout"]}},"/api/v2/bundle-purchases/quotes":{"post":{"callbacks":{},"deprecated":false,"description":"Read-only POST: incomplete selections return status=incomplete and missing_inputs, with current CMS-configured forms, guest limit, recording seats, invoice fields, rail-specific displayed consent documents and paginated file-transfer choices. No client, booking, hold, payment or receipt is created. Prices, tax, promo eligibility and credits are resolved by Podyx; amounts or provider IDs in input are refused. A fingerprint identifies advisory facts, never a price lock or permission to charge. Complete means required selections, details, invoice fields and consent acceptance are supplied; later commands must revalidate. client_id means a currently owned studio Client, requires clients:read in addition to the family read permission, and is never visitor login. Omit it for anonymous preview; email is not accepted here. Existing public_api/account/current-key authority remains required, including after reads. Disabling headless new entry preserves authorized quote reads. Booking sessions are explicit and multi-session; Studio Tour has its own published quote and booking operations. Subscription quotes additionally accept payment_source=native|external, default native: external previews studio collection independently of native provider cadence restrictions; actual studio approval still applies and no collection is reported. Other quote families do not accept payment_source. Bundle/subscription never ask for refund policy; tour consent remains terms only. page/per_page page file-transfer choices only, using the existing 1..100 bounds.","operationId":"v2BundleQuote","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BundleQuoteRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/CustomerQuote"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Advisory complete or incomplete quote; no hold"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"additionalProperties":true,"properties":{"code":{"description":"Stable machine-readable error code; clients must tolerate new codes.","type":"string"},"errors":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"description":"Field validation messages when code is validation_failed.","type":"object"},"feature":{"description":"Required studio entitlement when code is feature_disabled; clients must tolerate new features.","type":"string"},"permissions":{"description":"Required permissions when code is permission_required.","items":{"$ref":"#/components/schemas/ApiPermission"},"type":"array"},"request_id":{"description":"Request correlation identifier.","type":"string"},"setup_choices":{"description":"Eligible destination setups when code is setup_selection_required.","items":{"additionalProperties":false,"properties":{"id":{"format":"uuid","type":"string"},"name":{"nullable":true,"type":"string"},"room_name":{"nullable":true,"type":"string"}},"required":["id","name","room_name"],"type":"object"},"type":"array"},"status":{"description":"HTTP response status.","type":"integer"},"title":{"type":"string"}},"required":["status","code","title","request_id"],"title":"ApiErrorResponse","type":"object"}}},"description":"Current selection is unavailable or no longer offered"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Preview current customer bundle selections and checkout requirements","tags":["Studio customer quotes"]}},"/api/v2/checkouts/{id}/payment/cancellation-requests":{"post":{"callbacks":{},"deprecated":false,"description":"Studio-owned native checkout. Current key/account/public_api authority and tenant ownership apply on reads, writes and receipt replay. A permitted replacement studio key may recover a known checkout. Accepted obligations remain recoverable when headless new entry is disabled. Instructions are browser capabilities, never proof of settlement. Confirmation verifies the native provider. An uncertain provider outcome retains its frozen request identity; do not create another tender. Token payloads are never in receipts or job arguments.","operationId":"v2CancelCheckout","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutEmptyRequest"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/Acceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance; fetch the checkout for current money, approval and fulfillment"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Withdraw an unpaid customer checkout and retire its payment capability","tags":["Studio native checkout"]}},"/api/v2/clients/{id}/subscription-redemptions/quotes":{"post":{"callbacks":{},"deprecated":false,"description":"Package kind is fixed by the route. Purchased snapshots and current ledger allowance determine rights and effective session lengths. Quotes are advisory. Redemption atomically creates all sessions and required delivery intents, or writes nothing. Paid extras use the existing separate session add-on purchase flow. Current authority is checked on replay. Cancellation uses the existing subscription cancellation routes. Native provider work is deferred; management GET exposes pending, ready or failed delivery. A ready billing portal URL is disclosed only to a key with current subscriptions:manage authority; read-only keys retain state and capability visibility without the live instruction. Plan changes, pause and resume are unsupported. Paid external decline retains an actionable refund obligation without executing a refund.","operationId":"v2PackagesSubscriptionQuote","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackageQuoteInput"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/PackageQuote"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Current purchased rights or advisory quote"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Subscription quote","tags":["Studio package rights and management"]}},"/api/v2/setups/{id}/archival":{"delete":{"callbacks":{},"deprecated":false,"description":"Catalog owns JSON normalization, versioning, links, configured prices and lifecycle. Authoring includes drafts; view=offers reuses customer buyability. Configured prices are independently paginated with prices_page/prices_per_page and refer to current service versions. Amounts are configured catalog rates, not a dated customer quote. Omitted links/override sections preserve; [] clears the submitted collection. Archive deactivates; restore reactivates and enforces existing room allowances. Mutations require a UUID Idempotency-Key and current primary/linked-resource authority, including receipt replay.","operationId":"v2RestoreSetup","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{},"type":"object"}}},"required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandResponse"}}},"description":"Immutable resource acceptance; GET for current version"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Restore catalog setups","tags":["Studio catalog"]},"put":{"callbacks":{},"deprecated":false,"description":"Catalog owns JSON normalization, versioning, links, configured prices and lifecycle. Authoring includes drafts; view=offers reuses customer buyability. Configured prices are independently paginated with prices_page/prices_per_page and refer to current service versions. Amounts are configured catalog rates, not a dated customer quote. Omitted links/override sections preserve; [] clears the submitted collection. Archive deactivates; restore reactivates and enforces existing room allowances. Mutations require a UUID Idempotency-Key and current primary/linked-resource authority, including receipt replay.","operationId":"v2ArchiveSetup","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{},"type":"object"}}},"required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandResponse"}}},"description":"Immutable resource acceptance; GET for current version"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Archive catalog setups","tags":["Studio catalog"]}},"/api/v2/bookings/{id}/cancellations":{"post":{"callbacks":{},"deprecated":false,"description":"Acceptance is an immutable delivery receipt. A refund request reserves a real outstanding obligation; only a studio report of actual success counts returned money. Studio refund UUIDs are independent from HTTP keys. Replacements explicitly name a failed or reversed attempt in the identical frozen scope and share its obligation. GET exposes current money and cancellation state. Recovery requires current key, tenant and owning-resource authority even after new commercial entry is disabled. Provider IDs are never accepted or manufactured.","operationId":"v2CancelBooking","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingCancellationInput"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/ExternalRecoveryAcceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance or current actual recovery state"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Cancel booking","tags":["Studio external recovery"]}},"/api/v2/bundle-plans/private-offers":{"post":{"callbacks":{},"deprecated":false,"description":"Packages owns JSON normalization, scoped references, computed prices, version snapshots and lifecycle. Public authoring permits repairable drafts and never grants. Omitted options/addons preserve; [] clears. Authoring scope=private/all also requires clients:read. view=offers uses current public purchasability and excludes private plans; images and terms are available for display. options_page/options_per_page and addons_page/addons_per_page independently bound nested collections. Private commands require clients:read. Direct grants separately require grant. Subscription sales require resend_payment_link; bundle sales use create/update authority. Explicit bundle payment-link saves use the shared default validity window when omitted, including private edits; resends preserve the stored deadline. Bundle grants remain open-ended; subscription private deadlines and targets are immutable. Archive deactivates without changing prior purchases. UUID Idempotency-Key required; replay checks current authority and returns immutable acceptance only. GET reads current state.","operationId":"v2CreatePrivateOfferBundlePlan","parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BundlePlanPrivateOfferRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandResponse"}}},"description":"Immutable resource acceptance"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Current offer state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"CreatePrivateOffer bundle-plans","tags":["Studio package offers"]}},"/api/v2/subscription-purchases/quotes":{"post":{"callbacks":{},"deprecated":false,"description":"Read-only POST: incomplete selections return status=incomplete and missing_inputs, with current CMS-configured forms, guest limit, recording seats, invoice fields, rail-specific displayed consent documents and paginated file-transfer choices. No client, booking, hold, payment or receipt is created. Prices, tax, promo eligibility and credits are resolved by Podyx; amounts or provider IDs in input are refused. A fingerprint identifies advisory facts, never a price lock or permission to charge. Complete means required selections, details, invoice fields and consent acceptance are supplied; later commands must revalidate. client_id means a currently owned studio Client, requires clients:read in addition to the family read permission, and is never visitor login. Omit it for anonymous preview; email is not accepted here. Existing public_api/account/current-key authority remains required, including after reads. Disabling headless new entry preserves authorized quote reads. Booking sessions are explicit and multi-session; Studio Tour has its own published quote and booking operations. Subscription quotes additionally accept payment_source=native|external, default native: external previews studio collection independently of native provider cadence restrictions; actual studio approval still applies and no collection is reported. Other quote families do not accept payment_source. Bundle/subscription never ask for refund policy; tour consent remains terms only. page/per_page page file-transfer choices only, using the existing 1..100 bounds.","operationId":"v2SubscriptionQuote","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionQuoteRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/CustomerQuote"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Advisory complete or incomplete quote; no hold"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"additionalProperties":true,"properties":{"code":{"description":"Stable machine-readable error code; clients must tolerate new codes.","type":"string"},"errors":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"description":"Field validation messages when code is validation_failed.","type":"object"},"feature":{"description":"Required studio entitlement when code is feature_disabled; clients must tolerate new features.","type":"string"},"permissions":{"description":"Required permissions when code is permission_required.","items":{"$ref":"#/components/schemas/ApiPermission"},"type":"array"},"request_id":{"description":"Request correlation identifier.","type":"string"},"setup_choices":{"description":"Eligible destination setups when code is setup_selection_required.","items":{"additionalProperties":false,"properties":{"id":{"format":"uuid","type":"string"},"name":{"nullable":true,"type":"string"},"room_name":{"nullable":true,"type":"string"}},"required":["id","name","room_name"],"type":"object"},"type":"array"},"status":{"description":"HTTP response status.","type":"integer"},"title":{"type":"string"}},"required":["status","code","title","request_id"],"title":"ApiErrorResponse","type":"object"}}},"description":"Current selection is unavailable or no longer offered"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Preview current customer subscription selections and checkout requirements","tags":["Studio customer quotes"]}},"/api/v2/checkouts/{id}":{"get":{"callbacks":{},"deprecated":false,"description":"Studio-owned native checkout. Current key/account/public_api authority and tenant ownership apply on reads, writes and receipt replay. A permitted replacement studio key may recover a known checkout. Accepted obligations remain recoverable when headless new entry is disabled. Instructions are browser capabilities, never proof of settlement. Confirmation verifies the native provider. An uncertain provider outcome retains its frozen request identity; do not create another tender. Token payloads are never in receipts or job arguments.","operationId":"v2GetCheckout","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/Checkout"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Current authorized studio resource"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Read current checkout instruction, money, booking approval and fulfillment","tags":["Studio native checkout"]}},"/api/v2/clients/{id}/bundle-rights":{"get":{"callbacks":{},"deprecated":false,"description":"Package kind is fixed by the route. Purchased snapshots and current ledger allowance determine rights and effective session lengths. Quotes are advisory. Redemption atomically creates all sessions and required delivery intents, or writes nothing. Paid extras use the existing separate session add-on purchase flow. Current authority is checked on replay. Cancellation uses the existing subscription cancellation routes. Native provider work is deferred; management GET exposes pending, ready or failed delivery. A ready billing portal URL is disclosed only to a key with current subscriptions:manage authority; read-only keys retain state and capability visibility without the live instruction. Plan changes, pause and resume are unsupported. Paid external decline retains an actionable refund obligation without executing a refund.","operationId":"v2PackagesBundleRights","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"query","name":"service_id","schema":{"format":"uuid","type":"string"}},{"in":"query","name":"member_package_id","schema":{"format":"uuid","type":"string"}},{"in":"query","name":"duration_minutes","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"per_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"addons_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"addons_per_page","schema":{"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/PackageRightsPage"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Current purchased rights or advisory quote"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Bundle rights","tags":["Studio package rights and management"]}},"/api/v2/setups/{id}":{"get":{"callbacks":{},"deprecated":false,"description":"Catalog owns JSON normalization, versioning, links, configured prices and lifecycle. Authoring includes drafts; view=offers reuses customer buyability. Configured prices are independently paginated with prices_page/prices_per_page and refer to current service versions. Amounts are configured catalog rates, not a dated customer quote. Omitted links/override sections preserve; [] clears the submitted collection. Archive deactivates; restore reactivates and enforces existing room allowances. Mutations require a UUID Idempotency-Key and current primary/linked-resource authority, including receipt replay.","operationId":"v2GetSetup","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"query","name":"prices_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"prices_per_page","schema":{"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/SetupAuthoring"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Current authorized authoring record, including inactive drafts"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Get catalog setups","tags":["Studio catalog"]},"patch":{"callbacks":{},"deprecated":false,"description":"Catalog owns JSON normalization, versioning, links, configured prices and lifecycle. Authoring includes drafts; view=offers reuses customer buyability. Configured prices are independently paginated with prices_page/prices_per_page and refer to current service versions. Amounts are configured catalog rates, not a dated customer quote. Omitted links/override sections preserve; [] clears the submitted collection. Archive deactivates; restore reactivates and enforces existing room allowances. Mutations require a UUID Idempotency-Key and current primary/linked-resource authority, including receipt replay.","operationId":"v2UpdateSetup","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupUpdateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandResponse"}}},"description":"Immutable resource acceptance; GET for current version"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Update catalog setups","tags":["Studio catalog"]}},"/api/v2/sessions/{id}/staff-reschedules":{"post":{"callbacks":{},"deprecated":false,"description":"Current key authority and stored tenant ownership apply. Customer policies differ from explicit staff actions. Acceptance freezes the target and selection; GET states actual payment, approval and fulfillment. Provider instructions are fetched separately after preparation; external money is reported by the studio. Moves retain the sold duration. The setup_id selection applies to studio-tour sessions only; ordinary sessions retain their booked setup. To change an ordinary session's setup, preview /sessions/{id}/amendments/quotes, then accept /sessions/{id}/amendments with the returned version and required financial choices.","operationId":"v2AftercareStaffReschedule","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StaffMoveInput"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/AftercareAcceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Staff reschedule","tags":["Studio booking aftercare"]}},"/api/v2/amendments/{id}/payment/retries":{"post":{"callbacks":{},"deprecated":false,"description":"Current key authority and stored tenant ownership apply. Customer policies differ from explicit staff actions. Acceptance freezes the target and selection; GET states actual payment, approval and fulfillment. Provider instructions are fetched separately after preparation; external money is reported by the studio.","operationId":"v2AftercareRetryAmendment","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyInput"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/AftercareAcceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Retry amendment","tags":["Studio booking aftercare"]}},"/api/v2/subscriptions/{id}/cancellation":{"get":{"callbacks":{},"deprecated":false,"description":"Acceptance is an immutable delivery receipt. A refund request reserves a real outstanding obligation; only a studio report of actual success counts returned money. Studio refund UUIDs are independent from HTTP keys. Replacements explicitly name a failed or reversed attempt in the identical frozen scope and share its obligation. GET exposes current money and cancellation state. Recovery requires current key, tenant and owning-resource authority even after new commercial entry is disabled. Provider IDs are never accepted or manufactured.","operationId":"v2GetSubscriptionCancellation","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/SubscriptionCancellation"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance or current actual recovery state"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Get subscription cancellation","tags":["Studio external recovery"]}},"/api/v2/addons/{id}/archival":{"delete":{"callbacks":{},"deprecated":false,"description":"Catalog owns JSON normalization, versioning, links, configured prices and lifecycle. Authoring includes drafts; view=offers reuses customer buyability. Configured prices are independently paginated with prices_page/prices_per_page and refer to current service versions. Amounts are configured catalog rates, not a dated customer quote. Omitted links/override sections preserve; [] clears the submitted collection. Archive deactivates; restore reactivates and enforces existing room allowances. Mutations require a UUID Idempotency-Key and current primary/linked-resource authority, including receipt replay.","operationId":"v2RestoreAddon","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{},"type":"object"}}},"required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandResponse"}}},"description":"Immutable resource acceptance; GET for current version"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Restore catalog addons","tags":["Studio catalog"]},"put":{"callbacks":{},"deprecated":false,"description":"Catalog owns JSON normalization, versioning, links, configured prices and lifecycle. Authoring includes drafts; view=offers reuses customer buyability. Configured prices are independently paginated with prices_page/prices_per_page and refer to current service versions. Amounts are configured catalog rates, not a dated customer quote. Omitted links/override sections preserve; [] clears the submitted collection. Archive deactivates; restore reactivates and enforces existing room allowances. Mutations require a UUID Idempotency-Key and current primary/linked-resource authority, including receipt replay.","operationId":"v2ArchiveAddon","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{},"type":"object"}}},"required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandResponse"}}},"description":"Immutable resource acceptance; GET for current version"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Archive catalog addons","tags":["Studio catalog"]}},"/api/v2/addon-purchases/{id}/payment/retries":{"post":{"callbacks":{},"deprecated":false,"description":"Current key authority and stored tenant ownership apply. Customer policies differ from explicit staff actions. Acceptance freezes the target and selection; GET states actual payment, approval and fulfillment. Provider instructions are fetched separately after preparation; external money is reported by the studio.","operationId":"v2AftercareRetryAddon","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyInput"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/AftercareAcceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Retry addon","tags":["Studio booking aftercare"]}},"/api/v2/amendments/{id}/payment/tokens":{"post":{"callbacks":{},"deprecated":false,"description":"Current key authority and stored tenant ownership apply. Customer policies differ from explicit staff actions. Acceptance freezes the target and selection; GET states actual payment, approval and fulfillment. Provider instructions are fetched separately after preparation; external money is reported by the studio.","operationId":"v2AftercareSubmitAmendment","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SquareTokenRequest"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/AftercareAcceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Submit amendment","tags":["Studio booking aftercare"]}},"/api/v2/external-payment-reports":{"post":{"callbacks":{},"deprecated":false,"description":"A studio collection UUID belongs to the tenant independently of each key-bound HTTP receipt. Report only studio-collected money; native Stripe/Square/cash tenders cannot be externally settled. No provider integration or provider proof is required. Inline complete booking selections use current customer policy. Booking refusal retains collected money and an action obligation; it never claims a refund happened. Same immutable collection facts are a financial no-op across keys; repair is a separate resolution command. GET separates original immutable acceptance from current coverage/action state. New commercial entry is deployment-disabled until external recovery/projection readiness; current authority and owned recovery remain required after disablement.","operationId":"v2ReportExternalPayment","parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExternalPaymentReportRequest"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/Acceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance or current studio-owned external state"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Report external payment","tags":["Studio external payments"]}},"/api/v2/sessions/{id}/guests/{guest_id}":{"delete":{"callbacks":{},"deprecated":false,"description":"Current key authority and stored tenant ownership apply. Customer policies differ from explicit staff actions. Acceptance freezes the target and selection; GET states actual payment, approval and fulfillment. Provider instructions are fetched separately after preparation; external money is reported by the studio.","operationId":"v2AftercareRemoveGuest","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"path","name":"guest_id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/AftercareAcceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Remove guest","tags":["Studio booking aftercare"]},"patch":{"callbacks":{},"deprecated":false,"description":"Current key authority and stored tenant ownership apply. Customer policies differ from explicit staff actions. Acceptance freezes the target and selection; GET states actual payment, approval and fulfillment. Provider instructions are fetched separately after preparation; external money is reported by the studio.","operationId":"v2AftercareUpdateGuest","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"path","name":"guest_id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuestUpdateInput"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/AftercareAcceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Update guest","tags":["Studio booking aftercare"]}},"/api/v2/subscriptions/{id}/approvals":{"post":{"callbacks":{},"deprecated":false,"description":"Package kind is fixed by the route. Purchased snapshots and current ledger allowance determine rights and effective session lengths. Quotes are advisory. Redemption atomically creates all sessions and required delivery intents, or writes nothing. Paid extras use the existing separate session add-on purchase flow. Current authority is checked on replay. Cancellation uses the existing subscription cancellation routes. Native provider work is deferred; management GET exposes pending, ready or failed delivery. A ready billing portal URL is disclosed only to a key with current subscriptions:manage authority; read-only keys retain state and capability visibility without the live instruction. Plan changes, pause and resume are unsupported. Paid external decline retains an actionable refund obligation without executing a refund.","operationId":"v2PackagesApproveSubscription","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyInput"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/PackageAcceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance; fetch current state separately"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Approve subscription","tags":["Studio package rights and management"]}},"/api/v2/clients/{id}/bundle-redemptions":{"post":{"callbacks":{},"deprecated":false,"description":"Package kind is fixed by the route. Purchased snapshots and current ledger allowance determine rights and effective session lengths. Quotes are advisory. Redemption atomically creates all sessions and required delivery intents, or writes nothing. Paid extras use the existing separate session add-on purchase flow. Current authority is checked on replay. Cancellation uses the existing subscription cancellation routes. Native provider work is deferred; management GET exposes pending, ready or failed delivery. A ready billing portal URL is disclosed only to a key with current subscriptions:manage authority; read-only keys retain state and capability visibility without the live instruction. Plan changes, pause and resume are unsupported. Paid external decline retains an actionable refund obligation without executing a refund.","operationId":"v2PackagesRedeemBundle","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackageRedemptionInput"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/PackageAcceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance; fetch current state separately"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Redeem bundle","tags":["Studio package rights and management"]}},"/api/v2/studio-tours/{id}/availability":{"get":{"callbacks":{},"deprecated":false,"description":"Studio-owned native checkout. Current key/account/public_api authority and tenant ownership apply on reads, writes and receipt replay. A permitted replacement studio key may recover a known checkout. Accepted obligations remain recoverable when headless new entry is disabled. Instructions are browser capabilities, never proof of settlement. Confirmation verifies the native provider. An uncertain provider outcome retains its frozen request identity; do not create another tender. Token payloads are never in receipts or job arguments.","operationId":"v2GetTourAvailability","parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"query","name":"date","required":true,"schema":{"format":"date","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/TourAvailability"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Current authorized studio resource"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Read native setup-bound or roomless studio-wide tour start times","tags":["Studio native checkout"]}},"/api/v2/external-checkouts":{"post":{"callbacks":{},"deprecated":false,"description":"A studio collection UUID belongs to the tenant independently of each key-bound HTTP receipt. Report only studio-collected money; native Stripe/Square/cash tenders cannot be externally settled. No provider integration or provider proof is required. Inline complete booking selections use current customer policy. Booking refusal retains collected money and an action obligation; it never claims a refund happened. Same immutable collection facts are a financial no-op across keys; repair is a separate resolution command. GET separates original immutable acceptance from current coverage/action state. New commercial entry is deployment-disabled until external recovery/projection readiness; current authority and owned recovery remain required after disablement.","operationId":"v2CreateExternalCheckout","parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingCheckoutRequest"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/Acceptance"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Immutable acceptance or current studio-owned external state"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Current resource state or idempotency conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Create external checkout","tags":["Studio external payments"]}},"/api/v2/rooms/availability":{"get":{"callbacks":{},"deprecated":false,"description":"Omit duration_minutes for physical room windows without a guessed setup/duration. Supply a positive duration for starts, with distinct concrete setup variants when setup_id is absent. Select date or paired date_from/date_to; at most 31 inclusive studio-local days. page/per_page SQL-page rooms (windows) or setups (starts); intervals_page/intervals_per_page independently page each target/day's derived intervals, with truthful totals. Duration uses nominal local wall minutes; gap starts are unavailable and overlap starts choose the earlier occurrence. A nominal end in a DST gap remains a native wall-time candidate with ends_at=null, end_status=gap_time and unverified calendar status; no resolved-end guarantee exists for it. Physical window gap boundaries resolve to valid matching local/UTC endpoints; midnight ends are next-day exclusive. verified means no unresolved configured guard, including no configured integration/room mapping or disabled guard; it does not claim Google was polled. checked_at is advisory and no hold is created; writes must recheck availability. Current public_api/account/key/availability:read authority is required; disabling headless new entry preserves authorized reads.","operationId":"v2CustomerAvailability","parameters":[{"in":"query","name":"date","schema":{"format":"date","type":"string"}},{"in":"query","name":"date_from","schema":{"format":"date","type":"string"}},{"in":"query","name":"date_to","schema":{"format":"date","type":"string"}},{"in":"query","name":"room_id","schema":{"format":"uuid","type":"string"}},{"in":"query","name":"setup_id","schema":{"format":"uuid","type":"string"}},{"in":"query","name":"duration_minutes","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"per_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"intervals_page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"intervals_per_page","schema":{"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"data":{"$ref":"#/components/schemas/CustomerAvailability"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"}}},"description":"Paged customer availability targets and interval pages"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Missing, invalid, or revoked API key","headers":{"WWW-Authenticate":{"description":"The Bearer authentication challenge.","required":true,"schema":{"example":"Bearer realm=\"api/v1\"","type":"string"},"style":"simple"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Inactive studio account, disabled public API, or required permission"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Resource not found or inaccessible"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Field validation failed"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Internal error"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}},"description":"Infrastructure temporarily unavailable","headers":{"Retry-After":{"description":"Seconds to wait before retrying the request.","required":true,"schema":{"minimum":1,"type":"integer"},"style":"simple"}}}},"security":[{"ApiKeyAuth":[]}],"summary":"Browse customer room windows or concrete setup starts","tags":["Studio availability"]}}},"security":[],"servers":[{"url":"https://app.podyx.com","variables":{}}],"tags":[]}