{"info":{"description":"Backend-owned AspectAvy API reference with same-origin browser testing and web implementation guidance.","title":"AspectAvy API","version":"1.0.0"},"openapi":"3.1.0","paths":{"/api/admin/session":{"get":{"description":"Returns the current operator identity and session metadata when the browser already holds a valid operator session cookie.","operationId":"get_api_admin_session","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"operator":{"type":"object","properties":{"displayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"emailNormalized":{"type":"string"},"id":{"type":"string"},"mustRotatePassword":{"type":"boolean"},"scopes":{"type":"array","items":{"type":"string"}},"status":{"type":"string","enum":["active","disabled"]}},"required":["displayName","emailNormalized","id","mustRotatePassword","scopes","status"],"additionalProperties":false},"session":{"type":"object","properties":{"expiresAt":{"type":"string"},"id":{"type":"string"},"sessionKind":{"type":"string","enum":["cli","portal"]}},"required":["expiresAt","sessionKind"],"additionalProperties":false}},"required":["operator","session"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"Check operator session","tags":["Admin & Operators"]}},"/api/admin/operators":{"post":{"description":"Creates a new operator account, provisions scopes, and returns TOTP enrollment material plus recovery codes.","operationId":"post_api_admin_operators","parameters":[],"requestBody":{"content":{"application/json":{"example":{"bundle":"support_admin","displayName":"Support Lead","email":"support@example.com","justification":"Provisioning the first support operator.","password":"support-password-123","scopes":[]},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"bundle":{"default":null,"anyOf":[{"type":"string","enum":["ops_admin","support_admin","support_basic","super_admin"]},{"type":"null"}]},"displayName":{"default":null,"anyOf":[{"type":"string","maxLength":120},{"type":"null"}]},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"justification":{"default":null,"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}]},"password":{"type":"string","minLength":12,"maxLength":256},"scopes":{"maxItems":64,"type":"array","items":{"type":"string","minLength":1}}},"required":["bundle","displayName","email","justification","password"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"operator":{"type":"object","properties":{"displayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"emailNormalized":{"type":"string"},"id":{"type":"string"},"mustRotatePassword":{"type":"boolean"},"scopes":{"type":"array","items":{"type":"string"}},"status":{"type":"string","enum":["active","disabled"]}},"required":["displayName","emailNormalized","id","mustRotatePassword","scopes","status"],"additionalProperties":false},"recoveryCodes":{"type":"array","items":{"type":"string"}},"totp":{"type":"object","properties":{"provisioningURI":{"type":"string"},"secret":{"type":"string"}},"required":["provisioningURI","secret"],"additionalProperties":false}},"required":["operator","recoveryCodes","totp"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"Create operator account","tags":["Admin & Operators"]},"get":{"description":"Lists operator accounts and their scopes for operator administration.","operationId":"get_api_admin_operators","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"operators":{"type":"array","items":{"type":"object","properties":{"displayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"emailNormalized":{"type":"string"},"id":{"type":"string"},"mustRotatePassword":{"type":"boolean"},"scopes":{"type":"array","items":{"type":"string"}},"status":{"type":"string","enum":["active","disabled"]}},"required":["displayName","emailNormalized","id","mustRotatePassword","scopes","status"],"additionalProperties":false}}},"required":["operators"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"List operator accounts","tags":["Admin & Operators"]}},"/api/admin/session/totp/enroll":{"post":{"description":"Starts TOTP enrollment for the signed-in operator after re-confirming the current password.","operationId":"post_api_admin_session_totp_enroll","parameters":[],"requestBody":{"content":{"application/json":{"example":{"password":"operator-password-123"},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"password":{"type":"string","minLength":1}},"required":["password"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"operator":{"type":"object","properties":{"displayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"emailNormalized":{"type":"string"},"id":{"type":"string"},"mustRotatePassword":{"type":"boolean"},"scopes":{"type":"array","items":{"type":"string"}},"status":{"type":"string","enum":["active","disabled"]}},"required":["displayName","emailNormalized","id","mustRotatePassword","scopes","status"],"additionalProperties":false},"recoveryCodes":{"type":"array","items":{"type":"string"}},"totp":{"type":"object","properties":{"provisioningURI":{"type":"string"},"secret":{"type":"string"}},"required":["provisioningURI","secret"],"additionalProperties":false}},"required":["operator","recoveryCodes","totp"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"Enroll operator TOTP","tags":["Admin & Operators"]}},"/api/admin/map-markers/markers/:markerID":{"get":{"description":"Loads one managed map marker by ID.","operationId":"get_api_admin_map_markers_markers_markerID","parameters":[{"example":"$markerID","in":"path","name":"markerID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"Get a managed map marker","tags":["Admin & Operators"]}},"/api/admin/map-markers/sets/:setID":{"get":{"description":"Loads one managed map marker set by ID.","operationId":"get_api_admin_map_markers_sets_setID","parameters":[{"example":"$setID","in":"path","name":"setID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"Get a managed map marker set","tags":["Admin & Operators"]}},"/api/admin/map-markers/sets/:setID/analytics":{"get":{"description":"Returns impression and engagement analytics for a managed map marker set over a requested time window.","operationId":"get_api_admin_map_markers_sets_setID_analytics","parameters":[{"example":"$setID","in":"path","name":"setID","required":true,"schema":{"type":"string"}},{"in":"query","name":"days","required":false,"schema":{"type":"integer","minimum":1,"maximum":180}},{"in":"query","name":"from","required":true,"schema":{"default":null,"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]}},{"in":"query","name":"to","required":true,"schema":{"default":null,"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"byMarker":{"type":"array","items":{"type":"object","properties":{"ctaOpens":{"type":"integer","minimum":0,"maximum":9007199254740991},"detailOpens":{"type":"integer","minimum":0,"maximum":9007199254740991},"impressions":{"type":"integer","minimum":0,"maximum":9007199254740991},"lastSeenAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"markerID":{"type":"string","minLength":1},"taps":{"type":"integer","minimum":0,"maximum":9007199254740991},"title":{"type":"string","minLength":1},"uniqueUsers":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["ctaOpens","detailOpens","impressions","lastSeenAt","markerID","taps","title","uniqueUsers"],"additionalProperties":false}},"daily":{"type":"array","items":{"type":"object","properties":{"ctaOpens":{"type":"integer","minimum":0,"maximum":9007199254740991},"day":{"type":"string","minLength":1},"detailOpens":{"type":"integer","minimum":0,"maximum":9007199254740991},"impressions":{"type":"integer","minimum":0,"maximum":9007199254740991},"taps":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["ctaOpens","day","detailOpens","impressions","taps"],"additionalProperties":false}},"platforms":{"type":"array","items":{"type":"object","properties":{"ctaOpens":{"type":"integer","minimum":0,"maximum":9007199254740991},"detailOpens":{"type":"integer","minimum":0,"maximum":9007199254740991},"impressions":{"type":"integer","minimum":0,"maximum":9007199254740991},"platform":{"type":"string","enum":["ios","web"]},"taps":{"type":"integer","minimum":0,"maximum":9007199254740991},"uniqueUsers":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["ctaOpens","detailOpens","impressions","platform","taps","uniqueUsers"],"additionalProperties":false}},"set":{"type":"object","properties":{"audience":{"type":"string","enum":["all","members","non_members"]},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"detail":{"type":"object","properties":{"disclosureBody":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"disclosureLabel":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}]}},"required":["disclosureBody","disclosureLabel"],"additionalProperties":false},"enabled":{"type":"boolean"},"endsAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"id":{"type":"string","minLength":1},"imageGuidelinesVersion":{"type":"string","minLength":1,"maxLength":32},"kind":{"type":"string","enum":["sponsored","partner","informational"]},"key":{"type":"string","minLength":1,"maxLength":120},"maxZoom":{"anyOf":[{"type":"number","minimum":0,"maximum":24},{"type":"null"}]},"metadata":{"default":{},"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"minZoom":{"type":"number","minimum":0,"maximum":24},"platformTargets":{"minItems":1,"type":"array","items":{"type":"string","enum":["ios","web"]}},"priority":{"type":"integer","minimum":-100,"maximum":100},"startsAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"summary":{"type":"string","minLength":1,"maxLength":500},"title":{"type":"string","minLength":1,"maxLength":160},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["audience","createdAt","detail","enabled","endsAt","id","imageGuidelinesVersion","kind","key","maxZoom","metadata","minZoom","platformTargets","priority","startsAt","summary","title","updatedAt"],"additionalProperties":false},"summary":{"type":"object","properties":{"ctaOpens":{"type":"integer","minimum":0,"maximum":9007199254740991},"detailOpens":{"type":"integer","minimum":0,"maximum":9007199254740991},"firstSeenAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"impressions":{"type":"integer","minimum":0,"maximum":9007199254740991},"lastSeenAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"taps":{"type":"integer","minimum":0,"maximum":9007199254740991},"uniqueSessions":{"type":"integer","minimum":0,"maximum":9007199254740991},"uniqueUsers":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["ctaOpens","detailOpens","firstSeenAt","impressions","lastSeenAt","taps","uniqueSessions","uniqueUsers"],"additionalProperties":false}},"required":["byMarker","daily","platforms","set","summary"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"Get set analytics","tags":["Admin & Operators"]}},"/api/admin/feature-flags":{"get":{"description":"Lists typed operator-managed feature flags together with their effective resolved state.","operationId":"get_api_admin_feature_flags","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"List feature flags","tags":["Admin & Operators"]}},"/api/admin/content/documents":{"get":{"description":"Lists the managed operator-authored content documents that back legal and future product copy.","operationId":"get_api_admin_content_documents","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"List managed content documents","tags":["Admin & Operators"]}},"/api/admin/content/slots":{"get":{"description":"Lists scheduled managed content slots such as the launch campaign placement.","operationId":"get_api_admin_content_slots","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"List managed content slots","tags":["Admin & Operators"]}},"/api/admin/map-markers/sets":{"get":{"description":"Lists all managed map marker sets available to operator tooling.","operationId":"get_api_admin_map_markers_sets","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"List managed map marker sets","tags":["Admin & Operators"]},"post":{"description":"Creates or updates a managed map marker set, including audience rules, schedule windows, and disclosure copy.","operationId":"post_api_admin_map_markers_sets","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"Save a managed map marker set","tags":["Admin & Operators"]}},"/api/admin/map-markers/sets/:setID/markers":{"get":{"description":"Lists all markers attached to a managed map marker set.","operationId":"get_api_admin_map_markers_sets_setID_markers","parameters":[{"example":"$setID","in":"path","name":"setID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"List markers for a set","tags":["Admin & Operators"]}},"/api/admin/content/documents/:documentKey":{"get":{"description":"Loads one managed content document for operator editing.","operationId":"get_api_admin_content_documents_documentKey","parameters":[{"example":"legal_privacy","in":"path","name":"documentKey","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"Load one managed content document","tags":["Admin & Operators"]},"put":{"description":"Creates or updates a managed content document and records the operator-authored revision.","operationId":"put_api_admin_content_documents_documentKey","parameters":[{"example":"legal_privacy","in":"path","name":"documentKey","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"example":{"bodySource":"# Privacy Notice\n\nUpdated managed markdown copy.","format":"markdown","justification":"Publishing reviewed legal copy.","sourceOrigin":"operator://portal","summary":"Updated privacy copy","title":"Privacy Notice"},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"bodySource":{"type":"string","minLength":1},"format":{"type":"string","enum":["markdown","plain_text"]},"justification":{"default":null,"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}]},"sourceOrigin":{"default":null,"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"summary":{"type":"string","minLength":1,"maxLength":500},"title":{"type":"string","minLength":1,"maxLength":160}},"required":["bodySource","format","justification","sourceOrigin","summary","title"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"Upsert managed content document","tags":["Admin & Operators"]}},"/api/admin/content/slots/:slotKey":{"get":{"description":"Loads one managed content slot for scheduling and payload edits.","operationId":"get_api_admin_content_slots_slotKey","parameters":[{"example":"launch_campaign","in":"path","name":"slotKey","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"Load one managed content slot","tags":["Admin & Operators"]},"put":{"description":"Creates or updates a managed content slot, including its activation window and typed payload.","operationId":"put_api_admin_content_slots_slotKey","parameters":[{"example":"launch_campaign","in":"path","name":"slotKey","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"example":{"enabled":true,"endsAt":null,"justification":"Scheduling the current launch campaign.","payload":{"cta":"See conditions","isEnabled":true,"subtitle":"Operator-managed launch copy","title":"Storm cycle update"},"startsAt":null},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"enabled":{"type":"boolean"},"endsAt":{"default":null,"anyOf":[{"type":"string","minLength":1,"maxLength":64},{"type":"null"}]},"justification":{"default":null,"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}]},"payload":{"type":"object","properties":{"cta":{"type":"string","minLength":1,"maxLength":120},"isEnabled":{"default":true,"type":"boolean"},"subtitle":{"type":"string","minLength":1,"maxLength":240},"title":{"type":"string","minLength":1,"maxLength":120}},"required":["cta","isEnabled","subtitle","title"],"additionalProperties":false},"startsAt":{"default":null,"anyOf":[{"type":"string","minLength":1,"maxLength":64},{"type":"null"}]}},"required":["enabled","endsAt","justification","payload","startsAt"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"Upsert managed content slot","tags":["Admin & Operators"]}},"/api/admin/overview":{"get":{"description":"Loads the operator overview used by the hosted admin dashboard, including health snapshots and recent audit activity when permitted.","operationId":"get_api_admin_overview","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"operator":{"type":"object","properties":{"displayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"emailNormalized":{"type":"string"},"id":{"type":"string"},"mustRotatePassword":{"type":"boolean"},"scopes":{"type":"array","items":{"type":"string"}},"status":{"type":"string","enum":["active","disabled"]}},"required":["displayName","emailNormalized","id","mustRotatePassword","scopes","status"],"additionalProperties":false},"overview":{"type":"object","properties":{},"additionalProperties":{}},"recentAuditEvents":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}}},"required":["operator","overview","recentAuditEvents"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"Load operator overview","tags":["Admin & Operators"]}},"/api/admin/operators/:operatorID/scopes":{"post":{"description":"Replaces or bundles scopes for an operator account.","operationId":"post_api_admin_operators_operatorID_scopes","parameters":[{"example":"$firstOperatorID","in":"path","name":"operatorID","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"example":{"bundle":"support_admin","justification":"Granting support-admin bundle for customer repair work.","scopes":[]},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"bundle":{"default":null,"anyOf":[{"type":"string","enum":["ops_admin","support_admin","support_basic","super_admin"]},{"type":"null"}]},"justification":{"default":null,"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}]},"scopes":{"maxItems":64,"type":"array","items":{"type":"string","minLength":1}}},"required":["bundle","justification"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"operator":{"type":"object","properties":{"displayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"emailNormalized":{"type":"string"},"id":{"type":"string"},"mustRotatePassword":{"type":"boolean"},"scopes":{"type":"array","items":{"type":"string"}},"status":{"type":"string","enum":["active","disabled"]}},"required":["displayName","emailNormalized","id","mustRotatePassword","scopes","status"],"additionalProperties":false}},"required":["operator"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"Replace operator scopes","tags":["Admin & Operators"]}},"/api/admin/operators/:operatorID/totp-reset":{"post":{"description":"Resets TOTP enrollment for an operator and returns fresh bootstrap material.","operationId":"post_api_admin_operators_operatorID_totp_reset","parameters":[{"example":"$firstOperatorID","in":"path","name":"operatorID","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"example":{"justification":"Lost authenticator device."},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"justification":{"default":null,"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}]}},"required":["justification"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"operator":{"type":"object","properties":{"displayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"emailNormalized":{"type":"string"},"id":{"type":"string"},"mustRotatePassword":{"type":"boolean"},"scopes":{"type":"array","items":{"type":"string"}},"status":{"type":"string","enum":["active","disabled"]}},"required":["displayName","emailNormalized","id","mustRotatePassword","scopes","status"],"additionalProperties":false},"recoveryCodes":{"type":"array","items":{"type":"string"}},"totp":{"type":"object","properties":{"provisioningURI":{"type":"string"},"secret":{"type":"string"}},"required":["provisioningURI","secret"],"additionalProperties":false}},"required":["operator","recoveryCodes","totp"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"Reset operator TOTP","tags":["Admin & Operators"]}},"/api/admin/operators/:operatorID/password-rotate":{"post":{"description":"Rotates an operator password and optionally forces another rotation on next login.","operationId":"post_api_admin_operators_operatorID_password_rotate","parameters":[{"example":"$firstOperatorID","in":"path","name":"operatorID","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"example":{"justification":"Rotating operator password after device turnover.","mustRotatePassword":true,"newPassword":"new-operator-password-123"},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"justification":{"default":null,"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}]},"mustRotatePassword":{"type":"boolean"},"newPassword":{"type":"string","minLength":12,"maxLength":256}},"required":["justification","newPassword"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"operator":{"type":"object","properties":{"displayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"emailNormalized":{"type":"string"},"id":{"type":"string"},"mustRotatePassword":{"type":"boolean"},"scopes":{"type":"array","items":{"type":"string"}},"status":{"type":"string","enum":["active","disabled"]}},"required":["displayName","emailNormalized","id","mustRotatePassword","scopes","status"],"additionalProperties":false}},"required":["operator"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"Rotate operator password","tags":["Admin & Operators"]}},"/api/admin/map-markers/markers":{"post":{"description":"Creates or updates a managed map marker inside a set.","operationId":"post_api_admin_map_markers_markers","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"Save a managed map marker","tags":["Admin & Operators"]}},"/api/admin/session/sign-in":{"post":{"description":"Signs an operator into the hosted admin surface using the dedicated operator account plus TOTP or a recovery code.","operationId":"post_api_admin_session_sign_in","parameters":[],"requestBody":{"content":{"application/json":{"example":{"email":"ops@example.com","otpCode":"123456","password":"operator-password-123","recoveryCode":null},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"otpCode":{"default":null,"anyOf":[{"type":"string","minLength":6,"maxLength":12},{"type":"null"}]},"password":{"type":"string","minLength":1},"recoveryCode":{"default":null,"anyOf":[{"type":"string","minLength":4,"maxLength":64},{"type":"null"}]}},"required":["email","otpCode","password","recoveryCode"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"operator":{"type":"object","properties":{"displayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"emailNormalized":{"type":"string"},"id":{"type":"string"},"mustRotatePassword":{"type":"boolean"},"scopes":{"type":"array","items":{"type":"string"}},"status":{"type":"string","enum":["active","disabled"]}},"required":["displayName","emailNormalized","id","mustRotatePassword","scopes","status"],"additionalProperties":false},"session":{"type":"object","properties":{"expiresAt":{"type":"string"},"id":{"type":"string"},"sessionKind":{"type":"string","enum":["cli","portal"]}},"required":["expiresAt","sessionKind"],"additionalProperties":false},"mfaMethod":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["operator","session"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"Sign in as operator","tags":["Admin & Operators"]}},"/api/admin/session/sign-out":{"post":{"description":"Clears the current operator portal session cookie.","operationId":"post_api_admin_session_sign_out","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"signedOut":{"type":"boolean"}},"required":["signedOut"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"Sign out operator session","tags":["Admin & Operators"]}},"/api/admin/feature-flags/:flagKey":{"put":{"description":"Updates a typed feature flag while preserving backend capability constraints in the effective state.","operationId":"put_api_admin_feature_flags_flagKey","parameters":[{"example":"web_billing","in":"path","name":"flagKey","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"example":{"enabled":true,"justification":"Preparing staged rollout review."},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"enabled":{"type":"boolean"},"justification":{"default":null,"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}]}},"required":["enabled","justification"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"Update feature flag","tags":["Admin & Operators"]}},"/api/admin/session/totp/verify":{"post":{"description":"Verifies the just-enrolled operator TOTP secret and marks MFA as ready for future sign-ins.","operationId":"post_api_admin_session_totp_verify","parameters":[],"requestBody":{"content":{"application/json":{"example":{"otpCode":"123456"},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"otpCode":{"type":"string","minLength":6,"maxLength":12}},"required":["otpCode"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ok":{"type":"boolean"},"operator":{"type":"object","properties":{"displayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"emailNormalized":{"type":"string"},"id":{"type":"string"},"mustRotatePassword":{"type":"boolean"},"scopes":{"type":"array","items":{"type":"string"}},"status":{"type":"string","enum":["active","disabled"]}},"required":["displayName","emailNormalized","id","mustRotatePassword","scopes","status"],"additionalProperties":false}},"required":["ok","operator"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"Verify operator TOTP","tags":["Admin & Operators"]}},"/api/admin/users":{"post":{"description":"Creates a real local product account with password auth, baseline profile state, and an optional seeded membership preset for QA or support workflows. A human-readable justification is required and stored in the operator audit log.","operationId":"post_api_admin_users","parameters":[],"requestBody":{"content":{"application/json":{"example":{"displayName":"QA Demo","email":"qa-demo@yopmail.com","justification":"Create a reproducible QA account for admin validation.","password":null,"preset":"pro_member"},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"displayName":{"default":null,"anyOf":[{"type":"string","maxLength":120},{"type":"null"}]},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"justification":{"type":"string","minLength":1,"maxLength":1000},"password":{"default":null,"anyOf":[{"type":"string","minLength":12,"maxLength":256},{"type":"null"}]},"preset":{"default":"blank","anyOf":[{"type":"string","enum":["blank","ready_for_field","pro_member","lifetime_member"]},{"type":"null"}]}},"required":["displayName","email","justification","password","preset"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"Create a test user","tags":["Admin & Operators"]}},"/api/admin/users/:userID":{"get":{"description":"Loads the backend-owned user profile for support and operator inspection.","operationId":"get_api_admin_users_userID","parameters":[{"example":"$firstUserID","in":"path","name":"userID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"Load one user","tags":["Admin & Operators"]}},"/api/admin/users/:userID/support-summary":{"get":{"description":"Loads the support summary for a user, including membership, auth, and route-plan health context.","operationId":"get_api_admin_users_userID_support_summary","parameters":[{"example":"$firstUserID","in":"path","name":"userID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"summary":{"type":"object","properties":{},"additionalProperties":{}}},"required":["summary"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"Load user support summary","tags":["Admin & Operators"]}},"/api/admin/users/:userID/migrate-legacy-auth":{"post":{"description":"Runs the backend legacy-auth migration path for a user and returns the before/after migration outcome.","operationId":"post_api_admin_users_userID_migrate_legacy_auth","parameters":[{"example":"$firstUserID","in":"path","name":"userID","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"example":{"justification":"Migrating the account during a support-assisted legacy login recovery."},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"justification":{"default":null,"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}]}},"required":["justification"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"result":{"type":"object","properties":{},"additionalProperties":{}},"user":{"type":"object","properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"id":{"type":"string"}},"required":["id"],"additionalProperties":false}},"required":["result","user"],"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"Migrate legacy auth","tags":["Admin & Operators"]}},"/api/admin/users/:userID/recompute-membership":{"post":{"description":"Recomputes the backend membership snapshot for a user and records the repair in the operator audit log.","operationId":"post_api_admin_users_userID_recompute_membership","parameters":[{"example":"$firstUserID","in":"path","name":"userID","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"example":{"justification":"Membership state looks stale after provider reconciliation."},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"justification":{"default":null,"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}]}},"required":["justification"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"result":{"type":"object","properties":{},"additionalProperties":{}},"user":{"type":"object","properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"id":{"type":"string"}},"required":["id"],"additionalProperties":false}},"required":["result","user"],"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"Recompute user membership","tags":["Admin & Operators"]}},"/api/admin/users/search":{"get":{"description":"Searches for a local user by email or direct identifier so support can jump into account repair flows quickly.","operationId":"get_api_admin_users_search","parameters":[{"in":"query","name":"query","required":false,"schema":{"type":"string","minLength":1}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"result":{"anyOf":[{"type":"object","properties":{},"additionalProperties":{}},{"type":"null"}]}},"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"Search local users","tags":["Admin & Operators"]}},"/api/admin/users/:userID/unlock-auth":{"post":{"description":"Clears auth lockouts for a user and returns the refreshed auth-admin state for verification.","operationId":"post_api_admin_users_userID_unlock_auth","parameters":[{"example":"$firstUserID","in":"path","name":"userID","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"example":{"ipAddress":null,"justification":"Customer is locked out after repeated sign-in failures."},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"justification":{"default":null,"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}]},"ipAddress":{"default":null,"anyOf":[{"type":"string","minLength":3,"maxLength":100},{"type":"null"}]}},"required":["justification","ipAddress"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"result":{"type":"object","properties":{},"additionalProperties":{}},"user":{"type":"object","properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"id":{"type":"string"}},"required":["id"],"additionalProperties":false}},"required":["result","user"],"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"Unlock user auth","tags":["Admin & Operators"]}},"/api/admin/route-plans/by-owner":{"get":{"description":"Lists saved route plans for the specified user email for support and trip-safety review.","operationId":"get_api_admin_route_plans_by_owner","parameters":[{"in":"query","name":"email","required":true,"schema":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},{"in":"query","name":"limit","required":false,"schema":{"type":"integer","minimum":1,"maximum":200}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"email":{"type":"string"},"plans":{"type":"array","items":{"type":"object","properties":{"contentHash":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"date":{"type":"string"},"description":{"type":"string"},"friends":{"type":"array","items":{"type":"object","properties":{"ability":{"type":"string"},"fitness":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"risk":{"type":"string"},"userID":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["ability","fitness","id","name","risk"],"additionalProperties":false}},"id":{"type":"string"},"importLineage":{"anyOf":[{"type":"object","properties":{"importedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"isPreferred":{"type":"boolean"},"sourceOwnerUserID":{"type":"string"},"sourcePlanID":{"type":"string"},"sourceRevisionID":{"type":"string"},"sourceShareableID":{"type":"string"},"sourceUpdatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["importedAt","isPreferred","sourceOwnerUserID","sourcePlanID","sourceRevisionID","sourceShareableID","sourceUpdatedAt"],"additionalProperties":false},{"type":"null"}]},"mapViewState":{"anyOf":[{"type":"object","properties":{"bearing":{"type":"number"},"center":{"type":"array","prefixItems":[{"type":"number"},{"type":"number"}]},"pitch":{"type":"number"},"zoom":{"type":"number"}},"required":["bearing","center","pitch","zoom"],"additionalProperties":false},{"type":"null"}]},"mode":{"type":"string","enum":["stomp","glide","roar"]},"name":{"type":"string"},"notifyEmergencyContacts":{"type":"boolean"},"ownerUserID":{"type":"string"},"planBRoutes":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"catalog"},"routeID":{"type":"string"}},"required":["kind","routeID"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"saved"},"ownerUserID":{"anyOf":[{"type":"string"},{"type":"null"}]},"routeID":{"type":"string"}},"required":["kind","routeID"],"additionalProperties":false}]}},"revisionID":{"anyOf":[{"type":"string"},{"type":"null"}]},"routes":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"catalog"},"routeID":{"type":"string"}},"required":["kind","routeID"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"saved"},"ownerUserID":{"anyOf":[{"type":"string"},{"type":"null"}]},"routeID":{"type":"string"}},"required":["kind","routeID"],"additionalProperties":false}]}},"shareableID":{"type":"string"},"goals":{"type":"array","items":{"type":"string"}},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["createdAt","date","description","friends","id","mode","name","notifyEmergencyContacts","ownerUserID","planBRoutes","routes","shareableID","goals","updatedAt"],"additionalProperties":false}}},"required":["email","plans"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"List route plans by owner","tags":["Admin & Operators"]}},"/api/admin/routes/by-owner":{"get":{"description":"Lists saved routes for the specified user email without requiring the operator to impersonate the customer account.","operationId":"get_api_admin_routes_by_owner","parameters":[{"in":"query","name":"email","required":true,"schema":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},{"in":"query","name":"limit","required":false,"schema":{"type":"integer","minimum":1,"maximum":200}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"email":{"type":"string"},"routes":{"type":"array","items":{"type":"object","properties":{"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"endedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"geometry":{"type":"object","properties":{"points":{"type":"array","items":{"type":"object","properties":{"elevationMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"latitude":{"type":"number"},"longitude":{"type":"number"},"recordedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]}},"required":["latitude","longitude"],"additionalProperties":false}}},"required":["points"],"additionalProperties":false},"id":{"type":"string"},"isShared":{"default":false,"type":"boolean"},"lifecycle":{"type":"string","enum":["draft","saved","recording","completed","archived"]},"mapboxFeatureID":{"anyOf":[{"type":"string"},{"type":"null"}]},"metrics":{"type":"object","properties":{"altitudeClimbed":{"default":0,"type":"number"},"altitudeDescended":{"default":0,"type":"number"},"distanceMeters":{"default":0,"type":"number"},"durationSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"endAltitude":{"anyOf":[{"type":"number"},{"type":"null"}]},"estimatedDurationSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"maximumAltitudeMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"minimumAltitudeMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"startAltitude":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["altitudeClimbed","altitudeDescended","distanceMeters"],"additionalProperties":false},"notes":{"default":"","type":"string"},"ownerDisplayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"ownerUserID":{"anyOf":[{"type":"string"},{"type":"null"}]},"presentation":{"default":{"colorToken":"glacier"},"type":"object","properties":{"colorToken":{"default":"glacier","type":"string","enum":["glacier","forest","sunset","gold","violet","graphite"]}},"required":["colorToken"],"additionalProperties":false},"safety":{"anyOf":[{"type":"object","properties":{"computedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"dangerLevel":{"type":"number"},"dangerLevelLabel":{"type":"string","enum":["low","moderate","considerable","high","extreme"]},"evaluationMode":{"type":"string","const":"explicitDangerLevel"},"exposedDistanceMeters":{"type":"number"},"forecastSnapshotRevision":{"anyOf":[{"type":"string"},{"type":"null"}]},"highestRisk":{"type":"string","enum":["low","moderate","considerable","high","extreme"]},"isStale":{"type":"boolean"},"sourceRouteRevision":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["computedAt","dangerLevel","dangerLevelLabel","evaluationMode","exposedDistanceMeters","forecastSnapshotRevision","highestRisk","isStale","sourceRouteRevision"],"additionalProperties":false},{"type":"null"}]},"shareableID":{"anyOf":[{"type":"string"},{"type":"null"}]},"slopeRating":{"anyOf":[{"type":"string","enum":["green","blue","black","double-black"]},{"type":"null"}]},"source":{"type":"string","enum":["catalog","manual","tracked","imported"]},"startedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"title":{"type":"string"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["createdAt","endedAt","geometry","id","isShared","lifecycle","mapboxFeatureID","metrics","notes","ownerDisplayName","ownerUserID","presentation","source","startedAt","title","updatedAt"],"additionalProperties":false}}},"required":["email","routes"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"List routes by owner","tags":["Admin & Operators"]}},"/api/admin/trips/by-plan/:planID":{"get":{"description":"Lists recent trips for a route plan or returns the latest trip when requested through the query parameters.","operationId":"get_api_admin_trips_by_plan_planID","parameters":[{"example":"$firstPlanID","in":"path","name":"planID","required":true,"schema":{"type":"string"}},{"in":"query","name":"latest","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"string"}]}},{"in":"query","name":"limit","required":false,"schema":{"type":"integer","minimum":1,"maximum":200}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"List trips for a route plan","tags":["Admin & Operators"]}},"/api/admin/routes/:routeID":{"get":{"description":"Loads one saved route by ID through the operator surface.","operationId":"get_api_admin_routes_routeID","parameters":[{"example":"$firstRouteID","in":"path","name":"routeID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"route":{"type":"object","properties":{"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"endedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"geometry":{"type":"object","properties":{"points":{"type":"array","items":{"type":"object","properties":{"elevationMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"latitude":{"type":"number"},"longitude":{"type":"number"},"recordedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]}},"required":["latitude","longitude"],"additionalProperties":false}}},"required":["points"],"additionalProperties":false},"id":{"type":"string"},"isShared":{"default":false,"type":"boolean"},"lifecycle":{"type":"string","enum":["draft","saved","recording","completed","archived"]},"mapboxFeatureID":{"anyOf":[{"type":"string"},{"type":"null"}]},"metrics":{"type":"object","properties":{"altitudeClimbed":{"default":0,"type":"number"},"altitudeDescended":{"default":0,"type":"number"},"distanceMeters":{"default":0,"type":"number"},"durationSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"endAltitude":{"anyOf":[{"type":"number"},{"type":"null"}]},"estimatedDurationSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"maximumAltitudeMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"minimumAltitudeMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"startAltitude":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["altitudeClimbed","altitudeDescended","distanceMeters"],"additionalProperties":false},"notes":{"default":"","type":"string"},"ownerDisplayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"ownerUserID":{"anyOf":[{"type":"string"},{"type":"null"}]},"presentation":{"default":{"colorToken":"glacier"},"type":"object","properties":{"colorToken":{"default":"glacier","type":"string","enum":["glacier","forest","sunset","gold","violet","graphite"]}},"required":["colorToken"],"additionalProperties":false},"safety":{"anyOf":[{"type":"object","properties":{"computedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"dangerLevel":{"type":"number"},"dangerLevelLabel":{"type":"string","enum":["low","moderate","considerable","high","extreme"]},"evaluationMode":{"type":"string","const":"explicitDangerLevel"},"exposedDistanceMeters":{"type":"number"},"forecastSnapshotRevision":{"anyOf":[{"type":"string"},{"type":"null"}]},"highestRisk":{"type":"string","enum":["low","moderate","considerable","high","extreme"]},"isStale":{"type":"boolean"},"sourceRouteRevision":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["computedAt","dangerLevel","dangerLevelLabel","evaluationMode","exposedDistanceMeters","forecastSnapshotRevision","highestRisk","isStale","sourceRouteRevision"],"additionalProperties":false},{"type":"null"}]},"shareableID":{"anyOf":[{"type":"string"},{"type":"null"}]},"slopeRating":{"anyOf":[{"type":"string","enum":["green","blue","black","double-black"]},{"type":"null"}]},"source":{"type":"string","enum":["catalog","manual","tracked","imported"]},"startedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"title":{"type":"string"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["createdAt","endedAt","geometry","id","isShared","lifecycle","mapboxFeatureID","metrics","notes","ownerDisplayName","ownerUserID","presentation","source","startedAt","title","updatedAt"],"additionalProperties":false}},"required":["route"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"Load one route for support","tags":["Admin & Operators"]}},"/api/admin/route-plans/:planID":{"get":{"description":"Loads one saved route plan by ID through the operator surface.","operationId":"get_api_admin_route_plans_planID","parameters":[{"example":"$firstPlanID","in":"path","name":"planID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"routePlan":{"type":"object","properties":{"contentHash":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"date":{"type":"string"},"description":{"type":"string"},"friends":{"type":"array","items":{"type":"object","properties":{"ability":{"type":"string"},"fitness":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"risk":{"type":"string"},"userID":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["ability","fitness","id","name","risk"],"additionalProperties":false}},"id":{"type":"string"},"importLineage":{"anyOf":[{"type":"object","properties":{"importedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"isPreferred":{"type":"boolean"},"sourceOwnerUserID":{"type":"string"},"sourcePlanID":{"type":"string"},"sourceRevisionID":{"type":"string"},"sourceShareableID":{"type":"string"},"sourceUpdatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["importedAt","isPreferred","sourceOwnerUserID","sourcePlanID","sourceRevisionID","sourceShareableID","sourceUpdatedAt"],"additionalProperties":false},{"type":"null"}]},"mapViewState":{"anyOf":[{"type":"object","properties":{"bearing":{"type":"number"},"center":{"type":"array","prefixItems":[{"type":"number"},{"type":"number"}]},"pitch":{"type":"number"},"zoom":{"type":"number"}},"required":["bearing","center","pitch","zoom"],"additionalProperties":false},{"type":"null"}]},"mode":{"type":"string","enum":["stomp","glide","roar"]},"name":{"type":"string"},"notifyEmergencyContacts":{"type":"boolean"},"ownerUserID":{"type":"string"},"planBRoutes":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"catalog"},"routeID":{"type":"string"}},"required":["kind","routeID"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"saved"},"ownerUserID":{"anyOf":[{"type":"string"},{"type":"null"}]},"routeID":{"type":"string"}},"required":["kind","routeID"],"additionalProperties":false}]}},"revisionID":{"anyOf":[{"type":"string"},{"type":"null"}]},"routes":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"catalog"},"routeID":{"type":"string"}},"required":["kind","routeID"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"saved"},"ownerUserID":{"anyOf":[{"type":"string"},{"type":"null"}]},"routeID":{"type":"string"}},"required":["kind","routeID"],"additionalProperties":false}]}},"shareableID":{"type":"string"},"goals":{"type":"array","items":{"type":"string"}},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["createdAt","date","description","friends","id","mode","name","notifyEmergencyContacts","ownerUserID","planBRoutes","routes","shareableID","goals","updatedAt"],"additionalProperties":false}},"required":["routePlan"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"Load one route plan for support","tags":["Admin & Operators"]}},"/api/admin/trips/:tripID":{"get":{"description":"Loads the full trip support summary, including contacts, alerts, heartbeats, observations, and debrief state.","operationId":"get_api_admin_trips_tripID","parameters":[{"example":"$latestTripID","in":"path","name":"tripID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"Load one trip summary","tags":["Admin & Operators"]}},"/api/admin/routes/:routeID/recompute-exposure":{"post":{"description":"Forces a fresh route-exposure materialization and records the operator action in the audit log.","operationId":"post_api_admin_routes_routeID_recompute_exposure","parameters":[{"example":"$firstRouteID","in":"path","name":"routeID","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"example":{"dangerLevel":3,"justification":"Recomputing exposure after route geometry changes."},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"dangerLevel":{"anyOf":[{"type":"number"},{"type":"string"}]},"justification":{"default":null,"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}]}},"required":["justification"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"exposure":{"type":"object","properties":{},"additionalProperties":{}}},"required":["exposure"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"Recompute route exposure for support","tags":["Admin & Operators"]}},"/api/admin/routes/:routeID/terrain-analysis":{"post":{"description":"Runs the backend terrain-analysis engine for a saved route on behalf of support or operations.","operationId":"post_api_admin_routes_routeID_terrain_analysis","parameters":[{"example":"$firstRouteID","in":"path","name":"routeID","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"example":{"dangerLevel":3},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"dangerLevel":{"anyOf":[{"type":"number"},{"type":"string"}]}},"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"analysis":{"type":"object","properties":{"dangerLevel":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"exposureBudget":{"type":"object","properties":{"byDangerClass":{"type":"array","items":{"type":"object","properties":{"distanceMeters":{"type":"number"},"key":{"type":"string"}},"required":["distanceMeters","key"],"additionalProperties":false}},"byProblemToken":{"type":"array","items":{"type":"object","properties":{"distanceMeters":{"type":"number"},"token":{"type":"string"}},"required":["distanceMeters","token"],"additionalProperties":false}}},"required":["byDangerClass","byProblemToken"],"additionalProperties":false},"footprintRose":{"type":"object","properties":{"aspectSource":{"type":"string"},"cells":{"type":"array","items":{"type":"object","properties":{"aspect":{"type":"string"},"distanceMeters":{"type":"number"},"elevationBand":{"type":"string"},"matchedProblemDistanceMeters":{"type":"number"}},"required":["aspect","distanceMeters","elevationBand","matchedProblemDistanceMeters"],"additionalProperties":false}},"confidence":{"type":"string"},"elevationBandSource":{"type":"string"}},"required":["aspectSource","cells","confidence","elevationBandSource"],"additionalProperties":false},"matchedForecastZones":{"type":"array","items":{"type":"object","properties":{"sampleCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"zoneID":{"type":"string"},"zoneName":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["sampleCount","zoneID","zoneName"],"additionalProperties":false}},"profile":{"type":"object","properties":{"sampleSpacingMeters":{"type":"number"},"samples":{"type":"array","items":{"type":"object","properties":{"dangerClass":{"anyOf":[{"type":"string"},{"type":"null"}]},"distanceMeters":{"type":"number"},"elevationMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"forecastZoneID":{"anyOf":[{"type":"string"},{"type":"null"}]},"inferredElevationBand":{"anyOf":[{"type":"string"},{"type":"null"}]},"latitude":{"type":"number"},"longitude":{"type":"number"},"matchingProblemTokens":{"type":"array","items":{"type":"string"}},"slopeDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"terrainAspect":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["dangerClass","distanceMeters","elevationMeters","forecastZoneID","inferredElevationBand","latitude","longitude","matchingProblemTokens","slopeDegrees","terrainAspect"],"additionalProperties":false}},"totalDistanceMeters":{"type":"number"}},"required":["sampleSpacingMeters","samples","totalDistanceMeters"],"additionalProperties":false},"slopeDistribution":{"type":"array","items":{"type":"object","properties":{"bucket":{"type":"string","enum":["<30","30-34","35-39","40+"]},"distanceMeters":{"type":"number"}},"required":["bucket","distanceMeters"],"additionalProperties":false}},"slopeGuidance":{"type":"object","properties":{},"additionalProperties":{}},"warnings":{"type":"array","items":{"type":"string"}}},"required":["dangerLevel","exposureBudget","footprintRose","matchedForecastZones","profile","slopeDistribution","slopeGuidance","warnings"],"additionalProperties":false}},"required":["analysis"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"Run support terrain analysis","tags":["Admin & Operators"]}},"/api/admin/forecasts/stats":{"get":{"description":"Loads forecast inventory and freshness stats for operator review.","operationId":"get_api_admin_forecasts_stats","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"stats":{"type":"object","properties":{},"additionalProperties":{}}},"required":["stats"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"Load forecast stats","tags":["Admin & Operators"]}},"/api/admin/ops/health":{"get":{"description":"Loads runtime health, worker heartbeat, and environment-level operator diagnostics.","operationId":"get_api_admin_ops_health","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"health":{"type":"object","properties":{},"additionalProperties":{}}},"required":["health"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"Load ops health","tags":["Admin & Operators"]}},"/api/admin/forecasts/sync":{"post":{"description":"Runs the manual forecast sync path and returns the updated write summary plus stats.","operationId":"post_api_admin_forecasts_sync","parameters":[],"requestBody":{"content":{"application/json":{"example":{"justification":"Manual sync during staging validation."},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"justification":{"default":null,"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}]}},"required":["justification"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"stats":{"type":"object","properties":{},"additionalProperties":{}},"writes":{"type":"object","properties":{},"additionalProperties":{}}},"required":["stats","writes"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"Run forecast sync","tags":["Admin & Operators"]}},"/api/admin/audit":{"get":{"description":"Lists immutable operator audit events with optional filters for actor, action, target, and status.","operationId":"get_api_admin_audit","parameters":[{"in":"query","name":"action","required":false,"schema":{"type":"string","minLength":1}},{"in":"query","name":"limit","required":false,"schema":{"type":"integer","minimum":1,"maximum":200}},{"in":"query","name":"operatorAccountID","required":false,"schema":{"type":"string","minLength":1}},{"in":"query","name":"status","required":false,"schema":{"type":"string","enum":["success","failure"]}},{"in":"query","name":"targetID","required":false,"schema":{"type":"string","minLength":1}},{"in":"query","name":"targetType","required":false,"schema":{"type":"string","minLength":1}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"events":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}}},"required":["events"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"operatorCookieSession":[]}],"summary":"List operator audit events","tags":["Admin & Operators"]}},"/api/ai/decision-assist":{"post":{"description":"Builds decision-assist considerations from a normalized prompt contract.","operationId":"post_api_ai_decision_assist","parameters":[],"requestBody":{"content":{"application/json":{"example":{"category":"terrain","contextJSON":{"source":"hosted-docs"},"description":"Should we continue onto the final ridge in increasing wind?"},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"category":{"type":"string","minLength":1,"maxLength":100},"contextJSON":{"default":{},"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"description":{"type":"string","minLength":1,"maxLength":2000}},"required":["category","contextJSON","description"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Build AI decision assist context","tags":["AI Helpers"]}},"/api/ai/forecast-briefing":{"post":{"description":"Builds normalized AI-ready forecast briefing context for one or more zones.","operationId":"post_api_ai_forecast_briefing","parameters":[],"requestBody":{"content":{"application/json":{"example":{"dangerLevels":{"$sampleForecastZoneID":3},"zoneIDs":["$sampleForecastZoneID"]},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"dangerLevels":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"integer","minimum":0,"maximum":5}},"zoneIDs":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"string","minLength":1}}},"required":["dangerLevels","zoneIDs"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Build AI forecast briefing","tags":["AI Helpers"]}},"/api/ai/route-briefing":{"post":{"description":"Builds normalized route-plan briefing context for AI surfaces.","operationId":"post_api_ai_route_briefing","parameters":[],"requestBody":{"content":{"application/json":{"example":{"planID":"$firstPlanID"},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"planID":{"type":"string","minLength":1}},"required":["planID"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Build AI route briefing","tags":["AI Helpers"]}},"/api/ai/defaults.json":{"get":{"description":"Returns the machine-readable project AI defaults document, including docs-first behavior, contract locations, and operator-safety guidance.","operationId":"get_api_ai_defaults_json","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"summary":"Load project AI defaults","tags":["AI Helpers"]}},"/api/ai/search":{"post":{"description":"Normalizes a natural-language search request into backend-friendly search intent.","operationId":"post_api_ai_search","parameters":[],"requestBody":{"content":{"application/json":{"example":{"limit":10,"naturalLanguageQuery":"Find routes near Berthoud Pass with lower exposure."},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"limit":{"default":10,"type":"integer","minimum":1,"maximum":50},"naturalLanguageQuery":{"type":"string","minLength":1,"maxLength":500}},"required":["limit","naturalLanguageQuery"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Normalize AI search intent","tags":["AI Helpers"]}},"/api/analytics/events":{"post":{"description":"Ingests anonymous analytics events into the backend-owned analytics sink abstraction.","operationId":"post_api_analytics_events","parameters":[],"requestBody":{"content":{"application/json":{"example":{"events":[{"client":{"appVersion":"1.0.0","buildNumber":"100","deviceModel":"Docs Explorer","isDebug":true,"locale":"en-US","osName":"web","osVersion":"1","sdkVersion":"docs"},"environment":"staging","id":"docs-event-1","moduleNamespace":"docs","name":"debug_test_event_triggered","occurredAt":"2026-04-13T07:20:21.082Z","platform":"web","properties":{"interaction_kind":"submit","element_role":"button"},"sessionID":"docs-session"}],"schemaVersion":1},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"events":{"minItems":1,"maxItems":25,"type":"array","items":{"type":"object","properties":{"client":{"type":"object","properties":{"appVersion":{"type":"string","minLength":1,"maxLength":64},"buildNumber":{"anyOf":[{"type":"string","minLength":1,"maxLength":64},{"type":"null"}]},"deviceModel":{"type":"string","minLength":1,"maxLength":120},"isDebug":{"type":"boolean"},"locale":{"type":"string","minLength":1,"maxLength":32},"osName":{"type":"string","minLength":1,"maxLength":32},"osVersion":{"type":"string","minLength":1,"maxLength":64},"sdkVersion":{"type":"string","minLength":1,"maxLength":64}},"required":["appVersion","deviceModel","isDebug","locale","osName","osVersion","sdkVersion"],"additionalProperties":false},"elementID":{"anyOf":[{"type":"string","minLength":1,"maxLength":120},{"type":"null"}]},"environment":{"type":"string","enum":["development","staging","preview","production","test"]},"id":{"type":"string","minLength":1,"maxLength":120},"moduleNamespace":{"type":"string","minLength":1,"maxLength":64},"name":{"type":"string","enum":["account_opened","app_opened","avatar_updated","biometric_unlock_enabled","biometric_unlock_succeeded","checklist_completed","decision_log_created","forecast_override_applied","forecast_override_cleared","forecast_override_flow_started","forecast_zone_opened","inclinometer_opened","layer_preference_changed","magic_link_completed","magic_link_requested","module_opened","onboarding_completed","onboarding_started","permission_prompt_presented","permission_recovery_opened","permission_status_changed","profile_opened","route_draft_started","route_opened","route_saved","search_result_selected","search_submitted","safety_contact_added","safety_opened","settings_opened","settings_preference_changed","surface_opened","tool_opened","trip_share_resent","trip_finished","trip_started","tutorial_completed","tutorial_skipped","tutorial_started","ui_interaction","invite_shared","debug_test_event_triggered"]},"occurredAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"platform":{"type":"string","enum":["ios","web"]},"properties":{"default":{},"type":"object","propertyNames":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[a-z][a-z0-9_]*$"},"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"number"},{"type":"string","minLength":1,"maxLength":280}]}},"screenID":{"anyOf":[{"type":"string","minLength":1,"maxLength":120},{"type":"null"}]},"sessionID":{"type":"string","minLength":1,"maxLength":64},"surfaceID":{"anyOf":[{"type":"string","minLength":1,"maxLength":120},{"type":"null"}]}},"required":["client","environment","id","moduleNamespace","name","occurredAt","platform","properties","sessionID"],"additionalProperties":false}},"schemaVersion":{"type":"number","const":1}},"required":["events","schemaVersion"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"acceptedCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"sinkMode":{"type":"string"}},"required":["acceptedCount","sinkMode"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"summary":"Submit analytics events","tags":["Analytics"]}},"/api/auth/sign-in":{"get":{"description":"Checks the current cookie-backed session and returns the authenticated identity payload when present.","operationId":"get_api_auth_sign_in","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"isLogged":{"type":"boolean"},"session":{"type":"object","properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"uid":{"type":"string"}},"required":["email","name","uid"],"additionalProperties":false}},"required":["isLogged"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Check session status","tags":["Auth & Platform"]},"post":{"description":"Signs in with email/password and sets the session cookie used by the explorer and web app surfaces.","operationId":"post_api_auth_sign_in","parameters":[],"requestBody":{"content":{"application/json":{"example":{"email":"tester@example.com","password":"powder1234"},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"email":{"type":"string","maxLength":320,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"password":{"type":"string","minLength":1,"maxLength":4096}},"required":["email","password"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"session":{"type":"object","properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"uid":{"type":"string"}},"required":["email","name","uid"],"additionalProperties":false}},"required":["session"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Sign in with password","tags":["Auth & Platform"]}},"/api/auth/register":{"post":{"description":"Creates a new account and issues a logged-in cookie session.","operationId":"post_api_auth_register","parameters":[],"requestBody":{"content":{"application/json":{"example":{"acceptedRisk":true,"email":"new-user@example.com","name":"Docs Explorer","password":"powder1234"},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"displayName":{"type":"string","maxLength":120},"email":{"type":"string","maxLength":320,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"password":{"type":"string","minLength":8,"maxLength":4096}},"required":["email","password"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"session":{"type":"object","properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"uid":{"type":"string"}},"required":["email","name","uid"],"additionalProperties":false}},"required":["session"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Register a new account","tags":["Auth & Platform"]}},"/api/auth/sign-out":{"post":{"description":"Clears the current cookie-backed session.","operationId":"post_api_auth_sign_out","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Sign out","tags":["Auth & Platform"]}},"/api/auth/magic-link/consume":{"post":{"description":"Consumes a previously issued magic-link token.","operationId":"post_api_auth_magic_link_consume","parameters":[],"requestBody":{"content":{"application/json":{"example":{"token":"paste-token"},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"token":{"type":"string","minLength":1,"maxLength":512}},"required":["token"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Consume a magic link","tags":["Auth & Platform"]}},"/api/auth/password-reset/consume":{"post":{"description":"Consumes a password-reset token and updates the account password.","operationId":"post_api_auth_password_reset_consume","parameters":[],"requestBody":{"content":{"application/json":{"example":{"password":"newPowder1234","token":"paste-token"},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"password":{"type":"string","minLength":8,"maxLength":4096},"token":{"type":"string","minLength":1,"maxLength":512}},"required":["password","token"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Consume password reset","tags":["Auth & Platform"]}},"/api/auth/magic-link/request":{"post":{"description":"Requests a hosted magic-link sign-in flow.","operationId":"post_api_auth_magic_link_request","parameters":[],"requestBody":{"content":{"application/json":{"example":{"email":"tester@example.com"},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"email":{"type":"string","maxLength":320,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"onboardingHint":{"type":"string","minLength":1,"maxLength":120},"redirectPath":{"type":"string","minLength":1,"maxLength":200},"referralCode":{"type":"string","minLength":1,"maxLength":120}},"required":["email"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Request a magic link","tags":["Auth & Platform"]}},"/api/auth/password-reset/request":{"post":{"description":"Requests the hosted password-reset flow.","operationId":"post_api_auth_password_reset_request","parameters":[],"requestBody":{"content":{"application/json":{"example":{"email":"tester@example.com"},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"email":{"type":"string","maxLength":320,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"required":["email"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Request password reset","tags":["Auth & Platform"]}},"/api/invites":{"post":{"description":"Creates an invite link for hosted onboarding or app handoff.","operationId":"post_api_invites","parameters":[],"requestBody":{"content":{"application/json":{"example":{"email":"friend@example.com","route":"map"},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"expiresInDays":{"type":"integer","minimum":1,"maximum":30},"metadata":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"onboardingHint":{"type":"string","minLength":1,"maxLength":120},"referralCode":{"type":"string","minLength":1,"maxLength":120},"route":{"default":"map","type":"string","enum":["map","settings"]}},"required":["route"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Create an invite link","tags":["Auth & Platform"]}},"/api/invites/:token":{"get":{"description":"Loads invite metadata by token for hosted/app continuation.","operationId":"get_api_invites_token","parameters":[{"example":"$firstInviteToken","in":"path","name":"token","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"summary":"Load invite detail","tags":["Auth & Platform"]}},"/api/push/devices":{"post":{"description":"Registers a push-capable device token against the signed-in account.","operationId":"post_api_push_devices","parameters":[],"requestBody":{"content":{"application/json":{"example":{"deviceName":"Docs Browser","environment":"staging","platform":"ios","token":"device-token-placeholder"},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"deviceName":{"anyOf":[{"type":"string","minLength":1,"maxLength":120},{"type":"null"}]},"environment":{"default":"production","type":"string","enum":["local","development","preview","production","staging","test"]},"metadata":{"default":{},"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"platform":{"default":"ios","type":"string","enum":["ios"]},"token":{"type":"string","minLength":1}},"required":["environment","metadata","platform","token"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Register a push device","tags":["Auth & Platform"]}},"/api/elevation/profile":{"post":{"description":"Builds an elevation profile for a route geometry.","operationId":"post_api_elevation_profile","parameters":[],"requestBody":{"content":{"application/json":{"example":{"geometry":{"points":[{"latitude":39.6425,"longitude":-105.8716},{"latitude":39.644,"longitude":-105.8683},{"latitude":39.6451,"longitude":-105.8652}]},"includeTerrainNeighbors":false,"mode":"glide"},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"geometry":{"type":"object","properties":{"points":{"minItems":2,"type":"array","items":{"type":"object","properties":{"latitude":{"type":"number"},"longitude":{"type":"number"}},"required":["latitude","longitude"],"additionalProperties":false}}},"required":["points"],"additionalProperties":false},"includeTerrainNeighbors":{"type":"boolean"},"mode":{"type":"string"}},"required":["geometry"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Sample an elevation profile","tags":["Auth & Platform"]}},"/api/elevation/points":{"post":{"description":"Samples elevation at one or more points.","operationId":"post_api_elevation_points","parameters":[],"requestBody":{"content":{"application/json":{"example":{"coordinates":[{"latitude":39.6425,"longitude":-105.8716},{"latitude":39.6451,"longitude":-105.8652}]},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"coordinates":{"minItems":1,"type":"array","items":{"type":"object","properties":{"latitude":{"type":"number"},"longitude":{"type":"number"}},"required":["latitude","longitude"],"additionalProperties":false}}},"required":["coordinates"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Sample point elevations","tags":["Auth & Platform"]}},"/api/integrations/revenuecat/webhook":{"post":{"description":"RevenueCat webhook receiver. Interactive browser testing is not supported because the route requires provider-authenticated payloads.","operationId":"post_api_integrations_revenuecat_webhook","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"webhookSignature":[]}],"summary":"RevenueCat webhook receiver","tags":["Auth & Platform"]}},"/api/integrations/stripe/webhook":{"post":{"description":"Stripe webhook receiver. Interactive browser testing is not supported because the route requires Stripe-signed raw payloads.","operationId":"post_api_integrations_stripe_webhook","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"webhookSignature":[]}],"summary":"Stripe webhook receiver","tags":["Auth & Platform"]}},"/api/commerce/catalog":{"get":{"description":"Loads the backend-owned commerce catalog and plan purchase options.","operationId":"get_api_commerce_catalog","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Load commerce catalog","tags":["Commerce & Debug"]}},"/api/commerce/entitlements":{"get":{"description":"Loads the current account’s entitlement explanation and active grants.","operationId":"get_api_commerce_entitlements","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Load entitlements","tags":["Commerce & Debug"]}},"/api/commerce/refresh":{"post":{"description":"Refreshes commerce state from configured providers.","operationId":"post_api_commerce_refresh","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Refresh commerce state","tags":["Commerce & Debug"]}},"/api/subscription/providers/revenuecat/sync":{"post":{"description":"Syncs RevenueCat entitlement state into the backend-owned subscription record.","operationId":"post_api_subscription_providers_revenuecat_sync","parameters":[],"requestBody":{"content":{"application/json":{"example":{"appUserID":"current-user","entitlementIDs":[],"environment":"SANDBOX","expiresAt":null,"isActive":false,"originalAppUserID":null,"productID":null,"purchasedAt":null,"store":null,"subscriptionID":null},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"customer":{"type":"object","properties":{"activeEntitlementIDs":{"default":[],"type":"array","items":{"type":"string"}},"activeProductIDs":{"default":[],"type":"array","items":{"type":"string"}},"appUserID":{"anyOf":[{"type":"string"},{"type":"null"}]},"expirationDate":{"anyOf":[{"type":"string"},{"type":"null"}]},"originalAppUserID":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["activeEntitlementIDs","activeProductIDs"],"additionalProperties":false},"source":{"default":"refresh","type":"string","enum":["purchase","refresh","restore"]}},"required":["customer","source"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Sync RevenueCat subscription state","tags":["Commerce & Debug"]}},"/api/commerce/providers/stripe/checkout-session":{"post":{"description":"Creates a Stripe Checkout session for supported plans.","operationId":"post_api_commerce_providers_stripe_checkout_session","parameters":[],"requestBody":{"content":{"application/json":{"example":{"cancelURL":"https://staging-app.bagels.top/account","originContext":"web","plan":"pro","successURL":"https://staging-app.bagels.top/account"},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"cancelURL":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"originContext":{"default":"web","type":"string","enum":["ios-app","web"]},"plan":{"type":"string","enum":["advanced","lifetime","pro"]},"successURL":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]}},"required":["originContext","plan"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Create Stripe checkout session","tags":["Commerce & Debug"]}},"/api/commerce/providers/stripe/portal-session":{"post":{"description":"Creates a Stripe billing portal session.","operationId":"post_api_commerce_providers_stripe_portal_session","parameters":[],"requestBody":{"content":{"application/json":{"example":{"returnURL":"https://staging-app.bagels.top/account"},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"returnURL":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]}},"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Create Stripe portal session","tags":["Commerce & Debug"]}},"/api/commerce/providers/stripe/customer":{"post":{"description":"Ensures a Stripe customer exists for the signed-in user.","operationId":"post_api_commerce_providers_stripe_customer","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Ensure Stripe customer","tags":["Commerce & Debug"]}},"/api/buddy-passes":{"get":{"description":"Lists buddy passes available to the current user.","operationId":"get_api_buddy_passes","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"List buddy passes","tags":["Commerce & Debug"]}},"/api/buddy-passes/redeem":{"post":{"description":"Redeems a buddy pass by invite slug or token.","operationId":"post_api_buddy_passes_redeem","parameters":[],"requestBody":{"content":{"application/json":{"example":{"inviteSlug":"$firstBuddyPassSlug"},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"inviteSlug":{"type":"string","minLength":1},"inviteToken":{"type":"string","minLength":1}},"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Redeem a buddy pass","tags":["Commerce & Debug"]}},"/api/buddy-passes/:id/revoke":{"post":{"description":"Revokes a previously issued buddy pass.","operationId":"post_api_buddy_passes_id_revoke","parameters":[{"example":"$firstBuddyPassID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Revoke a buddy pass","tags":["Commerce & Debug"]}},"/api/buddy-passes/:id/share":{"post":{"description":"Shares a buddy pass via hosted invite flow.","operationId":"post_api_buddy_passes_id_share","parameters":[{"example":"$firstBuddyPassID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"example":{"recipientEmail":"friend@example.com"},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"recipientEmail":{"anyOf":[{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}]}},"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Share a buddy pass","tags":["Commerce & Debug"]}},"/api/debug/entitlements/override":{"post":{"description":"Creates a local debug entitlement override.","operationId":"post_api_debug_entitlements_override","parameters":[],"requestBody":{"content":{"application/json":{"example":{"expiresAt":null,"reason":"Testing from hosted docs","subscriptionEndAt":null,"subscriptionPlan":"pro","subscriptionStatus":"active"},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"expiresAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"reason":{"anyOf":[{"type":"string","maxLength":280},{"type":"null"}]},"subscriptionEndAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"subscriptionPlan":{"type":"string","enum":["advanced","free","lifetime","pro"]},"subscriptionStatus":{"default":"active","type":"string","enum":["active","cancelled","expired","inactive","past_due","trialing"]}},"required":["subscriptionPlan","subscriptionStatus"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Create debug entitlement override","tags":["Commerce & Debug"]},"delete":{"description":"Clears the local debug entitlement override.","operationId":"delete_api_debug_entitlements_override","parameters":[{"in":"query","name":"reason","required":false,"schema":{"type":"string","maxLength":280}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Delete debug entitlement override","tags":["Commerce & Debug"]}},"/api/debug/state":{"get":{"description":"Loads the debug/state diagnostics bundle when debug tools are enabled.","operationId":"get_api_debug_state","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Load debug state","tags":["Commerce & Debug"]}},"/api/subscription/diagnostics":{"get":{"description":"Loads the backend commerce diagnostics bundle for the current user.","operationId":"get_api_subscription_diagnostics","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Load subscription diagnostics","tags":["Commerce & Debug"]}},"/api/profile/avatar/complete":{"post":{"description":"Completes an uploaded avatar session and attaches the new avatar to the signed-in profile.","operationId":"post_api_profile_avatar_complete","parameters":[],"requestBody":{"content":{"application/json":{"example":{"sessionID":"$avatarUploadSessionID"},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"sessionID":{"type":"string","minLength":1}},"required":["sessionID"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"avatar":{"type":"object","properties":{"assetID":{"type":"string","minLength":1},"byteSize":{"type":"integer","minimum":0,"maximum":9007199254740991},"contentType":{"type":"string","minLength":1},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"height":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}]},"urls":{"type":"object","properties":{"original":{"type":"object","properties":{"url":{"type":"string","format":"uri"}},"required":["url"],"additionalProperties":false},"thumbnail":{"type":"object","properties":{"url":{"type":"string","format":"uri"}},"required":["url"],"additionalProperties":false}},"required":["original","thumbnail"],"additionalProperties":false},"width":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}]}},"required":["assetID","byteSize","contentType","createdAt","height","urls","width"],"additionalProperties":false}},"required":["avatar"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Complete avatar upload","tags":["Public Content"]}},"/api/profile/avatar/upload-session":{"post":{"description":"Creates a backend-managed avatar upload session and returns the upload target metadata.","operationId":"post_api_profile_avatar_upload_session","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"session":{"type":"object","properties":{"acceptedMimeTypes":{"minItems":1,"type":"array","items":{"type":"string","minLength":1}},"expiresAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"maxBytes":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"sessionID":{"type":"string","minLength":1},"uploadMethod":{"type":"string","const":"backend_binary_put"},"uploadURL":{"type":"string","format":"uri"}},"required":["acceptedMimeTypes","expiresAt","maxBytes","sessionID","uploadMethod","uploadURL"],"additionalProperties":false}},"required":["session"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Create avatar upload session","tags":["Public Content"]}},"/api/profile/avatar":{"delete":{"description":"Removes the currently attached avatar from the signed-in profile.","operationId":"delete_api_profile_avatar","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Delete current avatar","tags":["Public Content"]}},"/api/admin-cli.json":{"get":{"description":"Returns the machine-readable admin CLI catalog generated from the same registry that powers the hosted operator tooling docs.","operationId":"get_api_admin_cli_json","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"summary":"Load admin CLI document","tags":["Public Content"]}},"/api/profile/avatar/assets/:assetID":{"get":{"description":"Serves a stored avatar asset by opaque asset ID for in-app display.","operationId":"get_api_profile_avatar_assets_assetID","parameters":[{"example":"$avatarAssetID","in":"path","name":"assetID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"summary":"Load avatar asset","tags":["Public Content"]}},"/api/bootstrap/config":{"get":{"description":"Loads the public bootstrap config used by hosted and web shells.","operationId":"get_api_bootstrap_config","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"summary":"Load bootstrap config","tags":["Public Content"]}},"/api/content/education":{"get":{"description":"Loads the public education catalog and recommended entries.","operationId":"get_api_content_education","parameters":[{"in":"query","name":"onboardingHint","required":false,"schema":{"type":"string","minLength":1,"maxLength":120}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"summary":"Load education catalog","tags":["Public Content"]}},"/api/openapi.json":{"get":{"description":"Returns the machine-readable OpenAPI document generated from the same registry that powers the hosted docs UI.","operationId":"get_api_openapi_json","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"summary":"Load OpenAPI document","tags":["Public Content"]}},"/api/profile/summary":{"get":{"description":"Loads the first-class profile summary surface used by the dedicated Profile destination.","operationId":"get_api_profile_summary","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"summary":{"type":"object","properties":{"identity":{"type":"object","properties":{"avatar":{"anyOf":[{"type":"object","properties":{"assetID":{"type":"string","minLength":1},"byteSize":{"type":"integer","minimum":0,"maximum":9007199254740991},"contentType":{"type":"string","minLength":1},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"height":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}]},"urls":{"type":"object","properties":{"original":{"type":"object","properties":{"url":{"type":"string","format":"uri"}},"required":["url"],"additionalProperties":false},"thumbnail":{"type":"object","properties":{"url":{"type":"string","format":"uri"}},"required":["url"],"additionalProperties":false}},"required":["original","thumbnail"],"additionalProperties":false},"width":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}]}},"required":["assetID","byteSize","contentType","createdAt","height","urls","width"],"additionalProperties":false},{"type":"null"}]},"avatarURL":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"email":{"anyOf":[{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}]},"legacyAccountType":{"anyOf":[{"type":"string"},{"type":"null"}]},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"userID":{"type":"string","minLength":1}},"required":["avatar","avatarURL","email","legacyAccountType","name","userID"],"additionalProperties":false},"membership":{"type":"object","properties":{"endAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"plan":{"type":"string","minLength":1},"status":{"type":"string","minLength":1}},"required":["endAt","plan","status"],"additionalProperties":false},"sharing":{"type":"object","properties":{"availableBuddyPassCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"redeemedBuddyPassCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"sharedBuddyPassCount":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["availableBuddyPassCount","redeemedBuddyPassCount","sharedBuddyPassCount"],"additionalProperties":false},"support":{"type":"object","properties":{"activeForecastOverrideCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"debugToolsEnabled":{"type":"boolean"},"favoriteZoneCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"primaryFavoriteZoneID":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}]},"settingsUpdatedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]}},"required":["activeForecastOverrideCount","debugToolsEnabled","favoriteZoneCount","primaryFavoriteZoneID","settingsUpdatedAt"],"additionalProperties":false}},"required":["identity","membership","sharing","support"],"additionalProperties":false}},"required":["summary"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Load profile summary","tags":["Public Content"]}},"/api/profile/avatar/uploads/:sessionID":{"put":{"description":"Uploads an avatar payload into an existing avatar upload session.","operationId":"put_api_profile_avatar_uploads_sessionID","parameters":[{"example":"$avatarUploadSessionID","in":"path","name":"sessionID","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"example":{"contentType":"image/png","dataBase64":"<base64-avatar-payload>"},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"upload":{"type":"object","properties":{},"additionalProperties":{}}},"required":["upload"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Upload avatar session data","tags":["Public Content"]}},"/api/content/legal/:id":{"get":{"description":"Loads a specific hosted legal document by ID.","operationId":"get_api_content_legal_id","parameters":[{"example":"$firstLegalID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"summary":"Get legal document","tags":["Public Content"]}},"/api/content/legal":{"get":{"description":"Lists hosted legal documents.","operationId":"get_api_content_legal","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"summary":"List legal documents","tags":["Public Content"]}},"/api/catalog/incidents.geojson":{"get":{"description":"Loads the public incident catalog as GeoJSON.","operationId":"get_api_catalog_incidents_geojson","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"summary":"Load incidents catalog","tags":["Public Content"]}},"/api/catalog/routes.geojson":{"get":{"description":"Loads the normalized popular-route catalog as GeoJSON.","operationId":"get_api_catalog_routes_geojson","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"summary":"Load popular routes catalog","tags":["Public Content"]}},"/api/catalog/routes/:routeID/exposure":{"get":{"description":"Loads exposure summary for a public catalog route.","operationId":"get_api_catalog_routes_routeID_exposure","parameters":[{"example":"$firstCatalogRouteID","in":"path","name":"routeID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"exposure":{"type":"object","properties":{"dangerLevel":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"dangerLevelLabel":{"type":"string","enum":["low","moderate","considerable","high","extreme"]},"evaluationMode":{"type":"string","const":"explicitDangerLevel"},"routeID":{"type":"string"},"segments":{"type":"array","items":{"type":"object","properties":{"distanceMeters":{"type":"number"},"endIndex":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"exposureRating":{"type":"string","enum":["low","moderate","considerable","high","extreme"]},"slopeAngleEstimate":{"type":"number"},"startIndex":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["distanceMeters","endIndex","exposureRating","slopeAngleEstimate","startIndex"],"additionalProperties":false}},"summary":{"type":"object","properties":{"exposedDistanceMeters":{"type":"number"},"highestRisk":{"type":"string","enum":["low","moderate","considerable","high","extreme"]}},"required":["exposedDistanceMeters","highestRisk"],"additionalProperties":false}},"required":["dangerLevel","dangerLevelLabel","evaluationMode","routeID","segments","summary"],"additionalProperties":{}}},"required":["exposure"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"summary":"Load popular-route exposure","tags":["Public Content"]}},"/api/catalog/routes/:routeID/terrain-analysis":{"get":{"description":"Loads terrain analysis for a public catalog route.","operationId":"get_api_catalog_routes_routeID_terrain_analysis","parameters":[{"example":"$firstCatalogRouteID","in":"path","name":"routeID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"analysis":{"type":"object","properties":{"dangerLevel":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"exposureBudget":{"type":"object","properties":{"byDangerClass":{"type":"array","items":{"type":"object","properties":{"distanceMeters":{"type":"number"},"key":{"type":"string"}},"required":["distanceMeters","key"],"additionalProperties":false}},"byProblemToken":{"type":"array","items":{"type":"object","properties":{"distanceMeters":{"type":"number"},"token":{"type":"string"}},"required":["distanceMeters","token"],"additionalProperties":false}}},"required":["byDangerClass","byProblemToken"],"additionalProperties":false},"footprintRose":{"type":"object","properties":{"aspectSource":{"type":"string"},"cells":{"type":"array","items":{"type":"object","properties":{"aspect":{"type":"string"},"distanceMeters":{"type":"number"},"elevationBand":{"type":"string"},"matchedProblemDistanceMeters":{"type":"number"}},"required":["aspect","distanceMeters","elevationBand","matchedProblemDistanceMeters"],"additionalProperties":false}},"confidence":{"type":"string"},"elevationBandSource":{"type":"string"}},"required":["aspectSource","cells","confidence","elevationBandSource"],"additionalProperties":false},"matchedForecastZones":{"type":"array","items":{"type":"object","properties":{"sampleCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"zoneID":{"type":"string"},"zoneName":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["sampleCount","zoneID","zoneName"],"additionalProperties":false}},"profile":{"type":"object","properties":{"sampleSpacingMeters":{"type":"number"},"samples":{"type":"array","items":{"type":"object","properties":{"dangerClass":{"anyOf":[{"type":"string"},{"type":"null"}]},"distanceMeters":{"type":"number"},"elevationMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"forecastZoneID":{"anyOf":[{"type":"string"},{"type":"null"}]},"inferredElevationBand":{"anyOf":[{"type":"string"},{"type":"null"}]},"latitude":{"type":"number"},"longitude":{"type":"number"},"matchingProblemTokens":{"type":"array","items":{"type":"string"}},"slopeDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"terrainAspect":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["dangerClass","distanceMeters","elevationMeters","forecastZoneID","inferredElevationBand","latitude","longitude","matchingProblemTokens","slopeDegrees","terrainAspect"],"additionalProperties":false}},"totalDistanceMeters":{"type":"number"}},"required":["sampleSpacingMeters","samples","totalDistanceMeters"],"additionalProperties":false},"slopeDistribution":{"type":"array","items":{"type":"object","properties":{"bucket":{"type":"string","enum":["<30","30-34","35-39","40+"]},"distanceMeters":{"type":"number"}},"required":["bucket","distanceMeters"],"additionalProperties":false}},"slopeGuidance":{"type":"object","properties":{},"additionalProperties":{}},"warnings":{"type":"array","items":{"type":"string"}}},"required":["dangerLevel","exposureBudget","footprintRose","matchedForecastZones","profile","slopeDistribution","slopeGuidance","warnings"],"additionalProperties":false}},"required":["analysis"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"summary":"Load popular-route terrain analysis","tags":["Public Content"]}},"/api/incidents/:incidentID":{"get":{"description":"Loads a single incident detail payload.","operationId":"get_api_incidents_incidentID","parameters":[{"example":"$firstIncidentID","in":"path","name":"incidentID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"summary":"Load incident detail","tags":["Public Content"]}},"/api/user/education":{"get":{"description":"Loads the user-specific education progress state and recommendations.","operationId":"get_api_user_education","parameters":[{"in":"query","name":"onboardingHint","required":false,"schema":{"type":"string","minLength":1,"maxLength":120}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Load education progress","tags":["Education"]}},"/api/user/education/:educationID/events":{"post":{"description":"Records an education-progress event for the signed-in user.","operationId":"post_api_user_education_educationID_events","parameters":[{"example":"$firstEducationID","in":"path","name":"educationID","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"example":{"event":"started","sourceHint":"hosted-docs"},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"event":{"type":"string","enum":["completed","presented","skipped","started"]},"sourceHint":{"type":"string","minLength":1,"maxLength":120}},"required":["event"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Record education progress","tags":["Education"]}},"/api/forecast":{"get":{"description":"Loads the normalized forecast snapshot for a selected UTC date. This is the main zone payload used across map, brief, and detail surfaces.","operationId":"get_api_forecast","parameters":[{"in":"query","name":"date","required":true,"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"forecasts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"origin":{"type":"string"},"queriedAt":{"type":"string"},"revisionID":{"type":"string"},"warning":{"type":"string"}},"required":["forecasts","origin","queriedAt","revisionID"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Load forecast snapshot","tags":["Forecast & Home"]}},"/api/forecast/briefs":{"get":{"description":"Loads briefing payloads for multiple zones at once.","operationId":"get_api_forecast_briefs","parameters":[{"in":"query","name":"zoneIDs","required":true,"schema":{"type":"string","minLength":1}},{"in":"query","name":"revisionID","required":false,"schema":{"type":"string","minLength":1}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"briefs":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}}},"required":["briefs"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Load multiple forecast briefs","tags":["Forecast & Home"]}},"/api/forecast/brief":{"get":{"description":"Loads a single-zone briefing payload for a specific forecast zone.","operationId":"get_api_forecast_brief","parameters":[{"in":"query","name":"zoneID","required":true,"schema":{"type":"string","minLength":1}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"briefs":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}}},"required":["briefs"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Load one forecast brief","tags":["Forecast & Home"]}},"/api/summaries/home":{"get":{"description":"Returns the backend-owned home summary used by iOS and web surfaces.","operationId":"get_api_summaries_home","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"summary":{"type":"object","properties":{},"additionalProperties":{}}},"required":["summary"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Load home summary","tags":["Forecast & Home"]}},"/api/changes":{"get":{"description":"Returns the current cross-domain change token feed used for lightweight freshness checks.","operationId":"get_api_changes","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Load change feed","tags":["Forecast & Home"]}},"/api/routes":{"post":{"description":"Creates or updates a saved user route from route payload input.","operationId":"post_api_routes","parameters":[],"requestBody":{"content":{"application/json":{"example":{"geometry":{"points":[{"latitude":39.6425,"longitude":-105.8716},{"latitude":39.644,"longitude":-105.8683},{"latitude":39.6451,"longitude":-105.8652}]},"metrics":{"altitudeClimbed":180,"altitudeDescended":180,"distanceMeters":920},"presentation":{"colorToken":"glacier"},"source":"manual","title":"Docs Sample Route"},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"endedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"geometry":{"type":"object","properties":{"points":{"type":"array","items":{"type":"object","properties":{"elevationMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"latitude":{"type":"number"},"longitude":{"type":"number"},"recordedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]}},"required":["latitude","longitude"],"additionalProperties":false}}},"required":["points"],"additionalProperties":false},"id":{"type":"string"},"isShared":{"default":false,"type":"boolean"},"lifecycle":{"type":"string","enum":["draft","saved","recording","completed","archived"]},"mapboxFeatureID":{"anyOf":[{"type":"string"},{"type":"null"}]},"metrics":{"type":"object","properties":{"altitudeClimbed":{"default":0,"type":"number"},"altitudeDescended":{"default":0,"type":"number"},"distanceMeters":{"default":0,"type":"number"},"durationSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"endAltitude":{"anyOf":[{"type":"number"},{"type":"null"}]},"estimatedDurationSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"maximumAltitudeMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"minimumAltitudeMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"startAltitude":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["altitudeClimbed","altitudeDescended","distanceMeters"],"additionalProperties":false},"notes":{"default":"","type":"string"},"ownerDisplayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"ownerUserID":{"anyOf":[{"type":"string"},{"type":"null"}]},"presentation":{"default":{"colorToken":"glacier"},"type":"object","properties":{"colorToken":{"default":"glacier","type":"string","enum":["glacier","forest","sunset","gold","violet","graphite"]}},"required":["colorToken"],"additionalProperties":false},"safety":{"anyOf":[{"type":"object","properties":{"computedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"dangerLevel":{"type":"number"},"dangerLevelLabel":{"type":"string","enum":["low","moderate","considerable","high","extreme"]},"evaluationMode":{"type":"string","const":"explicitDangerLevel"},"exposedDistanceMeters":{"type":"number"},"forecastSnapshotRevision":{"anyOf":[{"type":"string"},{"type":"null"}]},"highestRisk":{"type":"string","enum":["low","moderate","considerable","high","extreme"]},"isStale":{"type":"boolean"},"sourceRouteRevision":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["computedAt","dangerLevel","dangerLevelLabel","evaluationMode","exposedDistanceMeters","forecastSnapshotRevision","highestRisk","isStale","sourceRouteRevision"],"additionalProperties":false},{"type":"null"}]},"shareableID":{"anyOf":[{"type":"string"},{"type":"null"}]},"slopeRating":{"anyOf":[{"type":"string","enum":["green","blue","black","double-black"]},{"type":"null"}]},"source":{"default":"manual","type":"string","enum":["catalog","manual","tracked","imported"]},"startedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"title":{"default":"Untitled Route","type":"string"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["geometry","metrics","source","title"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"route":{"type":"object","properties":{"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"endedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"geometry":{"type":"object","properties":{"points":{"type":"array","items":{"type":"object","properties":{"elevationMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"latitude":{"type":"number"},"longitude":{"type":"number"},"recordedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]}},"required":["latitude","longitude"],"additionalProperties":false}}},"required":["points"],"additionalProperties":false},"id":{"type":"string"},"isShared":{"default":false,"type":"boolean"},"lifecycle":{"type":"string","enum":["draft","saved","recording","completed","archived"]},"mapboxFeatureID":{"anyOf":[{"type":"string"},{"type":"null"}]},"metrics":{"type":"object","properties":{"altitudeClimbed":{"default":0,"type":"number"},"altitudeDescended":{"default":0,"type":"number"},"distanceMeters":{"default":0,"type":"number"},"durationSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"endAltitude":{"anyOf":[{"type":"number"},{"type":"null"}]},"estimatedDurationSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"maximumAltitudeMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"minimumAltitudeMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"startAltitude":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["altitudeClimbed","altitudeDescended","distanceMeters"],"additionalProperties":false},"notes":{"default":"","type":"string"},"ownerDisplayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"ownerUserID":{"anyOf":[{"type":"string"},{"type":"null"}]},"presentation":{"default":{"colorToken":"glacier"},"type":"object","properties":{"colorToken":{"default":"glacier","type":"string","enum":["glacier","forest","sunset","gold","violet","graphite"]}},"required":["colorToken"],"additionalProperties":false},"safety":{"anyOf":[{"type":"object","properties":{"computedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"dangerLevel":{"type":"number"},"dangerLevelLabel":{"type":"string","enum":["low","moderate","considerable","high","extreme"]},"evaluationMode":{"type":"string","const":"explicitDangerLevel"},"exposedDistanceMeters":{"type":"number"},"forecastSnapshotRevision":{"anyOf":[{"type":"string"},{"type":"null"}]},"highestRisk":{"type":"string","enum":["low","moderate","considerable","high","extreme"]},"isStale":{"type":"boolean"},"sourceRouteRevision":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["computedAt","dangerLevel","dangerLevelLabel","evaluationMode","exposedDistanceMeters","forecastSnapshotRevision","highestRisk","isStale","sourceRouteRevision"],"additionalProperties":false},{"type":"null"}]},"shareableID":{"anyOf":[{"type":"string"},{"type":"null"}]},"slopeRating":{"anyOf":[{"type":"string","enum":["green","blue","black","double-black"]},{"type":"null"}]},"source":{"type":"string","enum":["catalog","manual","tracked","imported"]},"startedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"title":{"type":"string"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["createdAt","endedAt","geometry","id","isShared","lifecycle","mapboxFeatureID","metrics","notes","ownerDisplayName","ownerUserID","presentation","source","startedAt","title","updatedAt"],"additionalProperties":false}},"required":["route"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Create a route","tags":["Routes, Plans & Library"]},"get":{"description":"Lists the signed-in user’s saved routes.","operationId":"get_api_routes","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"routes":{"type":"array","items":{"type":"object","properties":{"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"endedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"geometry":{"type":"object","properties":{"points":{"type":"array","items":{"type":"object","properties":{"elevationMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"latitude":{"type":"number"},"longitude":{"type":"number"},"recordedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]}},"required":["latitude","longitude"],"additionalProperties":false}}},"required":["points"],"additionalProperties":false},"id":{"type":"string"},"isShared":{"default":false,"type":"boolean"},"lifecycle":{"type":"string","enum":["draft","saved","recording","completed","archived"]},"mapboxFeatureID":{"anyOf":[{"type":"string"},{"type":"null"}]},"metrics":{"type":"object","properties":{"altitudeClimbed":{"default":0,"type":"number"},"altitudeDescended":{"default":0,"type":"number"},"distanceMeters":{"default":0,"type":"number"},"durationSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"endAltitude":{"anyOf":[{"type":"number"},{"type":"null"}]},"estimatedDurationSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"maximumAltitudeMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"minimumAltitudeMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"startAltitude":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["altitudeClimbed","altitudeDescended","distanceMeters"],"additionalProperties":false},"notes":{"default":"","type":"string"},"ownerDisplayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"ownerUserID":{"anyOf":[{"type":"string"},{"type":"null"}]},"presentation":{"default":{"colorToken":"glacier"},"type":"object","properties":{"colorToken":{"default":"glacier","type":"string","enum":["glacier","forest","sunset","gold","violet","graphite"]}},"required":["colorToken"],"additionalProperties":false},"safety":{"anyOf":[{"type":"object","properties":{"computedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"dangerLevel":{"type":"number"},"dangerLevelLabel":{"type":"string","enum":["low","moderate","considerable","high","extreme"]},"evaluationMode":{"type":"string","const":"explicitDangerLevel"},"exposedDistanceMeters":{"type":"number"},"forecastSnapshotRevision":{"anyOf":[{"type":"string"},{"type":"null"}]},"highestRisk":{"type":"string","enum":["low","moderate","considerable","high","extreme"]},"isStale":{"type":"boolean"},"sourceRouteRevision":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["computedAt","dangerLevel","dangerLevelLabel","evaluationMode","exposedDistanceMeters","forecastSnapshotRevision","highestRisk","isStale","sourceRouteRevision"],"additionalProperties":false},{"type":"null"}]},"shareableID":{"anyOf":[{"type":"string"},{"type":"null"}]},"slopeRating":{"anyOf":[{"type":"string","enum":["green","blue","black","double-black"]},{"type":"null"}]},"source":{"type":"string","enum":["catalog","manual","tracked","imported"]},"startedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"title":{"type":"string"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["createdAt","endedAt","geometry","id","isShared","lifecycle","mapboxFeatureID","metrics","notes","ownerDisplayName","ownerUserID","presentation","source","startedAt","title","updatedAt"],"additionalProperties":false}}},"required":["routes"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"List routes","tags":["Routes, Plans & Library"]}},"/api/routes/:routeID":{"delete":{"description":"Soft-deletes a saved route.","operationId":"delete_api_routes_routeID","parameters":[{"example":"$firstRouteID","in":"path","name":"routeID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Delete a route","tags":["Routes, Plans & Library"]},"get":{"description":"Loads a specific saved route for the signed-in user.","operationId":"get_api_routes_routeID","parameters":[{"example":"$firstRouteID","in":"path","name":"routeID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"route":{"type":"object","properties":{"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"endedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"geometry":{"type":"object","properties":{"points":{"type":"array","items":{"type":"object","properties":{"elevationMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"latitude":{"type":"number"},"longitude":{"type":"number"},"recordedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]}},"required":["latitude","longitude"],"additionalProperties":false}}},"required":["points"],"additionalProperties":false},"id":{"type":"string"},"isShared":{"default":false,"type":"boolean"},"lifecycle":{"type":"string","enum":["draft","saved","recording","completed","archived"]},"mapboxFeatureID":{"anyOf":[{"type":"string"},{"type":"null"}]},"metrics":{"type":"object","properties":{"altitudeClimbed":{"default":0,"type":"number"},"altitudeDescended":{"default":0,"type":"number"},"distanceMeters":{"default":0,"type":"number"},"durationSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"endAltitude":{"anyOf":[{"type":"number"},{"type":"null"}]},"estimatedDurationSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"maximumAltitudeMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"minimumAltitudeMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"startAltitude":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["altitudeClimbed","altitudeDescended","distanceMeters"],"additionalProperties":false},"notes":{"default":"","type":"string"},"ownerDisplayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"ownerUserID":{"anyOf":[{"type":"string"},{"type":"null"}]},"presentation":{"default":{"colorToken":"glacier"},"type":"object","properties":{"colorToken":{"default":"glacier","type":"string","enum":["glacier","forest","sunset","gold","violet","graphite"]}},"required":["colorToken"],"additionalProperties":false},"safety":{"anyOf":[{"type":"object","properties":{"computedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"dangerLevel":{"type":"number"},"dangerLevelLabel":{"type":"string","enum":["low","moderate","considerable","high","extreme"]},"evaluationMode":{"type":"string","const":"explicitDangerLevel"},"exposedDistanceMeters":{"type":"number"},"forecastSnapshotRevision":{"anyOf":[{"type":"string"},{"type":"null"}]},"highestRisk":{"type":"string","enum":["low","moderate","considerable","high","extreme"]},"isStale":{"type":"boolean"},"sourceRouteRevision":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["computedAt","dangerLevel","dangerLevelLabel","evaluationMode","exposedDistanceMeters","forecastSnapshotRevision","highestRisk","isStale","sourceRouteRevision"],"additionalProperties":false},{"type":"null"}]},"shareableID":{"anyOf":[{"type":"string"},{"type":"null"}]},"slopeRating":{"anyOf":[{"type":"string","enum":["green","blue","black","double-black"]},{"type":"null"}]},"source":{"type":"string","enum":["catalog","manual","tracked","imported"]},"startedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"title":{"type":"string"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["createdAt","endedAt","geometry","id","isShared","lifecycle","mapboxFeatureID","metrics","notes","ownerDisplayName","ownerUserID","presentation","source","startedAt","title","updatedAt"],"additionalProperties":false}},"required":["route"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Get a route","tags":["Routes, Plans & Library"]}},"/api/routes/shared/:shareableID":{"get":{"description":"Loads a shared route snapshot by shareable ID.","operationId":"get_api_routes_shared_shareableID","parameters":[{"example":"$firstRouteShareableID","in":"path","name":"shareableID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"route":{"type":"object","properties":{"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"endedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"geometry":{"type":"object","properties":{"points":{"type":"array","items":{"type":"object","properties":{"elevationMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"latitude":{"type":"number"},"longitude":{"type":"number"},"recordedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]}},"required":["latitude","longitude"],"additionalProperties":false}}},"required":["points"],"additionalProperties":false},"id":{"type":"string"},"isShared":{"default":false,"type":"boolean"},"lifecycle":{"type":"string","enum":["draft","saved","recording","completed","archived"]},"mapboxFeatureID":{"anyOf":[{"type":"string"},{"type":"null"}]},"metrics":{"type":"object","properties":{"altitudeClimbed":{"default":0,"type":"number"},"altitudeDescended":{"default":0,"type":"number"},"distanceMeters":{"default":0,"type":"number"},"durationSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"endAltitude":{"anyOf":[{"type":"number"},{"type":"null"}]},"estimatedDurationSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"maximumAltitudeMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"minimumAltitudeMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"startAltitude":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["altitudeClimbed","altitudeDescended","distanceMeters"],"additionalProperties":false},"notes":{"default":"","type":"string"},"ownerDisplayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"ownerUserID":{"anyOf":[{"type":"string"},{"type":"null"}]},"presentation":{"default":{"colorToken":"glacier"},"type":"object","properties":{"colorToken":{"default":"glacier","type":"string","enum":["glacier","forest","sunset","gold","violet","graphite"]}},"required":["colorToken"],"additionalProperties":false},"safety":{"anyOf":[{"type":"object","properties":{"computedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"dangerLevel":{"type":"number"},"dangerLevelLabel":{"type":"string","enum":["low","moderate","considerable","high","extreme"]},"evaluationMode":{"type":"string","const":"explicitDangerLevel"},"exposedDistanceMeters":{"type":"number"},"forecastSnapshotRevision":{"anyOf":[{"type":"string"},{"type":"null"}]},"highestRisk":{"type":"string","enum":["low","moderate","considerable","high","extreme"]},"isStale":{"type":"boolean"},"sourceRouteRevision":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["computedAt","dangerLevel","dangerLevelLabel","evaluationMode","exposedDistanceMeters","forecastSnapshotRevision","highestRisk","isStale","sourceRouteRevision"],"additionalProperties":false},{"type":"null"}]},"shareableID":{"anyOf":[{"type":"string"},{"type":"null"}]},"slopeRating":{"anyOf":[{"type":"string","enum":["green","blue","black","double-black"]},{"type":"null"}]},"source":{"type":"string","enum":["catalog","manual","tracked","imported"]},"startedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"title":{"type":"string"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["createdAt","endedAt","geometry","id","isShared","lifecycle","mapboxFeatureID","metrics","notes","ownerDisplayName","ownerUserID","presentation","source","startedAt","title","updatedAt"],"additionalProperties":false}},"required":["route"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"summary":"Get a shared route","tags":["Routes, Plans & Library"]}},"/api/tour-plans":{"get":{"description":"Load Tour-plans through the Routes, Plans & Library contract. This endpoint is part of the canonical routes surface.","operationId":"get_api_tour_plans","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Load Tour-plans","tags":["Routes, Plans & Library"]},"post":{"description":"Submit Tour-plans through the Routes, Plans & Library contract. This endpoint is part of the canonical routes surface.","operationId":"post_api_tour_plans","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Submit Tour-plans","tags":["Routes, Plans & Library"]}},"/api/tours":{"get":{"description":"Load Tours through the Routes, Plans & Library contract. This endpoint is part of the canonical routes surface.","operationId":"get_api_tours","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Load Tours","tags":["Routes, Plans & Library"]},"post":{"description":"Submit Tours through the Routes, Plans & Library contract. This endpoint is part of the canonical routes surface.","operationId":"post_api_tours","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Submit Tours","tags":["Routes, Plans & Library"]}},"/api/route-plans/shared/:shareableID/copies":{"post":{"description":"Creates a user-owned imported copy of a shared route plan.","operationId":"post_api_route_plans_shared_shareableID_copies","parameters":[{"example":"$firstPlanShareableID","in":"path","name":"shareableID","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"example":{"makePreferred":true},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"makePreferred":{"type":"boolean"}},"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"plan":{"type":"object","properties":{"contentHash":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"date":{"type":"string"},"description":{"type":"string"},"friends":{"type":"array","items":{"type":"object","properties":{"ability":{"type":"string"},"fitness":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"risk":{"type":"string"},"userID":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["ability","fitness","id","name","risk"],"additionalProperties":false}},"id":{"type":"string"},"importLineage":{"anyOf":[{"type":"object","properties":{"importedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"isPreferred":{"type":"boolean"},"sourceOwnerUserID":{"type":"string"},"sourcePlanID":{"type":"string"},"sourceRevisionID":{"type":"string"},"sourceShareableID":{"type":"string"},"sourceUpdatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["importedAt","isPreferred","sourceOwnerUserID","sourcePlanID","sourceRevisionID","sourceShareableID","sourceUpdatedAt"],"additionalProperties":false},{"type":"null"}]},"mapViewState":{"anyOf":[{"type":"object","properties":{"bearing":{"type":"number"},"center":{"type":"array","prefixItems":[{"type":"number"},{"type":"number"}]},"pitch":{"type":"number"},"zoom":{"type":"number"}},"required":["bearing","center","pitch","zoom"],"additionalProperties":false},{"type":"null"}]},"mode":{"type":"string","enum":["stomp","glide","roar"]},"name":{"type":"string"},"notifyEmergencyContacts":{"type":"boolean"},"ownerUserID":{"type":"string"},"planBRoutes":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"catalog"},"routeID":{"type":"string"}},"required":["kind","routeID"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"saved"},"ownerUserID":{"anyOf":[{"type":"string"},{"type":"null"}]},"routeID":{"type":"string"}},"required":["kind","routeID"],"additionalProperties":false}]}},"revisionID":{"anyOf":[{"type":"string"},{"type":"null"}]},"routes":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"catalog"},"routeID":{"type":"string"}},"required":["kind","routeID"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"saved"},"ownerUserID":{"anyOf":[{"type":"string"},{"type":"null"}]},"routeID":{"type":"string"}},"required":["kind","routeID"],"additionalProperties":false}]}},"shareableID":{"type":"string"},"goals":{"type":"array","items":{"type":"string"}},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["createdAt","date","description","friends","id","mode","name","notifyEmergencyContacts","ownerUserID","planBRoutes","routes","shareableID","goals","updatedAt"],"additionalProperties":false}},"required":["plan"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"summary":"Copy a shared route plan","tags":["Routes, Plans & Library"]}},"/api/route-plans":{"post":{"description":"Creates or updates a route plan.","operationId":"post_api_route_plans","parameters":[],"requestBody":{"content":{"application/json":{"example":{"date":"2026-04-13","description":"Docs-created route plan for API validation.","goals":["Validate the route plan APIs from hosted docs."],"mode":"glide","name":"Docs Sample Plan","notifyEmergencyContacts":false,"participants":[],"planBRoutes":[],"routes":[]},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"contentHash":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"date":{"default":"","type":"string"},"description":{"default":"","type":"string"},"friends":{"default":[],"type":"array","items":{"type":"object","properties":{"ability":{"type":"string"},"fitness":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"risk":{"type":"string"},"userID":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["ability","fitness","id","name","risk"],"additionalProperties":false}},"id":{"type":"string"},"importLineage":{"anyOf":[{"type":"object","properties":{"importedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"isPreferred":{"type":"boolean"},"sourceOwnerUserID":{"type":"string"},"sourcePlanID":{"type":"string"},"sourceRevisionID":{"type":"string"},"sourceShareableID":{"type":"string"},"sourceUpdatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["importedAt","isPreferred","sourceOwnerUserID","sourcePlanID","sourceRevisionID","sourceShareableID","sourceUpdatedAt"],"additionalProperties":false},{"type":"null"}]},"mapViewState":{"anyOf":[{"type":"object","properties":{"bearing":{"type":"number"},"center":{"type":"array","prefixItems":[{"type":"number"},{"type":"number"}]},"pitch":{"type":"number"},"zoom":{"type":"number"}},"required":["bearing","center","pitch","zoom"],"additionalProperties":false},{"type":"null"}]},"mode":{"default":"glide","type":"string","enum":["stomp","glide","roar"]},"name":{"type":"string","minLength":1},"notifyEmergencyContacts":{"default":false,"type":"boolean"},"ownerUserID":{"type":"string"},"planBRoutes":{"default":[],"type":"array","items":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"catalog"},"routeID":{"type":"string"}},"required":["kind","routeID"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"saved"},"ownerUserID":{"anyOf":[{"type":"string"},{"type":"null"}]},"routeID":{"type":"string"}},"required":["kind","routeID"],"additionalProperties":false}]}},"revisionID":{"anyOf":[{"type":"string"},{"type":"null"}]},"routes":{"default":[],"type":"array","items":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"catalog"},"routeID":{"type":"string"}},"required":["kind","routeID"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"saved"},"ownerUserID":{"anyOf":[{"type":"string"},{"type":"null"}]},"routeID":{"type":"string"}},"required":["kind","routeID"],"additionalProperties":false}]}},"shareableID":{"type":"string"},"goals":{"default":[],"type":"array","items":{"type":"string"}},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"importSource":{"anyOf":[{"type":"object","properties":{"sourceOwnerUserID":{"type":"string"},"sourcePlanID":{"type":"string"},"sourceRevisionID":{"type":"string"},"sourceShareableID":{"type":"string"},"sourceSnapshot":{"default":{},"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"sourceUpdatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["sourceOwnerUserID","sourcePlanID","sourceRevisionID","sourceShareableID","sourceSnapshot","sourceUpdatedAt"],"additionalProperties":false},{"type":"null"}]}},"required":["date","description","friends","mode","name","notifyEmergencyContacts","planBRoutes","routes","goals"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"plan":{"type":"object","properties":{"contentHash":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"date":{"type":"string"},"description":{"type":"string"},"friends":{"type":"array","items":{"type":"object","properties":{"ability":{"type":"string"},"fitness":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"risk":{"type":"string"},"userID":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["ability","fitness","id","name","risk"],"additionalProperties":false}},"id":{"type":"string"},"importLineage":{"anyOf":[{"type":"object","properties":{"importedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"isPreferred":{"type":"boolean"},"sourceOwnerUserID":{"type":"string"},"sourcePlanID":{"type":"string"},"sourceRevisionID":{"type":"string"},"sourceShareableID":{"type":"string"},"sourceUpdatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["importedAt","isPreferred","sourceOwnerUserID","sourcePlanID","sourceRevisionID","sourceShareableID","sourceUpdatedAt"],"additionalProperties":false},{"type":"null"}]},"mapViewState":{"anyOf":[{"type":"object","properties":{"bearing":{"type":"number"},"center":{"type":"array","prefixItems":[{"type":"number"},{"type":"number"}]},"pitch":{"type":"number"},"zoom":{"type":"number"}},"required":["bearing","center","pitch","zoom"],"additionalProperties":false},{"type":"null"}]},"mode":{"type":"string","enum":["stomp","glide","roar"]},"name":{"type":"string"},"notifyEmergencyContacts":{"type":"boolean"},"ownerUserID":{"type":"string"},"planBRoutes":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"catalog"},"routeID":{"type":"string"}},"required":["kind","routeID"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"saved"},"ownerUserID":{"anyOf":[{"type":"string"},{"type":"null"}]},"routeID":{"type":"string"}},"required":["kind","routeID"],"additionalProperties":false}]}},"revisionID":{"anyOf":[{"type":"string"},{"type":"null"}]},"routes":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"catalog"},"routeID":{"type":"string"}},"required":["kind","routeID"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"saved"},"ownerUserID":{"anyOf":[{"type":"string"},{"type":"null"}]},"routeID":{"type":"string"}},"required":["kind","routeID"],"additionalProperties":false}]}},"shareableID":{"type":"string"},"goals":{"type":"array","items":{"type":"string"}},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["createdAt","date","description","friends","id","mode","name","notifyEmergencyContacts","ownerUserID","planBRoutes","routes","shareableID","goals","updatedAt"],"additionalProperties":false}},"required":["plan"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Create a route plan","tags":["Routes, Plans & Library"]},"get":{"description":"Lists the signed-in user’s route plans.","operationId":"get_api_route_plans","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"plans":{"type":"array","items":{"type":"object","properties":{"contentHash":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"date":{"type":"string"},"description":{"type":"string"},"friends":{"type":"array","items":{"type":"object","properties":{"ability":{"type":"string"},"fitness":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"risk":{"type":"string"},"userID":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["ability","fitness","id","name","risk"],"additionalProperties":false}},"id":{"type":"string"},"importLineage":{"anyOf":[{"type":"object","properties":{"importedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"isPreferred":{"type":"boolean"},"sourceOwnerUserID":{"type":"string"},"sourcePlanID":{"type":"string"},"sourceRevisionID":{"type":"string"},"sourceShareableID":{"type":"string"},"sourceUpdatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["importedAt","isPreferred","sourceOwnerUserID","sourcePlanID","sourceRevisionID","sourceShareableID","sourceUpdatedAt"],"additionalProperties":false},{"type":"null"}]},"mapViewState":{"anyOf":[{"type":"object","properties":{"bearing":{"type":"number"},"center":{"type":"array","prefixItems":[{"type":"number"},{"type":"number"}]},"pitch":{"type":"number"},"zoom":{"type":"number"}},"required":["bearing","center","pitch","zoom"],"additionalProperties":false},{"type":"null"}]},"mode":{"type":"string","enum":["stomp","glide","roar"]},"name":{"type":"string"},"notifyEmergencyContacts":{"type":"boolean"},"ownerUserID":{"type":"string"},"planBRoutes":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"catalog"},"routeID":{"type":"string"}},"required":["kind","routeID"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"saved"},"ownerUserID":{"anyOf":[{"type":"string"},{"type":"null"}]},"routeID":{"type":"string"}},"required":["kind","routeID"],"additionalProperties":false}]}},"revisionID":{"anyOf":[{"type":"string"},{"type":"null"}]},"routes":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"catalog"},"routeID":{"type":"string"}},"required":["kind","routeID"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"saved"},"ownerUserID":{"anyOf":[{"type":"string"},{"type":"null"}]},"routeID":{"type":"string"}},"required":["kind","routeID"],"additionalProperties":false}]}},"shareableID":{"type":"string"},"goals":{"type":"array","items":{"type":"string"}},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["createdAt","date","description","friends","id","mode","name","notifyEmergencyContacts","ownerUserID","planBRoutes","routes","shareableID","goals","updatedAt"],"additionalProperties":false}}},"required":["plans"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"List route plans","tags":["Routes, Plans & Library"]}},"/api/route-plans/:planID":{"delete":{"description":"Soft-deletes a route plan.","operationId":"delete_api_route_plans_planID","parameters":[{"example":"$firstPlanID","in":"path","name":"planID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Delete a route plan","tags":["Routes, Plans & Library"]},"get":{"description":"Loads a specific route plan.","operationId":"get_api_route_plans_planID","parameters":[{"example":"$firstPlanID","in":"path","name":"planID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"plan":{"type":"object","properties":{"contentHash":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"date":{"type":"string"},"description":{"type":"string"},"friends":{"type":"array","items":{"type":"object","properties":{"ability":{"type":"string"},"fitness":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"risk":{"type":"string"},"userID":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["ability","fitness","id","name","risk"],"additionalProperties":false}},"id":{"type":"string"},"importLineage":{"anyOf":[{"type":"object","properties":{"importedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"isPreferred":{"type":"boolean"},"sourceOwnerUserID":{"type":"string"},"sourcePlanID":{"type":"string"},"sourceRevisionID":{"type":"string"},"sourceShareableID":{"type":"string"},"sourceUpdatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["importedAt","isPreferred","sourceOwnerUserID","sourcePlanID","sourceRevisionID","sourceShareableID","sourceUpdatedAt"],"additionalProperties":false},{"type":"null"}]},"mapViewState":{"anyOf":[{"type":"object","properties":{"bearing":{"type":"number"},"center":{"type":"array","prefixItems":[{"type":"number"},{"type":"number"}]},"pitch":{"type":"number"},"zoom":{"type":"number"}},"required":["bearing","center","pitch","zoom"],"additionalProperties":false},{"type":"null"}]},"mode":{"type":"string","enum":["stomp","glide","roar"]},"name":{"type":"string"},"notifyEmergencyContacts":{"type":"boolean"},"ownerUserID":{"type":"string"},"planBRoutes":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"catalog"},"routeID":{"type":"string"}},"required":["kind","routeID"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"saved"},"ownerUserID":{"anyOf":[{"type":"string"},{"type":"null"}]},"routeID":{"type":"string"}},"required":["kind","routeID"],"additionalProperties":false}]}},"revisionID":{"anyOf":[{"type":"string"},{"type":"null"}]},"routes":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"catalog"},"routeID":{"type":"string"}},"required":["kind","routeID"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"saved"},"ownerUserID":{"anyOf":[{"type":"string"},{"type":"null"}]},"routeID":{"type":"string"}},"required":["kind","routeID"],"additionalProperties":false}]}},"shareableID":{"type":"string"},"goals":{"type":"array","items":{"type":"string"}},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["createdAt","date","description","friends","id","mode","name","notifyEmergencyContacts","ownerUserID","planBRoutes","routes","shareableID","goals","updatedAt"],"additionalProperties":false}},"required":["plan"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Get a route plan","tags":["Routes, Plans & Library"]}},"/api/route-plans/shared/:shareableID":{"get":{"description":"Loads a shared route plan by shareable ID.","operationId":"get_api_route_plans_shared_shareableID","parameters":[{"example":"$firstPlanShareableID","in":"path","name":"shareableID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"plan":{"type":"object","properties":{"contentHash":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"date":{"type":"string"},"description":{"type":"string"},"friends":{"type":"array","items":{"type":"object","properties":{"ability":{"type":"string"},"fitness":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"risk":{"type":"string"},"userID":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["ability","fitness","id","name","risk"],"additionalProperties":false}},"id":{"type":"string"},"importLineage":{"anyOf":[{"type":"object","properties":{"importedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"isPreferred":{"type":"boolean"},"sourceOwnerUserID":{"type":"string"},"sourcePlanID":{"type":"string"},"sourceRevisionID":{"type":"string"},"sourceShareableID":{"type":"string"},"sourceUpdatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["importedAt","isPreferred","sourceOwnerUserID","sourcePlanID","sourceRevisionID","sourceShareableID","sourceUpdatedAt"],"additionalProperties":false},{"type":"null"}]},"mapViewState":{"anyOf":[{"type":"object","properties":{"bearing":{"type":"number"},"center":{"type":"array","prefixItems":[{"type":"number"},{"type":"number"}]},"pitch":{"type":"number"},"zoom":{"type":"number"}},"required":["bearing","center","pitch","zoom"],"additionalProperties":false},{"type":"null"}]},"mode":{"type":"string","enum":["stomp","glide","roar"]},"name":{"type":"string"},"notifyEmergencyContacts":{"type":"boolean"},"ownerUserID":{"type":"string"},"planBRoutes":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"catalog"},"routeID":{"type":"string"}},"required":["kind","routeID"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"saved"},"ownerUserID":{"anyOf":[{"type":"string"},{"type":"null"}]},"routeID":{"type":"string"}},"required":["kind","routeID"],"additionalProperties":false}]}},"revisionID":{"anyOf":[{"type":"string"},{"type":"null"}]},"routes":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"catalog"},"routeID":{"type":"string"}},"required":["kind","routeID"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"saved"},"ownerUserID":{"anyOf":[{"type":"string"},{"type":"null"}]},"routeID":{"type":"string"}},"required":["kind","routeID"],"additionalProperties":false}]}},"shareableID":{"type":"string"},"goals":{"type":"array","items":{"type":"string"}},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["createdAt","date","description","friends","id","mode","name","notifyEmergencyContacts","ownerUserID","planBRoutes","routes","shareableID","goals","updatedAt"],"additionalProperties":false}},"required":["plan"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"summary":"Get a shared route plan","tags":["Routes, Plans & Library"]}},"/api/route-plans/shared/:shareableID/context":{"get":{"description":"Loads the hosted import and continuation context for a shared route plan.","operationId":"get_api_route_plans_shared_shareableID_context","parameters":[{"example":"$firstPlanShareableID","in":"path","name":"shareableID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"summary":"Get shared route-plan context","tags":["Routes, Plans & Library"]}},"/api/route-plans/shared/:shareableID/preferred-copy":{"post":{"description":"Marks one imported copy as the preferred continuation target for a shared route plan.","operationId":"post_api_route_plans_shared_shareableID_preferred_copy","parameters":[{"example":"$firstPlanShareableID","in":"path","name":"shareableID","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"example":{"importedPlanID":"$firstPlanID"},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"importedPlanID":{"type":"string","minLength":1}},"required":["importedPlanID"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"summary":"Set preferred shared-plan copy","tags":["Routes, Plans & Library"]}},"/api/work-sessions/:id/cancel":{"post":{"description":"Cancels an active work session.","operationId":"post_api_work_sessions_id_cancel","parameters":[{"example":"$activeWorkSessionID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workSession":{"type":"object","properties":{},"additionalProperties":{}}},"required":["workSession"],"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Cancel a work session","tags":["Routes, Plans & Library"]}},"/api/work-sessions/:id/checkpoint":{"put":{"description":"Checkpoints a work session payload without finalizing it.","operationId":"put_api_work_sessions_id_checkpoint","parameters":[{"example":"$activeWorkSessionID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"example":{"payload":{"kind":"route-draft","route":{"geometry":{"points":[{"latitude":39.6425,"longitude":-105.8716},{"latitude":39.644,"longitude":-105.8683},{"latitude":39.6451,"longitude":-105.8652}]},"metrics":{"altitudeClimbed":180,"altitudeDescended":180,"distanceMeters":920},"presentation":{"colorToken":"glacier"},"source":"manual","title":"Docs Sample Route"}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workSession":{"type":"object","properties":{},"additionalProperties":{}}},"required":["workSession"],"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Checkpoint a work session","tags":["Routes, Plans & Library"]}},"/api/work-sessions/:id/finalize":{"post":{"description":"Finalizes a work session into its durable artifact.","operationId":"post_api_work_sessions_id_finalize","parameters":[{"example":"$activeWorkSessionID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Finalize a work session","tags":["Routes, Plans & Library"]}},"/api/work-sessions/:id":{"get":{"description":"Loads a work session by ID.","operationId":"get_api_work_sessions_id","parameters":[{"example":"$activeWorkSessionID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workSession":{"type":"object","properties":{},"additionalProperties":{}}},"required":["workSession"],"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Get a work session","tags":["Routes, Plans & Library"]}},"/api/work-sessions/active":{"get":{"description":"Lists active work sessions for the signed-in account.","operationId":"get_api_work_sessions_active","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"List active work sessions","tags":["Routes, Plans & Library"]}},"/api/work-sessions/start":{"post":{"description":"Starts a work session for route drafts, track recording, or plan editing.","operationId":"post_api_work_sessions_start","parameters":[],"requestBody":{"content":{"application/json":{"example":{"editorPlatform":"ios","kind":"route-draft","payload":{"kind":"route-draft","route":{"geometry":{"points":[{"latitude":39.6425,"longitude":-105.8716},{"latitude":39.644,"longitude":-105.8683},{"latitude":39.6451,"longitude":-105.8652}]},"metrics":{"altitudeClimbed":180,"altitudeDescended":180,"distanceMeters":920},"presentation":{"colorToken":"glacier"},"source":"manual","title":"Docs Sample Route"}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"workSession":{"type":"object","properties":{},"additionalProperties":{}}},"required":["workSession"],"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Start a work session","tags":["Routes, Plans & Library"]}},"/api/import/routes/commit":{"post":{"description":"Creates an owned imported route from a selected preview candidate so iOS and web can share the same backend-owned import workflow.","operationId":"post_api_import_routes_commit","parameters":[],"requestBody":{"content":{"application/json":{"example":{"content":"<gpx><trk><name>North Ridge</name><trkseg><trkpt lat=\"39.6\" lon=\"-106.3\"></trkpt><trkpt lat=\"39.61\" lon=\"-106.31\"></trkpt></trkseg></trk></gpx>","format":"gpx","notes":"Imported from Garmin","title":"Imported North Ridge"},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"content":{"type":"string"},"format":{"type":"string","enum":["gpx","kml","geojson","tcx"]},"candidateID":{"type":"string","minLength":1},"notes":{"default":"","type":"string","maxLength":20000},"presentation":{"type":"object","properties":{"colorToken":{"default":"glacier","type":"string","enum":["glacier","forest","sunset","gold","violet","graphite"]}},"required":["colorToken"],"additionalProperties":false},"slopeRating":{"anyOf":[{"type":"string","enum":["green","blue","black","double-black"]},{"type":"null"}]},"title":{"type":"string","minLength":1,"maxLength":200}},"required":["content","format","notes"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"import":{"type":"object","properties":{"candidateCount":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"documentTitle":{"type":"string"},"duplicateMatches":{"type":"array","items":{"type":"object","properties":{"lifecycle":{"type":"string","enum":["draft","saved","recording","completed","archived"]},"matchReasons":{"minItems":1,"type":"array","items":{"type":"string","enum":["geometry","title"]}},"routeID":{"type":"string"},"title":{"type":"string"}},"required":["lifecycle","matchReasons","routeID","title"],"additionalProperties":false}},"format":{"type":"string","enum":["gpx","kml","geojson","tcx"]},"selectedCandidateID":{"type":"string"},"warnings":{"type":"array","items":{"type":"string"}}},"required":["candidateCount","documentTitle","duplicateMatches","format","selectedCandidateID","warnings"],"additionalProperties":false},"route":{"type":"object","properties":{"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"endedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"geometry":{"type":"object","properties":{"points":{"type":"array","items":{"type":"object","properties":{"elevationMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"latitude":{"type":"number"},"longitude":{"type":"number"},"recordedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]}},"required":["latitude","longitude"],"additionalProperties":false}}},"required":["points"],"additionalProperties":false},"id":{"type":"string"},"isShared":{"default":false,"type":"boolean"},"lifecycle":{"type":"string","enum":["draft","saved","recording","completed","archived"]},"mapboxFeatureID":{"anyOf":[{"type":"string"},{"type":"null"}]},"metrics":{"type":"object","properties":{"altitudeClimbed":{"default":0,"type":"number"},"altitudeDescended":{"default":0,"type":"number"},"distanceMeters":{"default":0,"type":"number"},"durationSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"endAltitude":{"anyOf":[{"type":"number"},{"type":"null"}]},"estimatedDurationSeconds":{"anyOf":[{"type":"number"},{"type":"null"}]},"maximumAltitudeMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"minimumAltitudeMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"startAltitude":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["altitudeClimbed","altitudeDescended","distanceMeters"],"additionalProperties":false},"notes":{"default":"","type":"string"},"ownerDisplayName":{"anyOf":[{"type":"string"},{"type":"null"}]},"ownerUserID":{"anyOf":[{"type":"string"},{"type":"null"}]},"presentation":{"default":{"colorToken":"glacier"},"type":"object","properties":{"colorToken":{"default":"glacier","type":"string","enum":["glacier","forest","sunset","gold","violet","graphite"]}},"required":["colorToken"],"additionalProperties":false},"safety":{"anyOf":[{"type":"object","properties":{"computedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"dangerLevel":{"type":"number"},"dangerLevelLabel":{"type":"string","enum":["low","moderate","considerable","high","extreme"]},"evaluationMode":{"type":"string","const":"explicitDangerLevel"},"exposedDistanceMeters":{"type":"number"},"forecastSnapshotRevision":{"anyOf":[{"type":"string"},{"type":"null"}]},"highestRisk":{"type":"string","enum":["low","moderate","considerable","high","extreme"]},"isStale":{"type":"boolean"},"sourceRouteRevision":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["computedAt","dangerLevel","dangerLevelLabel","evaluationMode","exposedDistanceMeters","forecastSnapshotRevision","highestRisk","isStale","sourceRouteRevision"],"additionalProperties":false},{"type":"null"}]},"shareableID":{"anyOf":[{"type":"string"},{"type":"null"}]},"slopeRating":{"anyOf":[{"type":"string","enum":["green","blue","black","double-black"]},{"type":"null"}]},"source":{"type":"string","enum":["catalog","manual","tracked","imported"]},"startedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"title":{"type":"string"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["createdAt","endedAt","geometry","id","isShared","lifecycle","mapboxFeatureID","metrics","notes","ownerDisplayName","ownerUserID","presentation","source","startedAt","title","updatedAt"],"additionalProperties":false}},"required":["import","route"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Commit imported route","tags":["Routes, Plans & Library"]}},"/api/export/routes/:routeID.geojson":{"get":{"description":"Load Export / Routes / RouteID GeoJSON through the Routes, Plans & Library contract. This endpoint is part of the canonical routes surface.","operationId":"get_api_export_routes_routeID_geojson","parameters":[{"example":"$routeID.geojson","in":"path","name":"routeID.geojson","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Load Export / Routes / RouteID GeoJSON","tags":["Routes, Plans & Library"]}},"/api/export/routes/:routeID.gpx":{"get":{"description":"Load Export / Routes / RouteID Gpx through the Routes, Plans & Library contract. This endpoint is part of the canonical routes surface.","operationId":"get_api_export_routes_routeID_gpx","parameters":[{"example":"$routeID.gpx","in":"path","name":"routeID.gpx","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Load Export / Routes / RouteID Gpx","tags":["Routes, Plans & Library"]}},"/api/import/routes":{"post":{"description":"Analyzes an imported route file into a document-level preview with candidates, warnings, and duplicate hints.","operationId":"post_api_import_routes","parameters":[],"requestBody":{"content":{"application/json":{"example":{"content":"<gpx><trk><name>North Ridge</name><trkseg><trkpt lat=\"39.6\" lon=\"-106.3\"></trkpt><trkpt lat=\"39.61\" lon=\"-106.31\"></trkpt></trkseg></trk></gpx>","format":"gpx"},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"content":{"type":"string"},"format":{"type":"string","enum":["gpx","kml","geojson","tcx"]}},"required":["content","format"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"document":{"type":"object","properties":{"candidates":{"type":"array","items":{"type":"object","properties":{"candidateID":{"type":"string"},"candidateKind":{"type":"string","enum":["activity","course","document","feature","placemark","route","track","waypoints"]},"duplicateMatches":{"default":[],"type":"array","items":{"type":"object","properties":{"lifecycle":{"type":"string","enum":["draft","saved","recording","completed","archived"]},"matchReasons":{"minItems":1,"type":"array","items":{"type":"string","enum":["geometry","title"]}},"routeID":{"type":"string"},"title":{"type":"string"}},"required":["lifecycle","matchReasons","routeID","title"],"additionalProperties":false}},"format":{"type":"string","enum":["gpx","kml","geojson","tcx"]},"geometry":{"type":"object","properties":{"points":{"type":"array","items":{"type":"object","properties":{"elevationMeters":{"type":"number"},"latitude":{"type":"number"},"longitude":{"type":"number"}},"required":["latitude","longitude"],"additionalProperties":false}}},"required":["points"],"additionalProperties":false},"metadata":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"metrics":{"type":"object","properties":{"altitudeClimbed":{"type":"number"},"altitudeDescended":{"type":"number"},"distanceMeters":{"type":"number"}},"required":["altitudeClimbed","altitudeDescended","distanceMeters"],"additionalProperties":false},"pointCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"source":{"type":"string","const":"imported"},"title":{"type":"string"},"warnings":{"type":"array","items":{"type":"string"}}},"required":["candidateID","candidateKind","duplicateMatches","format","geometry","metadata","metrics","pointCount","source","title","warnings"],"additionalProperties":false}},"format":{"type":"string","enum":["gpx","kml","geojson","tcx"]},"metadata":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"primaryCandidateID":{"anyOf":[{"type":"string"},{"type":"null"}]},"title":{"type":"string"},"warnings":{"type":"array","items":{"type":"string"}}},"required":["candidates","format","metadata","primaryCandidateID","title","warnings"],"additionalProperties":false},"preview":{"type":"object","properties":{"candidateID":{"type":"string"},"candidateKind":{"type":"string","enum":["activity","course","document","feature","placemark","route","track","waypoints"]},"duplicateMatches":{"default":[],"type":"array","items":{"type":"object","properties":{"lifecycle":{"type":"string","enum":["draft","saved","recording","completed","archived"]},"matchReasons":{"minItems":1,"type":"array","items":{"type":"string","enum":["geometry","title"]}},"routeID":{"type":"string"},"title":{"type":"string"}},"required":["lifecycle","matchReasons","routeID","title"],"additionalProperties":false}},"format":{"type":"string","enum":["gpx","kml","geojson","tcx"]},"geometry":{"type":"object","properties":{"points":{"type":"array","items":{"type":"object","properties":{"elevationMeters":{"type":"number"},"latitude":{"type":"number"},"longitude":{"type":"number"}},"required":["latitude","longitude"],"additionalProperties":false}}},"required":["points"],"additionalProperties":false},"metadata":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"metrics":{"type":"object","properties":{"altitudeClimbed":{"type":"number"},"altitudeDescended":{"type":"number"},"distanceMeters":{"type":"number"}},"required":["altitudeClimbed","altitudeDescended","distanceMeters"],"additionalProperties":false},"pointCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"source":{"type":"string","const":"imported"},"title":{"type":"string"},"warnings":{"type":"array","items":{"type":"string"}}},"required":["candidateID","candidateKind","duplicateMatches","format","geometry","metadata","metrics","pointCount","source","title","warnings"],"additionalProperties":false}},"required":["document","preview"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Preview imported routes","tags":["Routes, Plans & Library"]}},"/api/sync/route-plans":{"get":{"description":"Returns route-plan changes since a supplied sync cursor.","operationId":"get_api_sync_route_plans","parameters":[{"in":"query","name":"since","required":false,"schema":{"type":"string","minLength":1}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Sync route plans since cursor","tags":["Routes, Plans & Library"]}},"/api/sync/routes":{"get":{"description":"Returns route changes since a supplied sync cursor.","operationId":"get_api_sync_routes","parameters":[{"in":"query","name":"since","required":false,"schema":{"type":"string","minLength":1}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Sync routes since cursor","tags":["Routes, Plans & Library"]}},"/api/search":{"get":{"description":"Unified backend search across forecast zones, routes, route plans, incidents, places, and app surfaces.","operationId":"get_api_search","parameters":[{"in":"query","name":"q","required":true,"schema":{"type":"string","minLength":1,"maxLength":200}},{"in":"query","name":"types","required":false,"schema":{"type":"string"}},{"in":"query","name":"limit","required":true,"schema":{"default":20,"type":"integer","minimum":1,"maximum":50}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"query":{"type":"string","minLength":1},"results":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"isSpotlightEligible":{"default":false,"type":"boolean"},"latitude":{"type":"number"},"longitude":{"type":"number"},"path":{"type":"string","minLength":1},"section":{"type":"string","enum":["forecast","incidents","library","places","surfaces"]},"subtitle":{"type":"string","minLength":1},"summary":{"type":"string","minLength":1},"title":{"type":"string","minLength":1},"type":{"type":"string","enum":["forecast_zone","incident","note","place","route","route_plan","surface","tool"]}},"required":["id","isSpotlightEligible","section","title","type"],"additionalProperties":false}},"sections":{"type":"array","items":{"type":"object","properties":{"count":{"type":"integer","minimum":0,"maximum":9007199254740991},"id":{"type":"string","enum":["forecast","incidents","library","places","surfaces"]},"title":{"type":"string","minLength":1}},"required":["count","id","title"],"additionalProperties":false}},"totalCount":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["query","results","sections","totalCount"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Run unified search","tags":["Routes, Plans & Library"]}},"/api/route-plans/:planID/readiness/acknowledge":{"post":{"description":"Acknowledges readiness warnings for a route plan.","operationId":"post_api_route_plans_planID_readiness_acknowledge","parameters":[{"example":"$firstPlanID","in":"path","name":"planID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"readiness":{"type":"object","properties":{"acknowledgedAt":{"anyOf":[{"type":"string"},{"type":"null"}]},"blocking":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"message":{"type":"string"},"scope":{"type":"string","enum":["server","device"]},"status":{"type":"string","enum":["pass","warning","blocking"]},"title":{"type":"string"}},"required":["id","message","scope","status","title"],"additionalProperties":false}},"canStartTrip":{"type":"boolean"},"checks":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"message":{"type":"string"},"scope":{"type":"string","enum":["server","device"]},"status":{"type":"string","enum":["pass","warning","blocking"]},"title":{"type":"string"}},"required":["id","message","scope","status","title"],"additionalProperties":false}},"requiresAcknowledgement":{"type":"boolean"},"score":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"status":{"type":"string","enum":["ready","warning","blocked"]},"warnings":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"message":{"type":"string"},"scope":{"type":"string","enum":["server","device"]},"status":{"type":"string","enum":["pass","warning","blocking"]},"title":{"type":"string"}},"required":["id","message","scope","status","title"],"additionalProperties":false}}},"required":["acknowledgedAt","blocking","canStartTrip","checks","requiresAcknowledgement","score","status","warnings"],"additionalProperties":false}},"required":["readiness"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Acknowledge route-plan readiness","tags":["Route Intelligence & Trip Safety"]}},"/api/routes/terrain-analysis":{"post":{"description":"Runs terrain analysis against an arbitrary geometry payload without first saving a route.","operationId":"post_api_routes_terrain_analysis","parameters":[],"requestBody":{"content":{"application/json":{"example":{"dangerLevel":3,"geometry":{"points":[{"latitude":39.6425,"longitude":-105.8716},{"latitude":39.644,"longitude":-105.8683},{"latitude":39.6451,"longitude":-105.8652}]}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"dangerLevel":{"anyOf":[{"type":"number"},{"type":"string"}]},"geometry":{"type":"object","properties":{"points":{"minItems":2,"type":"array","items":{"type":"object","properties":{"latitude":{"type":"number"},"longitude":{"type":"number"}},"required":["latitude","longitude"],"additionalProperties":false}}},"required":["points"],"additionalProperties":false}},"required":["geometry"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"analysis":{"type":"object","properties":{"dangerLevel":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"exposureBudget":{"type":"object","properties":{"byDangerClass":{"type":"array","items":{"type":"object","properties":{"distanceMeters":{"type":"number"},"key":{"type":"string"}},"required":["distanceMeters","key"],"additionalProperties":false}},"byProblemToken":{"type":"array","items":{"type":"object","properties":{"distanceMeters":{"type":"number"},"token":{"type":"string"}},"required":["distanceMeters","token"],"additionalProperties":false}}},"required":["byDangerClass","byProblemToken"],"additionalProperties":false},"footprintRose":{"type":"object","properties":{"aspectSource":{"type":"string"},"cells":{"type":"array","items":{"type":"object","properties":{"aspect":{"type":"string"},"distanceMeters":{"type":"number"},"elevationBand":{"type":"string"},"matchedProblemDistanceMeters":{"type":"number"}},"required":["aspect","distanceMeters","elevationBand","matchedProblemDistanceMeters"],"additionalProperties":false}},"confidence":{"type":"string"},"elevationBandSource":{"type":"string"}},"required":["aspectSource","cells","confidence","elevationBandSource"],"additionalProperties":false},"matchedForecastZones":{"type":"array","items":{"type":"object","properties":{"sampleCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"zoneID":{"type":"string"},"zoneName":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["sampleCount","zoneID","zoneName"],"additionalProperties":false}},"profile":{"type":"object","properties":{"sampleSpacingMeters":{"type":"number"},"samples":{"type":"array","items":{"type":"object","properties":{"dangerClass":{"anyOf":[{"type":"string"},{"type":"null"}]},"distanceMeters":{"type":"number"},"elevationMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"forecastZoneID":{"anyOf":[{"type":"string"},{"type":"null"}]},"inferredElevationBand":{"anyOf":[{"type":"string"},{"type":"null"}]},"latitude":{"type":"number"},"longitude":{"type":"number"},"matchingProblemTokens":{"type":"array","items":{"type":"string"}},"slopeDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"terrainAspect":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["dangerClass","distanceMeters","elevationMeters","forecastZoneID","inferredElevationBand","latitude","longitude","matchingProblemTokens","slopeDegrees","terrainAspect"],"additionalProperties":false}},"totalDistanceMeters":{"type":"number"}},"required":["sampleSpacingMeters","samples","totalDistanceMeters"],"additionalProperties":false},"slopeDistribution":{"type":"array","items":{"type":"object","properties":{"bucket":{"type":"string","enum":["<30","30-34","35-39","40+"]},"distanceMeters":{"type":"number"}},"required":["bucket","distanceMeters"],"additionalProperties":false}},"slopeGuidance":{"type":"object","properties":{},"additionalProperties":{}},"warnings":{"type":"array","items":{"type":"string"}}},"required":["dangerLevel","exposureBudget","footprintRose","matchedForecastZones","profile","slopeDistribution","slopeGuidance","warnings"],"additionalProperties":false}},"required":["analysis"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Analyze arbitrary route terrain","tags":["Route Intelligence & Trip Safety"]}},"/api/routes/:routeID/exposure":{"get":{"description":"Loads backend-owned route exposure segments and summary for a saved route.","operationId":"get_api_routes_routeID_exposure","parameters":[{"example":"$firstRouteID","in":"path","name":"routeID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"exposure":{"type":"object","properties":{"dangerLevel":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"dangerLevelLabel":{"type":"string","enum":["low","moderate","considerable","high","extreme"]},"evaluationMode":{"type":"string","const":"explicitDangerLevel"},"routeID":{"type":"string"},"segments":{"type":"array","items":{"type":"object","properties":{"distanceMeters":{"type":"number"},"endIndex":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"exposureRating":{"type":"string","enum":["low","moderate","considerable","high","extreme"]},"slopeAngleEstimate":{"type":"number"},"startIndex":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["distanceMeters","endIndex","exposureRating","slopeAngleEstimate","startIndex"],"additionalProperties":false}},"summary":{"type":"object","properties":{"exposedDistanceMeters":{"type":"number"},"highestRisk":{"type":"string","enum":["low","moderate","considerable","high","extreme"]}},"required":["exposedDistanceMeters","highestRisk"],"additionalProperties":false}},"required":["dangerLevel","dangerLevelLabel","evaluationMode","routeID","segments","summary"],"additionalProperties":{}}},"required":["exposure"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Load route exposure","tags":["Route Intelligence & Trip Safety"]}},"/api/routes/:routeID/terrain-analysis":{"get":{"description":"Loads the terrain-analysis payload used by the route detail charts and overlays.","operationId":"get_api_routes_routeID_terrain_analysis","parameters":[{"example":"$firstRouteID","in":"path","name":"routeID","required":true,"schema":{"type":"string"}},{"in":"query","name":"dangerLevel","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"string"}]}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"analysis":{"type":"object","properties":{"dangerLevel":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"exposureBudget":{"type":"object","properties":{"byDangerClass":{"type":"array","items":{"type":"object","properties":{"distanceMeters":{"type":"number"},"key":{"type":"string"}},"required":["distanceMeters","key"],"additionalProperties":false}},"byProblemToken":{"type":"array","items":{"type":"object","properties":{"distanceMeters":{"type":"number"},"token":{"type":"string"}},"required":["distanceMeters","token"],"additionalProperties":false}}},"required":["byDangerClass","byProblemToken"],"additionalProperties":false},"footprintRose":{"type":"object","properties":{"aspectSource":{"type":"string"},"cells":{"type":"array","items":{"type":"object","properties":{"aspect":{"type":"string"},"distanceMeters":{"type":"number"},"elevationBand":{"type":"string"},"matchedProblemDistanceMeters":{"type":"number"}},"required":["aspect","distanceMeters","elevationBand","matchedProblemDistanceMeters"],"additionalProperties":false}},"confidence":{"type":"string"},"elevationBandSource":{"type":"string"}},"required":["aspectSource","cells","confidence","elevationBandSource"],"additionalProperties":false},"matchedForecastZones":{"type":"array","items":{"type":"object","properties":{"sampleCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"zoneID":{"type":"string"},"zoneName":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["sampleCount","zoneID","zoneName"],"additionalProperties":false}},"profile":{"type":"object","properties":{"sampleSpacingMeters":{"type":"number"},"samples":{"type":"array","items":{"type":"object","properties":{"dangerClass":{"anyOf":[{"type":"string"},{"type":"null"}]},"distanceMeters":{"type":"number"},"elevationMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"forecastZoneID":{"anyOf":[{"type":"string"},{"type":"null"}]},"inferredElevationBand":{"anyOf":[{"type":"string"},{"type":"null"}]},"latitude":{"type":"number"},"longitude":{"type":"number"},"matchingProblemTokens":{"type":"array","items":{"type":"string"}},"slopeDegrees":{"anyOf":[{"type":"number"},{"type":"null"}]},"terrainAspect":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["dangerClass","distanceMeters","elevationMeters","forecastZoneID","inferredElevationBand","latitude","longitude","matchingProblemTokens","slopeDegrees","terrainAspect"],"additionalProperties":false}},"totalDistanceMeters":{"type":"number"}},"required":["sampleSpacingMeters","samples","totalDistanceMeters"],"additionalProperties":false},"slopeDistribution":{"type":"array","items":{"type":"object","properties":{"bucket":{"type":"string","enum":["<30","30-34","35-39","40+"]},"distanceMeters":{"type":"number"}},"required":["bucket","distanceMeters"],"additionalProperties":false}},"slopeGuidance":{"type":"object","properties":{},"additionalProperties":{}},"warnings":{"type":"array","items":{"type":"string"}}},"required":["dangerLevel","exposureBudget","footprintRose","matchedForecastZones","profile","slopeDistribution","slopeGuidance","warnings"],"additionalProperties":false}},"required":["analysis"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Load route terrain analysis","tags":["Route Intelligence & Trip Safety"]}},"/api/route-plans/:planID/readiness":{"get":{"description":"Evaluates plan readiness using the backend-owned readiness engine.","operationId":"get_api_route_plans_planID_readiness","parameters":[{"example":"$firstPlanID","in":"path","name":"planID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"readiness":{"type":"object","properties":{"acknowledgedAt":{"anyOf":[{"type":"string"},{"type":"null"}]},"blocking":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"message":{"type":"string"},"scope":{"type":"string","enum":["server","device"]},"status":{"type":"string","enum":["pass","warning","blocking"]},"title":{"type":"string"}},"required":["id","message","scope","status","title"],"additionalProperties":false}},"canStartTrip":{"type":"boolean"},"checks":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"message":{"type":"string"},"scope":{"type":"string","enum":["server","device"]},"status":{"type":"string","enum":["pass","warning","blocking"]},"title":{"type":"string"}},"required":["id","message","scope","status","title"],"additionalProperties":false}},"requiresAcknowledgement":{"type":"boolean"},"score":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"status":{"type":"string","enum":["ready","warning","blocked"]},"warnings":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"message":{"type":"string"},"scope":{"type":"string","enum":["server","device"]},"status":{"type":"string","enum":["pass","warning","blocking"]},"title":{"type":"string"}},"required":["id","message","scope","status","title"],"additionalProperties":false}}},"required":["acknowledgedAt","blocking","canStartTrip","checks","requiresAcknowledgement","score","status","warnings"],"additionalProperties":false}},"required":["readiness"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Load route-plan readiness","tags":["Route Intelligence & Trip Safety"]}},"/api/route-plans/:planID/safety-summary":{"get":{"description":"Builds the route-plan safety summary across referenced routes.","operationId":"get_api_route_plans_planID_safety_summary","parameters":[{"example":"$firstPlanID","in":"path","name":"planID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"safetySummary":{"type":"object","properties":{},"additionalProperties":{}}},"required":["safetySummary"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Load route-plan safety summary","tags":["Route Intelligence & Trip Safety"]}},"/api/route-plans/:planID/trip-history":{"get":{"description":"Lists trip sessions previously started from a route plan.","operationId":"get_api_route_plans_planID_trip_history","parameters":[{"example":"$firstPlanID","in":"path","name":"planID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Load route-plan trip history","tags":["Route Intelligence & Trip Safety"]}},"/api/routes/:routeID/exposure/recompute":{"post":{"description":"Recomputes the route exposure cache for a route, optionally against an alternate geometry payload.","operationId":"post_api_routes_routeID_exposure_recompute","parameters":[{"example":"$firstRouteID","in":"path","name":"routeID","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"example":{"dangerLevel":3,"evaluationMode":"explicitDangerLevel"},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"dangerLevel":{"anyOf":[{"type":"number"},{"type":"string"}]},"evaluationMode":{"type":"string"},"geometry":{"type":"object","properties":{"points":{"minItems":2,"type":"array","items":{"type":"object","properties":{"elevationMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"latitude":{"type":"number"},"longitude":{"type":"number"}},"required":["latitude","longitude"],"additionalProperties":false}}},"required":["points"],"additionalProperties":false}},"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"exposure":{"type":"object","properties":{"dangerLevel":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"dangerLevelLabel":{"type":"string","enum":["low","moderate","considerable","high","extreme"]},"evaluationMode":{"type":"string","const":"explicitDangerLevel"},"routeID":{"type":"string"},"segments":{"type":"array","items":{"type":"object","properties":{"distanceMeters":{"type":"number"},"endIndex":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"exposureRating":{"type":"string","enum":["low","moderate","considerable","high","extreme"]},"slopeAngleEstimate":{"type":"number"},"startIndex":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["distanceMeters","endIndex","exposureRating","slopeAngleEstimate","startIndex"],"additionalProperties":false}},"summary":{"type":"object","properties":{"exposedDistanceMeters":{"type":"number"},"highestRisk":{"type":"string","enum":["low","moderate","considerable","high","extreme"]}},"required":["exposedDistanceMeters","highestRisk"],"additionalProperties":false}},"required":["dangerLevel","dangerLevelLabel","evaluationMode","routeID","segments","summary"],"additionalProperties":{}}},"required":["exposure"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Recompute route exposure","tags":["Route Intelligence & Trip Safety"]}},"/api/trips/:id/check-in":{"post":{"description":"Records a trip check-in and optional expected-return adjustment.","operationId":"post_api_trips_id_check_in","parameters":[{"example":"$latestTripID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"example":{"expectedReturnAt":"2026-04-13T09:20:21.088Z"},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"expectedReturnAt":{"default":null,"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]}},"required":["expectedReturnAt"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"trip":{"type":"object","properties":{},"additionalProperties":{}}},"required":["trip"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Check in on a trip","tags":["Route Intelligence & Trip Safety"]}},"/api/trips/:id/finish":{"post":{"description":"Marks a trip as finished.","operationId":"post_api_trips_id_finish","parameters":[{"example":"$latestTripID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"trip":{"type":"object","properties":{},"additionalProperties":{}}},"required":["trip"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Finish a trip","tags":["Route Intelligence & Trip Safety"]}},"/api/trips/latest":{"get":{"description":"Loads the most recent trip safety session for the signed-in account.","operationId":"get_api_trips_latest","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"trip":{"type":"object","properties":{},"additionalProperties":{}}},"required":["trip"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Load latest trip","tags":["Route Intelligence & Trip Safety"]}},"/api/trips/share/:token":{"get":{"description":"Loads the public shared-trip status payload used by hosted safety links.","operationId":"get_api_trips_share_token","parameters":[{"example":"$latestTripShareToken","in":"path","name":"token","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"trip":{"type":"object","properties":{},"additionalProperties":{}}},"required":["trip"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"summary":"Load shared trip status","tags":["Route Intelligence & Trip Safety"]}},"/api/trips/:id/share/resend":{"post":{"description":"Resends the hosted trip-share notification to verified safety contacts.","operationId":"post_api_trips_id_share_resend","parameters":[{"example":"$latestTripID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Resend trip share","tags":["Route Intelligence & Trip Safety"]}},"/api/trips/:id/heartbeat":{"post":{"description":"Adds a trip heartbeat update for the active trip.","operationId":"post_api_trips_id_heartbeat","parameters":[{"example":"$latestTripID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"example":{"altitude":3420,"latitude":39.6425,"longitude":-105.8716},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"altitude":{"default":null,"anyOf":[{"type":"number"},{"type":"null"}]},"latitude":{"default":null,"anyOf":[{"type":"number"},{"type":"null"}]},"longitude":{"default":null,"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["altitude","latitude","longitude"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"trip":{"type":"object","properties":{},"additionalProperties":{}}},"required":["trip"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Send trip heartbeat","tags":["Route Intelligence & Trip Safety"]}},"/api/trips/start":{"post":{"description":"Starts a trip safety session, optionally tied to a route plan.","operationId":"post_api_trips_start","parameters":[],"requestBody":{"content":{"application/json":{"example":{"expectedReturnAt":"2026-04-13T11:20:21.082Z","heartbeatIntervalSeconds":300,"planID":null},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"expectedReturnAt":{"default":null,"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"heartbeatIntervalSeconds":{"default":300,"type":"integer","minimum":60,"maximum":3600},"planID":{"default":null,"anyOf":[{"type":"string","minLength":1},{"type":"null"}]}},"required":["expectedReturnAt","heartbeatIntervalSeconds","planID"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"trip":{"type":"object","properties":{},"additionalProperties":{}}},"required":["trip"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Start a trip","tags":["Route Intelligence & Trip Safety"]}},"/api/decision-logs":{"post":{"description":"Creates a decision-log entry tied to a trip or plan context.","operationId":"post_api_decision_logs","parameters":[],"requestBody":{"content":{"application/json":{"example":{"category":"terrain","contextJSON":{"source":"hosted-docs"},"description":"Testing the decision-log API from the interactive docs explorer.","planID":null,"tripSessionID":null,"zoneID":null},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"category":{"type":"string","minLength":1,"maxLength":100},"contextJSON":{"default":{},"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"description":{"type":"string","minLength":1,"maxLength":2000},"planID":{"default":null,"anyOf":[{"type":"string"},{"type":"null"}]},"recordedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"tripSessionID":{"default":null,"anyOf":[{"type":"string"},{"type":"null"}]},"zoneID":{"default":null,"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["category","contextJSON","description","planID","tripSessionID","zoneID"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Create a decision log","tags":["Route Intelligence & Trip Safety"]},"get":{"description":"Lists decision-log entries for the signed-in account, optionally filtered by trip or plan.","operationId":"get_api_decision_logs","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"logs":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}}},"required":["logs"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"List decision logs","tags":["Route Intelligence & Trip Safety"]}},"/api/trips/:id/observations":{"post":{"description":"Records a trip observation for field/debrief workflows.","operationId":"post_api_trips_id_observations","parameters":[{"example":"$latestTripID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"example":{"altitudeMeters":3420,"description":"Wind loading was visible on the lee side of the ridge.","latitude":39.6425,"longitude":-105.8716,"observationType":"wind-loading"},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"altitudeMeters":{"default":null,"anyOf":[{"type":"number"},{"type":"null"}]},"description":{"type":"string","minLength":1,"maxLength":2000},"latitude":{"default":null,"anyOf":[{"type":"number"},{"type":"null"}]},"longitude":{"default":null,"anyOf":[{"type":"number"},{"type":"null"}]},"observationType":{"type":"string","minLength":1,"maxLength":100},"recordedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["altitudeMeters","description","latitude","longitude","observationType"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Create a trip observation","tags":["Route Intelligence & Trip Safety"]},"get":{"description":"Lists observations recorded against a trip session.","operationId":"get_api_trips_id_observations","parameters":[{"example":"$latestTripID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"observations":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}}},"required":["observations"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"List trip observations","tags":["Route Intelligence & Trip Safety"]}},"/api/trips/:id/debrief":{"get":{"description":"Loads the debrief summary for a finished trip.","operationId":"get_api_trips_id_debrief","parameters":[{"example":"$latestTripID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"debrief":{"type":"object","properties":{},"additionalProperties":{}}},"required":["debrief"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Load trip debrief","tags":["Route Intelligence & Trip Safety"]},"post":{"description":"Creates or updates the debrief summary for a finished trip.","operationId":"post_api_trips_id_debrief","parameters":[{"example":"$latestTripID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"example":{"keyDecisionPoint":"Turned around when wind loading increased on the final approach.","lessonsLearned":"The terrain-analysis endpoint matched the field observations closely.","majorDeviation":null,"matchedExpectations":true,"summary":"Short validation tour run from the hosted docs explorer.","wouldRepeat":true},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"keyDecisionPoint":{"default":null,"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"lessonsLearned":{"default":null,"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}]},"majorDeviation":{"default":null,"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"matchedExpectations":{"default":null,"anyOf":[{"type":"boolean"},{"type":"null"}]},"summary":{"default":null,"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}]},"wouldRepeat":{"default":null,"anyOf":[{"type":"boolean"},{"type":"null"}]}},"required":["keyDecisionPoint","lessonsLearned","majorDeviation","matchedExpectations","summary","wouldRepeat"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"debrief":{"type":"object","properties":{},"additionalProperties":{}}},"required":["debrief"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Save trip debrief","tags":["Route Intelligence & Trip Safety"]}},"/api/user/delete":{"post":{"description":"Schedules or performs account deletion for the signed-in user.","operationId":"post_api_user_delete","parameters":[],"requestBody":{"content":{"application/json":{"example":{"password":"powder1234"},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"password":{"type":"string","minLength":1,"maxLength":4096}},"required":["password"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Delete current user","tags":["User Domain"]}},"/api/user/map-markers":{"get":{"description":"Returns backend-managed map marker placements for the current viewport, zoom, platform, and signed-in audience.","operationId":"get_api_user_map_markers","parameters":[{"in":"query","name":"maxLatitude","required":true,"schema":{"type":"number","minimum":-90,"maximum":90}},{"in":"query","name":"maxLongitude","required":true,"schema":{"type":"number","minimum":-180,"maximum":180}},{"in":"query","name":"minLatitude","required":true,"schema":{"type":"number","minimum":-90,"maximum":90}},{"in":"query","name":"minLongitude","required":true,"schema":{"type":"number","minimum":-180,"maximum":180}},{"in":"query","name":"platform","required":true,"schema":{"default":"ios","type":"string","enum":["ios","web"]}},{"in":"query","name":"zoom","required":true,"schema":{"type":"number","minimum":0,"maximum":24}}],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"fetchedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"placements":{"type":"array","items":{"type":"object","properties":{"marker":{"type":"object","properties":{"coordinate":{"type":"object","properties":{"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180}},"required":["latitude","longitude"],"additionalProperties":false},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"detail":{"type":"object","properties":{"body":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"ctaLabel":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}]},"ctaURL":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"disclosureBody":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"disclosureLabel":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}]}},"required":["body","ctaLabel","ctaURL","disclosureBody","disclosureLabel"],"additionalProperties":false},"enabled":{"type":"boolean"},"endsAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"id":{"type":"string","minLength":1},"image":{"type":"object","properties":{"altText":{"anyOf":[{"type":"string","maxLength":160},{"type":"null"}]},"height":{"type":"integer","minimum":24,"maximum":512},"url":{"type":"string","format":"uri"},"width":{"type":"integer","minimum":24,"maximum":512}},"required":["altText","height","url","width"],"additionalProperties":false},"metadata":{"default":{},"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"priority":{"type":"integer","minimum":-100,"maximum":100},"setID":{"type":"string","minLength":1},"startsAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"subtitle":{"anyOf":[{"type":"string","maxLength":240},{"type":"null"}]},"title":{"type":"string","minLength":1,"maxLength":160},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["coordinate","createdAt","detail","enabled","endsAt","id","image","metadata","priority","setID","startsAt","subtitle","title","updatedAt"],"additionalProperties":false},"set":{"type":"object","properties":{"audience":{"type":"string","enum":["all","members","non_members"]},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"detail":{"type":"object","properties":{"disclosureBody":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"disclosureLabel":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}]}},"required":["disclosureBody","disclosureLabel"],"additionalProperties":false},"enabled":{"type":"boolean"},"endsAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"id":{"type":"string","minLength":1},"imageGuidelinesVersion":{"type":"string","minLength":1,"maxLength":32},"kind":{"type":"string","enum":["sponsored","partner","informational"]},"key":{"type":"string","minLength":1,"maxLength":120},"maxZoom":{"anyOf":[{"type":"number","minimum":0,"maximum":24},{"type":"null"}]},"metadata":{"default":{},"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"minZoom":{"type":"number","minimum":0,"maximum":24},"platformTargets":{"minItems":1,"type":"array","items":{"type":"string","enum":["ios","web"]}},"priority":{"type":"integer","minimum":-100,"maximum":100},"startsAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"summary":{"type":"string","minLength":1,"maxLength":500},"title":{"type":"string","minLength":1,"maxLength":160},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["audience","createdAt","detail","enabled","endsAt","id","imageGuidelinesVersion","kind","key","maxZoom","metadata","minZoom","platformTargets","priority","startsAt","summary","title","updatedAt"],"additionalProperties":false}},"required":["marker","set"],"additionalProperties":false}},"schemaVersion":{"type":"number","const":1}},"required":["fetchedAt","placements","schemaVersion"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Fetch managed map markers for the current viewport","tags":["User Domain"]}},"/api/user/runtime":{"get":{"description":"Loads authenticated runtime flags, links, and managed launch content used by signed-in clients.","operationId":"get_api_user_runtime","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Load authenticated runtime config","tags":["User Domain"]}},"/api/user":{"get":{"description":"Loads the current authenticated user profile and entitlement-owned account state.","operationId":"get_api_user","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Load current user","tags":["User Domain"]},"patch":{"description":"Updates the current user profile fields.","operationId":"patch_api_user","parameters":[],"requestBody":{"content":{"application/json":{"example":{"name":"Docs Explorer","newsletterEnabled":false},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"acceptedRisk":{"type":"boolean"},"avatarUrl":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}]},"hasSeenOptIn":{"type":"boolean"},"lastViewedtermsDate":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"name":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}]},"newsletterEnabled":{"type":"boolean"},"researchEnabled":{"type":"boolean"}},"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Update current user","tags":["User Domain"]}},"/api/user/support-summary":{"get":{"description":"Returns a compact account summary for support and debugging flows.","operationId":"get_api_user_support_summary","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Load support summary","tags":["User Domain"]}},"/api/user/settings":{"get":{"description":"Loads durable backend-owned user settings.","operationId":"get_api_user_settings","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Load user settings","tags":["User Domain"]},"put":{"description":"Updates the signed-in user settings contract.","operationId":"put_api_user_settings","parameters":[],"requestBody":{"content":{"application/json":{"example":{"anonymousAnalyticsEnabled":true,"appUpdatePromptsEnabled":true,"cameraModePreference":"three_d","mapStylePreference":"winter"},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"appUpdatePromptsEnabled":{"type":"boolean"},"anonymousAnalyticsEnabled":{"type":"boolean"},"cameraModePreference":{"type":"string","enum":["three_d","two_d"]},"forecastPolygonOpacityPreset":{"type":"string","enum":["standard","strong","subdued"]},"ignoredRecommendedVersion":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}]},"layerVisibility":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"boolean"}},"mapStylePreference":{"type":"string","enum":["satellite","standard","winter"]},"newsletterEnabled":{"type":"boolean"},"researchEnabled":{"type":"boolean"}},"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Update user settings","tags":["User Domain"]}},"/api/user/map-markers/events":{"post":{"description":"Records customer-facing placement analytics so sponsored or informational marker interactions stay queryable inside the backend.","operationId":"post_api_user_map_markers_events","parameters":[],"requestBody":{"content":{"application/json":{"example":{"events":[{"event":"tap","markerID":"marker_demo_center","occurredAt":"2026-04-13T18:30:00.000Z","platform":"ios","sessionID":"session_123","setID":"set_demo_center","surfaceID":"map","zoom":12.5}],"schemaVersion":1},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"events":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"object","properties":{"event":{"type":"string","enum":["impression","tap","detail_open","cta_open"]},"markerID":{"type":"string","minLength":1,"maxLength":120},"occurredAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"platform":{"type":"string","enum":["ios","web"]},"sessionID":{"type":"string","minLength":1,"maxLength":120},"setID":{"type":"string","minLength":1,"maxLength":120},"surfaceID":{"default":null,"anyOf":[{"type":"string","minLength":1,"maxLength":120},{"type":"null"}]},"zoom":{"default":null,"anyOf":[{"type":"number","minimum":0,"maximum":24},{"type":"null"}]}},"required":["event","markerID","occurredAt","platform","sessionID","setID","surfaceID","zoom"],"additionalProperties":false}},"schemaVersion":{"type":"number","const":1}},"required":["events","schemaVersion"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"acceptedCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"schemaVersion":{"type":"number","const":1}},"required":["acceptedCount","schemaVersion"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Record map marker analytics events","tags":["User Domain"]}},"/api/user/favorite-zones":{"post":{"description":"Adds a single favorite forecast zone.","operationId":"post_api_user_favorite_zones","parameters":[],"requestBody":{"content":{"application/json":{"example":{"isPrimary":false,"lastKnownAreaID":null,"lastKnownName":"Example Forecast Zone","lastKnownState":"CO","sortOrder":0,"zoneID":"$sampleForecastZoneID"},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"isPrimary":{"default":false,"type":"boolean"},"lastKnownAreaID":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}]},"lastKnownName":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}]},"lastKnownState":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}]},"sortOrder":{"default":0,"type":"integer","minimum":0,"maximum":10000},"zoneID":{"type":"string","minLength":1,"maxLength":200}},"required":["isPrimary","sortOrder","zoneID"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Add a favorite zone","tags":["User Domain"]},"get":{"description":"Lists the signed-in user’s pinned forecast zones.","operationId":"get_api_user_favorite_zones","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"zones":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}}},"required":["zones"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"List favorite zones","tags":["User Domain"]},"put":{"description":"Replaces the full favorite-zone ordering and metadata set.","operationId":"put_api_user_favorite_zones","parameters":[],"requestBody":{"content":{"application/json":{"example":{"zones":[{"isPrimary":true,"lastKnownAreaID":null,"lastKnownName":"Example Forecast Zone","lastKnownState":"CO","sortOrder":0,"zoneID":"$sampleForecastZoneID"}]},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"zones":{"maxItems":20,"type":"array","items":{"type":"object","properties":{"isPrimary":{"default":false,"type":"boolean"},"lastKnownAreaID":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}]},"lastKnownName":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}]},"lastKnownState":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}]},"sortOrder":{"default":0,"type":"integer","minimum":0,"maximum":10000},"zoneID":{"type":"string","minLength":1,"maxLength":200}},"required":["isPrimary","sortOrder","zoneID"],"additionalProperties":false}}},"required":["zones"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"zones":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}}},"required":["zones"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Replace favorite zones","tags":["User Domain"]}},"/api/user/favorite-zones/:zoneID":{"delete":{"description":"Removes a favorite zone from the signed-in account.","operationId":"delete_api_user_favorite_zones_zoneID","parameters":[{"example":"$firstFavoriteZoneID","in":"path","name":"zoneID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Delete a favorite zone","tags":["User Domain"]},"patch":{"description":"Patches ordering or primary state for a favorite zone.","operationId":"patch_api_user_favorite_zones_zoneID","parameters":[{"example":"$firstFavoriteZoneID","in":"path","name":"zoneID","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"example":{"isPrimary":true,"sortOrder":0},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"isPrimary":{"type":"boolean"},"sortOrder":{"type":"integer","minimum":0,"maximum":10000}},"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Patch a favorite zone","tags":["User Domain"]}},"/api/user/forecast-overrides/:zoneID":{"delete":{"description":"Clears the active forecast override for a zone.","operationId":"delete_api_user_forecast_overrides_zoneID","parameters":[{"example":"$sampleForecastZoneID","in":"path","name":"zoneID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Delete forecast override","tags":["User Domain"]},"put":{"description":"Creates or updates a forecast override for a zone and forecast revision.","operationId":"put_api_user_forecast_overrides_zoneID","parameters":[{"example":"$sampleForecastZoneID","in":"path","name":"zoneID","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"example":{"acknowledged":true,"effectiveDangerLevel":3,"forecastRevisionID":"rev-placeholder","reasons":["Testing from docs"],"source":"update_forecast"},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"acknowledged":{"type":"boolean"},"effectiveDangerLevel":{"type":"integer","minimum":1,"maximum":6},"forecastRevisionID":{"type":"string","minLength":1},"reasons":{"default":[],"maxItems":12,"type":"array","items":{"type":"string","minLength":1,"maxLength":200}},"source":{"type":"string","enum":["pro_tools","update_forecast"]}},"required":["acknowledged","effectiveDangerLevel","forecastRevisionID","reasons","source"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Upsert forecast override","tags":["User Domain"]}},"/api/user/forecast-override-history":{"get":{"description":"Lists the forecast-override accountability history for the signed-in account.","operationId":"get_api_user_forecast_override_history","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"history":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}}},"required":["history"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"List forecast override history","tags":["User Domain"]}},"/api/user/forecast-overrides":{"get":{"description":"Lists active forecast overrides for the signed-in account.","operationId":"get_api_user_forecast_overrides","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"overrides":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}}},"required":["overrides"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"List forecast overrides","tags":["User Domain"]}},"/api/user/safety-contacts":{"post":{"description":"Adds a safety contact and triggers verification flow where applicable.","operationId":"post_api_user_safety_contacts","parameters":[],"requestBody":{"content":{"application/json":{"example":{"email":"contact@example.com","name":"Field Partner","phone":null,"relationship":"Partner"},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"email":{"default":null,"anyOf":[{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}]},"name":{"type":"string","minLength":1,"maxLength":200},"phone":{"default":null,"anyOf":[{"type":"string","maxLength":50},{"type":"null"}]},"relationship":{"default":null,"anyOf":[{"type":"string","maxLength":100},{"type":"null"}]}},"required":["email","name","phone","relationship"],"additionalProperties":false}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":{}}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Create a safety contact","tags":["User Domain"]},"get":{"description":"Lists safety contacts configured for trip sharing and overdue alerts.","operationId":"get_api_user_safety_contacts","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}}},"required":["contacts"],"additionalProperties":false}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"List safety contacts","tags":["User Domain"]}},"/api/user/safety-contacts/:contactID":{"delete":{"description":"Deletes a safety contact by ID.","operationId":"delete_api_user_safety_contacts_contactID","parameters":[{"example":"$firstSafetyContactID","in":"path","name":"contactID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Delete a safety contact","tags":["User Domain"]}},"/api/user/safety-contacts/:contactID/resend-verification":{"post":{"description":"Resends the safety-contact verification email.","operationId":"post_api_user_safety_contacts_contactID_resend_verification","parameters":[{"example":"$firstSafetyContactID","in":"path","name":"contactID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"description":"Successful response"},"400":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"string"}},"required":["error"],"additionalProperties":false}}},"description":"Authentication required"}},"security":[{"cookieSession":[]}],"summary":"Resend safety-contact verification","tags":["User Domain"]}}},"security":[],"servers":[{"description":"Current hosted environment","url":"https://staging-app.bagels.top"}],"tags":[{"description":"Operator session auth, support tooling, route/trip inspection, forecasts, ops health, and audit surfaces.","name":"Admin & Operators"},{"description":"Session auth, elevation, invites, and platform integrations.","name":"Auth & Platform"},{"description":"Forecast, summaries, revisions, and weather-backed briefing surfaces.","name":"Forecast & Home"},{"description":"Current user, settings, favorite zones, overrides, and safety contacts.","name":"User Domain"},{"description":"Saved routes, route plans, work sessions, import/export, and unified search.","name":"Routes, Plans & Library"},{"description":"Route exposure, terrain analysis, readiness, trip safety, debrief, and AI briefing helpers.","name":"Route Intelligence & Trip Safety"},{"description":"Catalog, entitlements, checkout handoff, buddy passes, diagnostics, and debug overrides.","name":"Commerce & Debug"},{"description":"Education progress tracking and content-driven onboarding support.","name":"Education"},{"description":"Public bootstrap, legal content, incidents, and hosted catalog data.","name":"Public Content"},{"description":"Backend-owned analytics contract and event sink seam.","name":"Analytics"},{"description":"Hosted prompt builders and normalization helpers for AI-assisted flows.","name":"AI Helpers"}],"components":{"securitySchemes":{"cookieSession":{"in":"cookie","name":"aspectavy_staging_session","type":"apiKey"},"operatorCookieSession":{"description":"Separate operator session cookie used by the admin portal and operator APIs.","in":"cookie","name":"operator_session","type":"apiKey"},"webhookSignature":{"description":"Provider-authenticated webhook requests require real signature headers and are documented for completeness.","in":"header","name":"provider-signature","type":"apiKey"}}}}