{
  "openapi": "3.0.3",
  "info": {
    "title": "SailSync subscriber API",
    "version": "0.6.4",
    "description": "Read sailing sessions, GPS, wind and saved race analysis, or connect an agent through MCP. Available for Racer and Gold subscribers. Use a personal API token; write actions require extra permissions. See the [quickstart](/quickstart.html) and [agent recipes](/agents.html)."
  },
  "servers": [
    {
      "url": "https://www.sailsync.io",
      "description": "Production \u2014 use a production-issued personal token"
    }
  ],
  "security": [
    {
      "integrationToken": []
    }
  ],
  "paths": {
    "/api/integrations/v1/me": {
      "get": {
        "operationId": "getSailSyncAccount",
        "summary": "Read current subscriber identity and implemented capabilities",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Current subscriber user ID, token scopes and implemented capabilities",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SubscriberAccount"
                },
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "schema_version": "subscriber_api_v1",
                      "user_id": 603,
                      "plan": "gold",
                      "scopes": [
                        "data:read",
                        "sessions:write"
                      ],
                      "capabilities": [
                        "account.read",
                        "sessions.owned.list",
                        "sessions.owned.read",
                        "tracks.owned.gps",
                        "events.public.list",
                        "events.public.read",
                        "event_days.access.read",
                        "sessions.accessible.read",
                        "tracks.accessible.gps",
                        "wind.read",
                        "analysis.catalog",
                        "analysis.facts",
                        "analysis.results",
                        "analysis.starts"
                      ],
                      "compute_available": false,
                      "imports_available": false,
                      "flo_available": false,
                      "limits": {
                        "max_page_size": 100
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked personal integration token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "error": "authentication_required"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Authentication, eligibility, rollout or shared rate-limit error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "error": "subscription_required"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Authentication, eligibility, rollout or shared rate-limit error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "error": "not_available"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Authentication, eligibility, rollout or shared rate-limit error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "error": "rate_limited"
                    }
                  }
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Seconds before retrying.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "503": {
            "description": "Authentication, eligibility, rollout or shared rate-limit error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "error": "rate_limit_unavailable"
                    }
                  }
                }
              }
            }
          }
        },
        "tags": [
          "Account"
        ],
        "description": "Read your plan, token permissions and available capabilities."
      }
    },
    "/api/integrations/v1/sessions": {
      "get": {
        "operationId": "listOwnedSailSyncSessions",
        "summary": "List sessions owned by this subscriber",
        "description": "List your owned sessions, newest first. Date filters select sessions overlapping the requested window.",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100
            }
          },
          {
            "name": "before_id",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991
            }
          },
          {
            "name": "boat_class",
            "in": "query",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 80
            }
          },
          {
            "name": "from",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time",
              "maxLength": 40
            }
          },
          {
            "name": "to",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time",
              "maxLength": 40
            }
          }
        ],
        "responses": {
          "200": {
            "description": "sessions array (id, name, class, session/effective UTC windows, first race number, track count), next_before_id cursor; no sharing credentials",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OwnedSessionPage"
                },
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "schema_version": "subscriber_sessions_v1",
                      "sessions": [
                        {
                          "id": 364,
                          "name": "Second",
                          "boat_class": "ILCA 6",
                          "start_time": "2026-10-23T05:00:00-07:00",
                          "end_time": "2026-10-23T06:00:00-07:00",
                          "effective_start_time": null,
                          "effective_end_time": null,
                          "first_race_number": 1,
                          "track_count": 0
                        }
                      ],
                      "next_before_id": 364
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked personal integration token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "example": {
                  "error": "authentication_required"
                }
              }
            }
          },
          "403": {
            "description": "Current subscription or required scope unavailable",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "422": {
            "description": "Invalid pagination or date/class filter",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "error": "invalid_filter"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Shared account quota exceeded; Retry-After header",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Seconds before retrying.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "503": {
            "description": "Shared limiter unavailable; fail closed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "404": {
            "description": "The resource is unavailable or subscriber integrations are disabled.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          }
        },
        "tags": [
          "Sessions & data"
        ]
      },
      "post": {
        "operationId": "createOwnedSailSyncSession",
        "summary": "Create an owned session with explicit UTC bounds and timezone",
        "description": "Requires sessions:write. Create an owned session lasting up to 24 hours. Use UTC ISO8601 start/end times and a named timezone. Automatic race detection is off.",
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 80,
              "pattern": "^[A-Za-z0-9_-]{8,80}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Completed receipt or current state. Retry uses the same key and returns the original result.",
            "content": {
              "application/json": {
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "receipt_id": 78,
                      "operation": "session",
                      "initiator_user_id": 600,
                      "source_sha256": null,
                      "result": {
                        "completed": true,
                        "session_id": 345,
                        "wind_version": "6cd8cec706fa11110d83fb46f97df1f9be43b4c570f3390e7c7f6a5173f595e6"
                      }
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/SessionImportReceipt"
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked personal integration token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "example": {
                  "error": "authentication_required"
                }
              }
            }
          },
          "403": {
            "description": "Subscription, scope or boat limit denied",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "404": {
            "description": "Not enabled or not owned/found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "409": {
            "description": "Idempotency/version conflict or original result removed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "error": "idempotency_conflict"
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "Input too large",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input; safe code and optional numeric row",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "429": {
            "description": "Shared account/service budget exhausted; honor Retry-After",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "error": "rate_limited",
                      "budget": "output_hour",
                      "limit": 1,
                      "remaining": 1,
                      "reset_at": 1793150286,
                      "retry_after": 3600
                    }
                  }
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Seconds before retrying.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "503": {
            "description": "Unavailable; keep the original idempotency key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "name": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200
                  },
                  "boat_class": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 80
                  },
                  "start_time": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 40
                  },
                  "end_time": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 40
                  },
                  "timezone": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 80
                  },
                  "batch_reference": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 80
                  }
                },
                "required": [
                  "name",
                  "boat_class",
                  "start_time",
                  "end_time",
                  "timezone"
                ]
              }
            }
          }
        },
        "tags": [
          "Imports"
        ]
      }
    },
    "/api/integrations/v1/sessions/{session_id}/tracks/{id}/points": {
      "get": {
        "operationId": "getOwnedSailSyncGpsPoints",
        "summary": "Read full-resolution committed GPS within an owned session window",
        "description": "Read committed boat positions within the session window. Timestamps already include the track offset. Follow next_cursor; restart the current track if its source changes.",
        "parameters": [
          {
            "name": "session_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 5000
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "schema": {
              "type": "string",
              "maxLength": 2048
            }
          }
        ],
        "responses": {
          "200": {
            "description": "available, window, full-resolution normalized GPS points, authorized point_count, source_ref, next_cursor",
            "content": {
              "application/json": {
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "available": true,
                      "session_id": 385,
                      "session_track_id": 163,
                      "resolution": "committed_full_resolution_gps",
                      "source_ref": "5341e104981e0b019a4200cff00ae797c877810318bf63603910043fb28c869c",
                      "time_basis": "session_epoch_seconds_with_track_offset",
                      "time_offset": 7.0,
                      "window": {
                        "start": 5000.0,
                        "end": 15000.0
                      },
                      "point_count": 10001,
                      "points": [
                        {
                          "time_epoch": 5000.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5001.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5002.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5003.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5004.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5005.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5006.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5007.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5008.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5009.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5010.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5011.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5012.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5013.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5014.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5015.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5016.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5017.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5018.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5019.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5020.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5021.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5022.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5023.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5024.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5025.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5026.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5027.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5028.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5029.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5030.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5031.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5032.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5033.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5034.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5035.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5036.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5037.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5038.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5039.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5040.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5041.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5042.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5043.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5044.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5045.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5046.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5047.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5048.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5049.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5050.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5051.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5052.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5053.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5054.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5055.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5056.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5057.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5058.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5059.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5060.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5061.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5062.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5063.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5064.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5065.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5066.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5067.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5068.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5069.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5070.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5071.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5072.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5073.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5074.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5075.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5076.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5077.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5078.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5079.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5080.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5081.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5082.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5083.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5084.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5085.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5086.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5087.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5088.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5089.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5090.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5091.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5092.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5093.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5094.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5095.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5096.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5097.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5098.0,
                          "lat": 45.0,
                          "lng": -71.0
                        },
                        {
                          "time_epoch": 5099.0,
                          "lat": 45.0,
                          "lng": -71.0
                        }
                      ],
                      "next_cursor": "EXAMPLE_CURSOR_REPLACE_WITH_CURRENT_RESPONSE"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/GpsPage"
                }
              }
            }
          },
          "404": {
            "description": "Session or boat track missing or not owned",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "error": "not_found"
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Source unavailable/changed; unavailable reason or restart paging",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/UnavailableGps"
                    },
                    {
                      "$ref": "#/components/schemas/IntegrationError"
                    }
                  ]
                },
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "error": "source_changed_restart_paging"
                    }
                  }
                }
              }
            }
          },
          "422": {
            "description": "Invalid page/cursor",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "error": "invalid_page"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Shared account read or data-read limit exceeded; Retry-After",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "error": "rate_limited",
                      "budget": "upstream_hour",
                      "limit": 2606832,
                      "remaining": 0,
                      "reset_at": 1793150290,
                      "retry_after": 3600
                    }
                  }
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Seconds before retrying.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked personal integration token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "403": {
            "description": "Current subscription or required token scope is unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "503": {
            "description": "A required limiter, budget service or backend is unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          }
        },
        "tags": [
          "Sessions & data"
        ]
      }
    },
    "/api/integrations/v1/sessions/{id}": {
      "get": {
        "operationId": "getOwnedSailSyncSession",
        "summary": "Read safe owned-session metadata and discover track IDs",
        "description": "Read session details and paginated track IDs. gps_supported identifies a supported source type; use the points endpoint to check data availability.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100
            }
          },
          {
            "name": "before_track_id",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Safe session metadata, tracks, next_before_track_id",
            "content": {
              "application/json": {
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "schema_version": "subscriber_session_v1",
                      "session": {
                        "id": 346,
                        "name": "Afternoon training",
                        "boat_class": "ILCA 6",
                        "first_race_number": 1,
                        "start_time": "2026-10-21T03:00:00-07:00",
                        "end_time": "2026-10-21T09:00:00-07:00"
                      },
                      "tracks": [
                        {
                          "session_track_id": 149,
                          "manual_track_id": 125,
                          "points_sha256": "2b3b1e0eeeacbafa87018a45571c4ea148057f9d9e8610aa27995785098b04ce",
                          "data_revision": 1,
                          "name": "Example Sailor",
                          "type": "boat",
                          "time_offset": 0.0,
                          "sailing_window": [
                            1792576800,
                            1792576810
                          ],
                          "gps_supported": true
                        }
                      ],
                      "next_before_track_id": null
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/OwnedSessionResponse"
                }
              }
            }
          },
          "404": {
            "description": "Not owned or not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "error": "not_found"
                    }
                  }
                }
              }
            }
          },
          "422": {
            "description": "Invalid page",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked personal integration token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "403": {
            "description": "Current subscription or required token scope is unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "429": {
            "description": "Shared account, service, rate or cost budget exceeded. Honor Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "503": {
            "description": "A required limiter, budget service or backend is unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          }
        },
        "tags": [
          "Sessions & data"
        ]
      }
    },
    "/api/integrations/v1/events": {
      "get": {
        "operationId": "listSailSyncEvents",
        "summary": "Discover public events",
        "description": "Discover public events. Follow next_page for more results.",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "schema": {
              "type": "string",
              "maxLength": 120
            }
          },
          {
            "name": "boat_class",
            "in": "query",
            "schema": {
              "type": "string",
              "maxLength": 80
            }
          },
          {
            "name": "date_from",
            "in": "query",
            "schema": {
              "type": "string",
              "maxLength": 10
            }
          },
          {
            "name": "date_to",
            "in": "query",
            "schema": {
              "type": "string",
              "maxLength": 10
            }
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10000
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Authorized read response",
            "content": {
              "application/json": {
                "examples": {
                  "ilcaWorlds": {
                    "summary": "ILCA 6 Worlds \u00b7 September 12",
                    "description": "Captured from session 3455. Contact details are sanitized; example cursors are placeholders.",
                    "value": {
                      "events": [
                        {
                          "id": 15,
                          "title": "2026 ILCA 6 Worlds Dublin Ireland Race Reports",
                          "starts_on": "2026-09-07",
                          "ends_on": "2026-09-12",
                          "timezone": "Europe/Dublin",
                          "location": "National Yacht Club",
                          "description": "EMAIL: contact@sailsync.ai if you have any questions or issues.\n\nFind us on Instagram at @ilca.sailsync for highlights and reels!\n\nAccess AI-powered performance reports for each race (unofficial) below! \n\nPurchase includes:\n- Customized AI report\n- Access to 3D race replay on SailSync Web\n- Access to FLO AI chats about your sailing\n\nGeneral day reports are free and unlimited for this existing event. Customized reports remain separately available under the existing purchase terms.\n\nCustom reports are personalized to the sailor of your choice.\n\n** DTL-at-go is an estimate based on telemetry, NOT official RaceSense OCS data. **\n\nData: Vakaros RaceSense",
                          "boat_classes": [
                            "ILCA 6"
                          ]
                        }
                      ],
                      "page": 1,
                      "next_page": null,
                      "total": 1
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/EventPage"
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked personal integration token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "example": {
                  "error": "authentication_required"
                }
              }
            }
          },
          "403": {
            "description": "Current subscription/scope unavailable",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "404": {
            "description": "Resource hidden or not authorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "409": {
            "description": "Data missing/changed; inspect safe reason",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "422": {
            "description": "Invalid filter/selection/snapshot",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "429": {
            "description": "Shared read/data quota; Retry-After",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Seconds before retrying.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "503": {
            "description": "A required limiter, budget service or backend is unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          }
        },
        "tags": [
          "Events"
        ]
      }
    },
    "/api/integrations/v1/events/{id}": {
      "get": {
        "operationId": "getSailSyncEvent",
        "summary": "Read public event day/fleet/session assignments",
        "description": "Read an event and its day/fleet sessions. Follow next_after_assignment_id for more sessions.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100
            }
          },
          {
            "name": "after_assignment_id",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Authorized read response",
            "content": {
              "application/json": {
                "examples": {
                  "ilcaWorlds": {
                    "summary": "ILCA 6 Worlds \u00b7 September 12",
                    "description": "Captured from session 3455. Contact details are sanitized; example cursors are placeholders.",
                    "value": {
                      "event": {
                        "id": 15,
                        "title": "2026 ILCA 6 Worlds Dublin Ireland Race Reports",
                        "starts_on": "2026-09-07",
                        "ends_on": "2026-09-12",
                        "timezone": "Europe/Dublin",
                        "location": "National Yacht Club",
                        "description": "EMAIL: contact@sailsync.ai if you have any questions or issues.\n\nFind us on Instagram at @ilca.sailsync for highlights and reels!\n\nAccess AI-powered performance reports for each race (unofficial) below! \n\nPurchase includes:\n- Customized AI report\n- Access to 3D race replay on SailSync Web\n- Access to FLO AI chats about your sailing\n\nGeneral day reports are free and unlimited for this existing event. Customized reports remain separately available under the existing purchase terms.\n\nCustom reports are personalized to the sailor of your choice.\n\n** DTL-at-go is an estimate based on telemetry, NOT official RaceSense OCS data. **\n\nData: Vakaros RaceSense",
                        "boat_classes": [
                          "ILCA 6"
                        ]
                      },
                      "sessions": [
                        {
                          "assignment_id": 100,
                          "session_id": 3347,
                          "date": "2026-09-07",
                          "division": "Blue",
                          "boat_class": "ILCA 6",
                          "races": [
                            {
                              "id": "comment_6703",
                              "debrief_scope_id": "comment_6703",
                              "source_comment_id": 6703,
                              "index": 1,
                              "display_number": 1,
                              "label": "Race 1",
                              "heat": null,
                              "time_range": {
                                "start": 1788779701.0,
                                "end": null
                              }
                            },
                            {
                              "id": "comment_6704",
                              "debrief_scope_id": "comment_6704",
                              "source_comment_id": 6704,
                              "index": 2,
                              "display_number": 2,
                              "label": "Race 2",
                              "heat": null,
                              "time_range": {
                                "start": 1788784201.0,
                                "end": null
                              }
                            },
                            {
                              "id": "comment_6705",
                              "debrief_scope_id": "comment_6705",
                              "source_comment_id": 6705,
                              "index": 3,
                              "display_number": 3,
                              "label": "Race 3",
                              "heat": null,
                              "time_range": {
                                "start": 1788788701.0,
                                "end": null
                              }
                            }
                          ],
                          "access_allowed": true,
                          "access_path": "/api/integrations/v1/events/15/days/100/access"
                        },
                        {
                          "assignment_id": 101,
                          "session_id": 3348,
                          "date": "2026-09-07",
                          "division": "Yellow",
                          "boat_class": "ILCA 6",
                          "races": [
                            {
                              "id": "comment_6706",
                              "debrief_scope_id": "comment_6706",
                              "source_comment_id": 6706,
                              "index": 1,
                              "display_number": 1,
                              "label": "Race 1",
                              "heat": null,
                              "time_range": {
                                "start": 1788779100.2499998,
                                "end": null
                              }
                            },
                            {
                              "id": "comment_6707",
                              "debrief_scope_id": "comment_6707",
                              "source_comment_id": 6707,
                              "index": 2,
                              "display_number": 2,
                              "label": "Race 2",
                              "heat": null,
                              "time_range": {
                                "start": 1788783601.0,
                                "end": null
                              }
                            },
                            {
                              "id": "comment_6708",
                              "debrief_scope_id": "comment_6708",
                              "source_comment_id": 6708,
                              "index": 3,
                              "display_number": 3,
                              "label": "Race 3",
                              "heat": null,
                              "time_range": {
                                "start": 1788788101.0,
                                "end": null
                              }
                            }
                          ],
                          "access_allowed": true,
                          "access_path": "/api/integrations/v1/events/15/days/101/access"
                        },
                        {
                          "assignment_id": 102,
                          "session_id": 3362,
                          "date": "2026-09-08",
                          "division": "Blue",
                          "boat_class": "ILCA 6",
                          "races": [
                            {
                              "id": "comment_6733",
                              "debrief_scope_id": "comment_6733",
                              "source_comment_id": 6733,
                              "index": 1,
                              "display_number": 4,
                              "label": "Race 4",
                              "heat": null,
                              "time_range": {
                                "start": 1788866101.0,
                                "end": null
                              }
                            },
                            {
                              "id": "comment_6734",
                              "debrief_scope_id": "comment_6734",
                              "source_comment_id": 6734,
                              "index": 2,
                              "display_number": 5,
                              "label": "Race 5",
                              "heat": null,
                              "time_range": {
                                "start": 1788870901.0,
                                "end": null
                              }
                            }
                          ],
                          "access_allowed": true,
                          "access_path": "/api/integrations/v1/events/15/days/102/access"
                        },
                        {
                          "assignment_id": 103,
                          "session_id": 3361,
                          "date": "2026-09-08",
                          "division": "Yellow",
                          "boat_class": "ILCA 6",
                          "races": [
                            {
                              "id": "comment_6731",
                              "debrief_scope_id": "comment_6731",
                              "source_comment_id": 6731,
                              "index": 1,
                              "display_number": 4,
                              "label": "Race 4",
                              "heat": null,
                              "time_range": {
                                "start": 1788865501.0,
                                "end": null
                              }
                            },
                            {
                              "id": "comment_6732",
                              "debrief_scope_id": "comment_6732",
                              "source_comment_id": 6732,
                              "index": 2,
                              "display_number": 5,
                              "label": "Race 5",
                              "heat": null,
                              "time_range": {
                                "start": 1788870301.0,
                                "end": null
                              }
                            }
                          ],
                          "access_allowed": true,
                          "access_path": "/api/integrations/v1/events/15/days/103/access"
                        },
                        {
                          "assignment_id": 108,
                          "session_id": 3377,
                          "date": "2026-09-09",
                          "division": "Gold",
                          "boat_class": "ILCA 6",
                          "races": [
                            {
                              "id": "comment_6769",
                              "debrief_scope_id": "comment_6769",
                              "source_comment_id": 6769,
                              "index": 1,
                              "display_number": 1,
                              "label": "Race 1",
                              "heat": null,
                              "time_range": {
                                "start": 1788955980.7500002,
                                "end": null
                              }
                            }
                          ],
                          "access_allowed": true,
                          "access_path": "/api/integrations/v1/events/15/days/108/access"
                        },
                        {
                          "assignment_id": 109,
                          "session_id": 3378,
                          "date": "2026-09-09",
                          "division": "Silver",
                          "boat_class": "ILCA 6",
                          "races": [
                            {
                              "id": "comment_6770",
                              "debrief_scope_id": "comment_6770",
                              "source_comment_id": 6770,
                              "index": 1,
                              "display_number": 1,
                              "label": "Race 1",
                              "heat": null,
                              "time_range": {
                                "start": 1788956581.0,
                                "end": null
                              }
                            }
                          ],
                          "access_allowed": true,
                          "access_path": "/api/integrations/v1/events/15/days/109/access"
                        },
                        {
                          "assignment_id": 114,
                          "session_id": 3394,
                          "date": "2026-09-10",
                          "division": "Gold",
                          "boat_class": "ILCA 6",
                          "races": [
                            {
                              "id": "comment_6814",
                              "debrief_scope_id": "comment_6814",
                              "source_comment_id": 6814,
                              "index": 1,
                              "display_number": 2,
                              "label": "Race 2",
                              "heat": null,
                              "time_range": {
                                "start": 1789034701.0,
                                "end": null
                              }
                            },
                            {
                              "id": "comment_6815",
                              "debrief_scope_id": "comment_6815",
                              "source_comment_id": 6815,
                              "index": 2,
                              "display_number": 3,
                              "label": "Race 3",
                              "heat": null,
                              "time_range": {
                                "start": 1789040400.0,
                                "end": null
                              }
                            },
                            {
                              "id": "comment_6816",
                              "debrief_scope_id": "comment_6816",
                              "source_comment_id": 6816,
                              "index": 3,
                              "display_number": 4,
                              "label": "Race 4",
                              "heat": null,
                              "time_range": {
                                "start": 1789046820.0,
                                "end": null
                              }
                            }
                          ],
                          "access_allowed": true,
                          "access_path": "/api/integrations/v1/events/15/days/114/access"
                        },
                        {
                          "assignment_id": 115,
                          "session_id": 3395,
                          "date": "2026-09-10",
                          "division": "Silver",
                          "boat_class": "ILCA 6",
                          "races": [
                            {
                              "id": "comment_6817",
                              "debrief_scope_id": "comment_6817",
                              "source_comment_id": 6817,
                              "index": 1,
                              "display_number": 2,
                              "label": "Race 2",
                              "heat": null,
                              "time_range": {
                                "start": 1789035301.0,
                                "end": null
                              }
                            },
                            {
                              "id": "comment_6818",
                              "debrief_scope_id": "comment_6818",
                              "source_comment_id": 6818,
                              "index": 2,
                              "display_number": 3,
                              "label": "Race 3",
                              "heat": null,
                              "time_range": {
                                "start": 1789041001.0,
                                "end": null
                              }
                            },
                            {
                              "id": "comment_6819",
                              "debrief_scope_id": "comment_6819",
                              "source_comment_id": 6819,
                              "index": 3,
                              "display_number": 4,
                              "label": "Race 4",
                              "heat": null,
                              "time_range": {
                                "start": 1789047421.0,
                                "end": null
                              }
                            }
                          ],
                          "access_allowed": true,
                          "access_path": "/api/integrations/v1/events/15/days/115/access"
                        },
                        {
                          "assignment_id": 117,
                          "session_id": 3404,
                          "date": "2026-09-11",
                          "division": "Gold",
                          "boat_class": "ILCA 6",
                          "races": [
                            {
                              "id": "comment_6835",
                              "debrief_scope_id": "comment_6835",
                              "source_comment_id": 6835,
                              "index": 1,
                              "display_number": 5,
                              "label": "Race 5",
                              "heat": null,
                              "time_range": {
                                "start": 1789121101.0,
                                "end": null
                              }
                            }
                          ],
                          "access_allowed": true,
                          "access_path": "/api/integrations/v1/events/15/days/117/access"
                        },
                        {
                          "assignment_id": 119,
                          "session_id": 3455,
                          "date": "2026-09-12",
                          "division": "Finals",
                          "boat_class": "ILCA 6",
                          "races": [
                            {
                              "id": "comment_6918",
                              "debrief_scope_id": "comment_6918",
                              "source_comment_id": 6918,
                              "index": 1,
                              "display_number": 1,
                              "label": "Race 1",
                              "heat": null,
                              "time_range": {
                                "start": 1789216381.0,
                                "end": null
                              }
                            },
                            {
                              "id": "comment_6919",
                              "debrief_scope_id": "comment_6919",
                              "source_comment_id": 6919,
                              "index": 2,
                              "display_number": 2,
                              "label": "Race 2",
                              "heat": null,
                              "time_range": {
                                "start": 1789218481.0,
                                "end": null
                              }
                            }
                          ],
                          "access_allowed": true,
                          "access_path": "/api/integrations/v1/events/15/days/119/access"
                        },
                        {
                          "assignment_id": 294,
                          "session_id": 3979,
                          "date": "2026-09-12",
                          "division": "Gold",
                          "boat_class": "ILCA 6",
                          "races": [
                            {
                              "id": "comment_7844",
                              "debrief_scope_id": "comment_7844",
                              "source_comment_id": 7844,
                              "index": 1,
                              "display_number": 6,
                              "label": "Race 6",
                              "heat": null,
                              "time_range": {
                                "start": 1789207501.0,
                                "end": 1789212088.9
                              }
                            }
                          ],
                          "access_allowed": true,
                          "access_path": "/api/integrations/v1/events/15/days/294/access"
                        },
                        {
                          "assignment_id": 295,
                          "session_id": 3536,
                          "date": "2026-09-12",
                          "division": "Silver",
                          "boat_class": "ILCA 6",
                          "races": [
                            {
                              "id": "comment_7008",
                              "debrief_scope_id": "comment_7008",
                              "source_comment_id": 7008,
                              "index": 1,
                              "display_number": 6,
                              "label": "Race 6",
                              "heat": null,
                              "time_range": {
                                "start": 1789208101.0,
                                "end": 1789215901.0
                              }
                            }
                          ],
                          "access_allowed": true,
                          "access_path": "/api/integrations/v1/events/15/days/295/access"
                        },
                        {
                          "assignment_id": 303,
                          "session_id": 3991,
                          "date": "2026-09-11",
                          "division": "Silver",
                          "boat_class": "ILCA 6",
                          "races": [
                            {
                              "id": "comment_7863",
                              "debrief_scope_id": "comment_7863",
                              "source_comment_id": 7863,
                              "index": 1,
                              "display_number": 5,
                              "label": "Race 5",
                              "heat": null,
                              "time_range": {
                                "start": 1789121701.0,
                                "end": 1789125701.0
                              }
                            }
                          ],
                          "access_allowed": true,
                          "access_path": "/api/integrations/v1/events/15/days/303/access"
                        }
                      ],
                      "next_after_assignment_id": null
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/EventDetail"
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked personal integration token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "example": {
                  "error": "authentication_required"
                }
              }
            }
          },
          "403": {
            "description": "Current subscription/scope unavailable",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "404": {
            "description": "Resource hidden or not authorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "error": "not_found"
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Data missing/changed; inspect safe reason",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "422": {
            "description": "Invalid filter/selection/snapshot",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "429": {
            "description": "Shared read/data quota; Retry-After",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Seconds before retrying.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "503": {
            "description": "A required limiter, budget service or backend is unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          }
        },
        "tags": [
          "Events"
        ]
      }
    },
    "/api/integrations/v1/events/{event_id}/days/{assignment_id}/access": {
      "get": {
        "operationId": "getSailSyncDayAccess",
        "summary": "Resolve existing event-day access without spending report days",
        "description": "Check your access to this event day and obtain its data path. This check does not spend report allowances or FLO credits.",
        "parameters": [
          {
            "name": "event_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991
            }
          },
          {
            "name": "assignment_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Authorized read response",
            "content": {
              "application/json": {
                "examples": {
                  "ilcaWorlds": {
                    "summary": "ILCA 6 Worlds \u00b7 September 12",
                    "description": "Captured from session 3455. Contact details are sanitized; example cursors are placeholders.",
                    "value": {
                      "event_id": 15,
                      "assignment_id": 119,
                      "session_id": 3455,
                      "allowed": true,
                      "state": "already_available",
                      "day": "2026-09-12",
                      "unit": null,
                      "allowance_debited": 0,
                      "flo_credits_debited": 0,
                      "data_path": "/api/integrations/v1/sessions/3455/data"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/DayAccess"
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked personal integration token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "example": {
                  "error": "authentication_required"
                }
              }
            }
          },
          "403": {
            "description": "Current subscription/scope unavailable",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "404": {
            "description": "Resource hidden or not authorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "409": {
            "description": "Data missing/changed; inspect safe reason",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "422": {
            "description": "Invalid filter/selection/snapshot",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "429": {
            "description": "Shared read/data quota; Retry-After",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Seconds before retrying.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "503": {
            "description": "A required limiter, budget service or backend is unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          }
        },
        "tags": [
          "Events"
        ]
      }
    },
    "/api/integrations/v1/sessions/{session_id}/data": {
      "get": {
        "operationId": "getSailSyncSessionData",
        "summary": "Read authorized session/race/track manifest",
        "description": "Discover permitted tracks, race scopes, wind and analysis paths for a session.",
        "parameters": [
          {
            "name": "session_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100
            }
          },
          {
            "name": "after_track_id",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Authorized read response",
            "content": {
              "application/json": {
                "examples": {
                  "ilcaWorlds": {
                    "summary": "ILCA 6 Worlds \u00b7 September 12",
                    "description": "Captured from session 3455. Contact details are sanitized; example cursors are placeholders.",
                    "value": {
                      "session": {
                        "id": 3455,
                        "name": "R1, R2 - 2026 ILCA 6 Worlds - Final Series",
                        "boat_class": "ILCA 6",
                        "first_race_number": 1,
                        "start": 1789215781.0,
                        "end": 1789219800.0
                      },
                      "races": [
                        {
                          "id": "comment_6918",
                          "debrief_scope_id": "comment_6918",
                          "source_comment_id": 6918,
                          "index": 1,
                          "display_number": 1,
                          "label": "Race 1",
                          "heat": null,
                          "time_range": {
                            "start": 1789216381.0,
                            "end": null
                          }
                        },
                        {
                          "id": "comment_6919",
                          "debrief_scope_id": "comment_6919",
                          "source_comment_id": 6919,
                          "index": 2,
                          "display_number": 2,
                          "label": "Race 2",
                          "heat": null,
                          "time_range": {
                            "start": 1789218481.0,
                            "end": null
                          }
                        }
                      ],
                      "tracks": [
                        {
                          "session_track_id": 26071,
                          "type": "pin",
                          "name": "Pin",
                          "time_offset": 0.0,
                          "sailing_window": [
                            1789215792,
                            1789222731
                          ],
                          "gps_path": null
                        },
                        {
                          "session_track_id": 26074,
                          "type": "mark",
                          "name": "R1 (markPort)",
                          "time_offset": 0.0,
                          "sailing_window": [
                            1789215782,
                            1789222771
                          ],
                          "gps_path": null
                        },
                        {
                          "session_track_id": 26075,
                          "type": "mark",
                          "name": "Finish (finishLeft)",
                          "time_offset": 0.0,
                          "sailing_window": [
                            1789219279,
                            1789221541
                          ],
                          "gps_path": null
                        },
                        {
                          "session_track_id": 26077,
                          "type": "start_boat",
                          "name": "Committee Boat",
                          "time_offset": 0.0,
                          "sailing_window": [
                            1789215782,
                            1789222836
                          ],
                          "gps_path": null
                        },
                        {
                          "session_track_id": 26079,
                          "type": "mark",
                          "name": "Finish (finishRight)",
                          "time_offset": 0.0,
                          "sailing_window": [
                            1789217876,
                            1789221529
                          ],
                          "gps_path": null
                        },
                        {
                          "session_track_id": 26082,
                          "type": "boat",
                          "name": "IRL-216116 | McMahon E.",
                          "time_offset": 0.0,
                          "sailing_window": [
                            1789215781,
                            1789222518
                          ],
                          "gps_path": "/api/integrations/v1/sessions/3455/data/tracks/26082/points"
                        },
                        {
                          "session_track_id": 26083,
                          "type": "boat",
                          "name": "GBR-228016 | Nicholls M.",
                          "time_offset": 0.0,
                          "sailing_window": [
                            1789215781,
                            1789220834
                          ],
                          "gps_path": "/api/integrations/v1/sessions/3455/data/tracks/26083/points"
                        },
                        {
                          "session_track_id": 26084,
                          "type": "boat",
                          "name": "POL-217327 | Barwinska A.",
                          "time_offset": 0.0,
                          "sailing_window": [
                            1789215781,
                            1789221499
                          ],
                          "gps_path": "/api/integrations/v1/sessions/3455/data/tracks/26084/points"
                        },
                        {
                          "session_track_id": 26085,
                          "type": "boat",
                          "name": "DEN-220066 | Munch A.",
                          "time_offset": 0.0,
                          "sailing_window": [
                            1789215781,
                            1789221259
                          ],
                          "gps_path": "/api/integrations/v1/sessions/3455/data/tracks/26085/points"
                        },
                        {
                          "session_track_id": 26086,
                          "type": "boat",
                          "name": "NED-211391 | Jonker M.",
                          "time_offset": 0.0,
                          "sailing_window": [
                            1789215781,
                            1789223351
                          ],
                          "gps_path": "/api/integrations/v1/sessions/3455/data/tracks/26086/points"
                        },
                        {
                          "session_track_id": 26087,
                          "type": "boat",
                          "name": "GBR-226020 | Snellgrove H.",
                          "time_offset": 0.0,
                          "sailing_window": [
                            1789215781,
                            1789222129
                          ],
                          "gps_path": "/api/integrations/v1/sessions/3455/data/tracks/26087/points"
                        },
                        {
                          "session_track_id": 26088,
                          "type": "boat",
                          "name": "BEL-211552 | Plasschaert E.",
                          "time_offset": 0.0,
                          "sailing_window": [
                            1789215782,
                            1789222385
                          ],
                          "gps_path": "/api/integrations/v1/sessions/3455/data/tracks/26088/points"
                        },
                        {
                          "session_track_id": 26089,
                          "type": "boat",
                          "name": "HUN-211551 | Erdi M.",
                          "time_offset": 0.0,
                          "sailing_window": [
                            1789215782,
                            1789221348
                          ],
                          "gps_path": "/api/integrations/v1/sessions/3455/data/tracks/26089/points"
                        },
                        {
                          "session_track_id": 26090,
                          "type": "boat",
                          "name": "FRA-212121 | Cervera L.",
                          "time_offset": 0.0,
                          "sailing_window": [
                            1789215782,
                            1789220922
                          ],
                          "gps_path": "/api/integrations/v1/sessions/3455/data/tracks/26090/points"
                        },
                        {
                          "session_track_id": 26091,
                          "type": "boat",
                          "name": "USA-222035 | Rose C.",
                          "time_offset": 0.0,
                          "sailing_window": [
                            1789215783,
                            1789222333
                          ],
                          "gps_path": "/api/integrations/v1/sessions/3455/data/tracks/26091/points"
                        },
                        {
                          "session_track_id": 26729,
                          "type": "mark",
                          "name": "Gate 3B",
                          "time_offset": 0.0,
                          "sailing_window": [
                            1789216371,
                            1789219291
                          ],
                          "gps_path": null
                        },
                        {
                          "session_track_id": 26731,
                          "type": "mark",
                          "name": "Gate 3A",
                          "time_offset": 0.0,
                          "sailing_window": [
                            1789216371,
                            1789218471
                          ],
                          "gps_path": null
                        }
                      ],
                      "next_after_track_id": null,
                      "analysis_path": "/api/integrations/v1/sessions/3455/data/analysis",
                      "wind_path": "/api/integrations/v1/sessions/3455/data/wind",
                      "permissions": {
                        "read": true,
                        "write": false
                      }
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/SessionManifest"
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked personal integration token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "example": {
                  "error": "authentication_required"
                }
              }
            }
          },
          "403": {
            "description": "Current subscription/scope unavailable",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "404": {
            "description": "Resource hidden or not authorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "error": "not_found"
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Data missing/changed; inspect safe reason",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "422": {
            "description": "Invalid filter/selection/snapshot",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "429": {
            "description": "Shared read/data quota; Retry-After",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Seconds before retrying.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "503": {
            "description": "A required limiter, budget service or backend is unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          }
        },
        "tags": [
          "Sessions & data"
        ]
      }
    },
    "/api/integrations/v1/sessions/{session_id}/data/tracks/{track_id}/points": {
      "get": {
        "operationId": "getSailSyncGpsPoints",
        "summary": "Read authorized committed full-resolution GPS positions",
        "description": "Read committed GPS positions for a permitted boat track. Follow next_cursor until null; retain downloaded pages.",
        "parameters": [
          {
            "name": "session_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991
            }
          },
          {
            "name": "track_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 5000
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "schema": {
              "type": "string",
              "maxLength": 2048
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Authorized read response",
            "content": {
              "application/json": {
                "examples": {
                  "ilcaWorlds": {
                    "summary": "ILCA 6 Worlds \u00b7 September 12",
                    "description": "Captured from session 3455. Contact details are sanitized; example cursors are placeholders.",
                    "value": {
                      "available": true,
                      "session_id": 3455,
                      "session_track_id": 26082,
                      "resolution": "committed_full_resolution_gps",
                      "source_ref": "0ef4be0ce0b1b9e0bcb8b72653f85d2728727287dfc7da5dd7878b18bad38154",
                      "time_basis": "session_epoch_seconds_with_track_offset",
                      "time_offset": 0.0,
                      "window": {
                        "start": 1789215781.0,
                        "end": 1789219800.0
                      },
                      "point_count": 3303,
                      "points": [
                        {
                          "time_epoch": 1789215781.1,
                          "lat": 53.3144298,
                          "lng": -6.1299651
                        },
                        {
                          "time_epoch": 1789215783.3,
                          "lat": 53.3144469,
                          "lng": -6.1299779999999995
                        },
                        {
                          "time_epoch": 1789215786.5,
                          "lat": 53.3144924,
                          "lng": -6.1300146
                        }
                      ],
                      "next_cursor": "EXAMPLE_CURSOR_REPLACE_WITH_CURRENT_RESPONSE"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/GpsPage"
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked personal integration token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "example": {
                  "error": "authentication_required"
                }
              }
            }
          },
          "403": {
            "description": "Current subscription/scope unavailable",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "404": {
            "description": "Resource hidden or not authorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "error": "not_found"
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Data missing/changed; inspect safe reason",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/UnavailableGps"
                    },
                    {
                      "$ref": "#/components/schemas/IntegrationError"
                    }
                  ]
                }
              }
            }
          },
          "422": {
            "description": "Invalid filter/selection/snapshot",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "429": {
            "description": "Shared read/data quota; Retry-After",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "error": "rate_limited",
                      "budget": "repeat_hour",
                      "limit": 1,
                      "remaining": 0,
                      "reset_at": 1793150290,
                      "retry_after": 3600
                    }
                  }
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Seconds before retrying.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "503": {
            "description": "A required limiter, budget service or backend is unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          }
        },
        "tags": [
          "Sessions & data"
        ]
      }
    },
    "/api/integrations/v1/sessions/{session_id}/data/wind": {
      "get": {
        "operationId": "getSailSyncWind",
        "summary": "Read configured wind step series in bounded pages",
        "description": "Read the configured wind step series. Use snapshot_ref as expected_snapshot on continuation.",
        "parameters": [
          {
            "name": "session_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991
            }
          },
          {
            "name": "series",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "direction",
                "speed"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000
            }
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            }
          },
          {
            "name": "expected_snapshot",
            "in": "query",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Authorized read response",
            "content": {
              "application/json": {
                "examples": {
                  "ilcaWorlds": {
                    "summary": "ILCA 6 Worlds \u00b7 September 12",
                    "description": "Captured from session 3455. Contact details are sanitized; example cursors are placeholders.",
                    "value": {
                      "series": "direction",
                      "unit": "degrees",
                      "representation": "configured_session_step_series",
                      "snapshot_ref": "699e214a2028281ba73957ef2d3ddf8e91035bf88d6f01110f7b466456094817",
                      "total_count": 3,
                      "default_direction_deg": 263.0,
                      "default_speed_kt": null,
                      "points": [
                        {
                          "t": 1789216081,
                          "direction": 263
                        },
                        {
                          "t": 1789218181,
                          "direction": 262
                        },
                        {
                          "t": 1789218984.7654676,
                          "direction": 256
                        }
                      ],
                      "next_offset": null
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/WindPage"
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked personal integration token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "example": {
                  "error": "authentication_required"
                }
              }
            }
          },
          "403": {
            "description": "Current subscription/scope unavailable",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "404": {
            "description": "Resource hidden or not authorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "409": {
            "description": "Data missing/changed; inspect safe reason",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "error": "stale_snapshot",
                      "reason": null
                    }
                  }
                }
              }
            }
          },
          "422": {
            "description": "Invalid filter/selection/snapshot",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "429": {
            "description": "Shared read/data quota; Retry-After",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Seconds before retrying.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "503": {
            "description": "A required limiter, budget service or backend is unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          }
        },
        "tags": [
          "Sessions & data"
        ]
      }
    },
    "/api/integrations/v1/sessions/{session_id}/data/analysis": {
      "get": {
        "operationId": "getSailSyncAnalysis",
        "summary": "Read saved race catalog and available metrics scope IDs",
        "description": "Discover race scopes, participating boats and snapshots. Missing or outdated analysis is reported explicitly; this does not start recalculation.",
        "parameters": [
          {
            "name": "session_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Authorized read response",
            "content": {
              "application/json": {
                "examples": {
                  "ilcaWorlds": {
                    "summary": "ILCA 6 Worlds \u00b7 September 12",
                    "description": "Captured from session 3455. Contact details are sanitized; example cursors are placeholders.",
                    "value": {
                      "schema_version": "race_debrief_facts_v1",
                      "session_id": "3455",
                      "status": "ready",
                      "reason": null,
                      "refresh_required": false,
                      "freshness": "no_newer_recorded_inputs",
                      "access": {
                        "allowed": true,
                        "required_plans": [
                          "racer",
                          "gold"
                        ],
                        "trial_activation_supported": false
                      },
                      "boats": [
                        {
                          "boat_id": "26082",
                          "name": "IRL-216116 | McMahon E."
                        },
                        {
                          "boat_id": "26083",
                          "name": "GBR-228016 | Nicholls M."
                        },
                        {
                          "boat_id": "26084",
                          "name": "POL-217327 | Barwinska A."
                        },
                        {
                          "boat_id": "26085",
                          "name": "DEN-220066 | Munch A."
                        },
                        {
                          "boat_id": "26086",
                          "name": "NED-211391 | Jonker M."
                        },
                        {
                          "boat_id": "26087",
                          "name": "GBR-226020 | Snellgrove H."
                        },
                        {
                          "boat_id": "26088",
                          "name": "BEL-211552 | Plasschaert E."
                        },
                        {
                          "boat_id": "26089",
                          "name": "HUN-211551 | Erdi M."
                        },
                        {
                          "boat_id": "26090",
                          "name": "FRA-212121 | Cervera L."
                        },
                        {
                          "boat_id": "26091",
                          "name": "USA-222035 | Rose C."
                        }
                      ],
                      "races": [
                        {
                          "id": "comment_6918",
                          "source_comment_id": 6918,
                          "kind": "race",
                          "label": "Race 1",
                          "index": 1,
                          "display_number": 1,
                          "boat_ids": [
                            "26082",
                            "26083",
                            "26084",
                            "26085",
                            "26086",
                            "26087",
                            "26088",
                            "26089",
                            "26090",
                            "26091"
                          ],
                          "available": true,
                          "reason": null,
                          "legs": [
                            {
                              "leg_index": 1
                            },
                            {
                              "leg_index": 2
                            },
                            {
                              "leg_index": 3
                            },
                            {
                              "leg_index": 4
                            },
                            {
                              "leg_index": 5
                            }
                          ],
                          "snapshot": {
                            "ref": "dbf5c1f09a60d24f03f3a78c35c3c40012f5ccb202a22f7be8bf50f616ae1636",
                            "schema_version": "race_debrief_facts_v1",
                            "artifact_run_id": "20261023T223430Z-327193c0",
                            "computed_at": "2026-10-23T22:34:30.105Z",
                            "revision_completeness": "partial",
                            "missing_revision_components": [
                              "artifact_source_revision_binding"
                            ],
                            "freshness": "no_newer_recorded_inputs",
                            "refresh_required": false,
                            "raw_gps_coverage_verified": false
                          }
                        },
                        {
                          "id": "comment_6919",
                          "source_comment_id": 6919,
                          "kind": "race",
                          "label": "Race 2",
                          "index": 2,
                          "display_number": 2,
                          "boat_ids": [
                            "26082",
                            "26083",
                            "26084",
                            "26085",
                            "26086",
                            "26087",
                            "26088",
                            "26089",
                            "26090",
                            "26091"
                          ],
                          "available": true,
                          "reason": null,
                          "legs": [
                            {
                              "leg_index": 1
                            },
                            {
                              "leg_index": 2
                            },
                            {
                              "leg_index": 3
                            },
                            {
                              "leg_index": 4
                            },
                            {
                              "leg_index": 5
                            }
                          ],
                          "snapshot": {
                            "ref": "34a70ee95b9c64f6b7d04f09277e1b58f9773188d810f691f303c1fde5c6c1be",
                            "schema_version": "race_debrief_facts_v1",
                            "artifact_run_id": "20261023T223430Z-327193c0",
                            "computed_at": "2026-10-23T22:34:30.105Z",
                            "revision_completeness": "partial",
                            "missing_revision_components": [
                              "artifact_source_revision_binding"
                            ],
                            "freshness": "no_newer_recorded_inputs",
                            "refresh_required": false,
                            "raw_gps_coverage_verified": false
                          }
                        }
                      ],
                      "comparison_policies": [
                        "named_rival",
                        "leading_finishers"
                      ]
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/AnalysisCatalog"
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked personal integration token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "example": {
                  "error": "authentication_required"
                }
              }
            }
          },
          "403": {
            "description": "Current subscription/scope unavailable",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "404": {
            "description": "Resource hidden or not authorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "409": {
            "description": "Data missing/changed; inspect safe reason",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "error": "not_ready",
                      "reason": "saved_analysis_unavailable"
                    }
                  }
                }
              }
            }
          },
          "422": {
            "description": "Invalid filter/selection/snapshot",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "429": {
            "description": "Shared read/data quota; Retry-After",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Seconds before retrying.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "503": {
            "description": "A required limiter, budget service or backend is unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          }
        },
        "tags": [
          "Sessions & data"
        ]
      }
    },
    "/api/integrations/v1/sessions/{session_id}/data/races/{scope_id}/results": {
      "get": {
        "operationId": "getSailSyncRaceResults",
        "summary": "Read saved race results and optional per-leg speed/VMG metrics",
        "description": "Read results for one race, optionally including leg metrics. Positions remain fleet-relative across pages. Pass the returned snapshot ref when continuing.",
        "parameters": [
          {
            "name": "session_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991
            }
          },
          {
            "name": "scope_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 100
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100
            }
          },
          {
            "name": "before_boat_id",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991
            }
          },
          {
            "name": "expected_snapshot",
            "in": "query",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          },
          {
            "name": "leg_index",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Authorized read response",
            "content": {
              "application/json": {
                "examples": {
                  "ilcaWorlds": {
                    "summary": "ILCA 6 Worlds \u00b7 September 12",
                    "description": "Captured from session 3455. Contact details are sanitized; example cursors are placeholders.",
                    "value": {
                      "schema_version": "subscriber_saved_analysis_v1",
                      "session_id": 3455,
                      "scope_id": "comment_6918",
                      "snapshot": {
                        "ref": "dbf5c1f09a60d24f03f3a78c35c3c40012f5ccb202a22f7be8bf50f616ae1636",
                        "schema_version": "race_debrief_facts_v1",
                        "artifact_run_id": "20261023T223430Z-327193c0",
                        "computed_at": "2026-10-23T22:34:30.105Z",
                        "revision_completeness": "partial",
                        "missing_revision_components": [
                          "artifact_source_revision_binding"
                        ],
                        "freshness": "no_newer_recorded_inputs",
                        "refresh_required": false,
                        "raw_gps_coverage_verified": false
                      },
                      "fleet_count": 10,
                      "next_before_boat_id": 26089,
                      "paging_order": "boat_id_descending",
                      "scope": "within_this_race_only",
                      "model_called": false,
                      "results": [
                        {
                          "boat_id": "26091",
                          "boat_name": "USA-222035 | Rose C.",
                          "boat_color": "#42D4F4",
                          "status": "finished",
                          "finish_time": 1789217476.8393393,
                          "elapsed_seconds": 1095.8393392562866,
                          "legs_completed": 5,
                          "legs_expected": 5,
                          "result_source": "completion.elapsed_seconds",
                          "overall_order": 2,
                          "position": 2,
                          "finish_time_local": {
                            "epoch": 1789217476.8393393,
                            "utc": "2026-09-12T12:51:16.839Z",
                            "local": "2026-09-12T05:51:16-07:00",
                            "label": "2026-09-12 05:51:16 PDT",
                            "time_zone": "America/Los_Angeles"
                          },
                          "last_recorded_leg_end_local": {
                            "epoch": 1789217477.0,
                            "utc": "2026-09-12T12:51:17.000Z",
                            "local": "2026-09-12T05:51:17-07:00",
                            "label": "2026-09-12 05:51:17 PDT",
                            "time_zone": "America/Los_Angeles"
                          }
                        },
                        {
                          "boat_id": "26089",
                          "boat_name": "HUN-211551 | Erdi M.",
                          "boat_color": "#E6194B",
                          "status": "finished",
                          "finish_time": 1789217485.7685676,
                          "elapsed_seconds": 1104.7685675621033,
                          "legs_completed": 5,
                          "legs_expected": 5,
                          "result_source": "completion.elapsed_seconds",
                          "overall_order": 3,
                          "position": 3,
                          "finish_time_local": {
                            "epoch": 1789217485.7685676,
                            "utc": "2026-09-12T12:51:25.768Z",
                            "local": "2026-09-12T05:51:25-07:00",
                            "label": "2026-09-12 05:51:25 PDT",
                            "time_zone": "America/Los_Angeles"
                          },
                          "last_recorded_leg_end_local": {
                            "epoch": 1789217486.0,
                            "utc": "2026-09-12T12:51:26.000Z",
                            "local": "2026-09-12T05:51:26-07:00",
                            "label": "2026-09-12 05:51:26 PDT",
                            "time_zone": "America/Los_Angeles"
                          }
                        },
                        {
                          "boat_id": "26090",
                          "boat_name": "FRA-212121 | Cervera L.",
                          "boat_color": "#BFEF45",
                          "status": "finished",
                          "finish_time": 1789217524.8534248,
                          "elapsed_seconds": 1143.8534247875214,
                          "legs_completed": 5,
                          "legs_expected": 5,
                          "result_source": "completion.elapsed_seconds",
                          "overall_order": 9,
                          "position": 9,
                          "finish_time_local": {
                            "epoch": 1789217524.8534248,
                            "utc": "2026-09-12T12:52:04.853Z",
                            "local": "2026-09-12T05:52:04-07:00",
                            "label": "2026-09-12 05:52:04 PDT",
                            "time_zone": "America/Los_Angeles"
                          },
                          "last_recorded_leg_end_local": {
                            "epoch": 1789217525.0,
                            "utc": "2026-09-12T12:52:05.000Z",
                            "local": "2026-09-12T05:52:05-07:00",
                            "label": "2026-09-12 05:52:05 PDT",
                            "time_zone": "America/Los_Angeles"
                          }
                        }
                      ],
                      "summary": {
                        "boat_count": 10,
                        "finish_count": 10,
                        "partial_count": 0,
                        "not_started_count": 0,
                        "excluded_count": 0,
                        "other_count": 0
                      }
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/RaceResultsPage"
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked personal integration token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "example": {
                  "error": "authentication_required"
                }
              }
            }
          },
          "403": {
            "description": "Current subscription/scope unavailable",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "404": {
            "description": "Resource hidden or not authorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "409": {
            "description": "Data missing/changed; inspect safe reason",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "error": "stale_snapshot",
                      "reason": null
                    }
                  }
                }
              }
            }
          },
          "422": {
            "description": "Invalid filter/selection/snapshot",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "error": "snapshot_required",
                      "reason": null
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Shared read/data quota; Retry-After",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Seconds before retrying.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "503": {
            "description": "A required limiter, budget service or backend is unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          }
        },
        "tags": [
          "Sessions & data"
        ]
      }
    },
    "/api/integrations/v1/sessions/{session_id}/data/races/{scope_id}/starts": {
      "get": {
        "operationId": "getSailSyncStartStats",
        "summary": "Read saved canonical start statistics for a race",
        "description": "Read saved start statistics for one race. Missing metrics are omitted; pass the snapshot ref when continuing.",
        "parameters": [
          {
            "name": "session_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991
            }
          },
          {
            "name": "scope_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 100
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100
            }
          },
          {
            "name": "before_boat_id",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991
            }
          },
          {
            "name": "expected_snapshot",
            "in": "query",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Authorized read response",
            "content": {
              "application/json": {
                "examples": {
                  "ilcaWorlds": {
                    "summary": "ILCA 6 Worlds \u00b7 September 12",
                    "description": "Captured from session 3455. Contact details are sanitized; example cursors are placeholders.",
                    "value": {
                      "schema_version": "subscriber_saved_analysis_v1",
                      "session_id": 3455,
                      "scope_id": "comment_6918",
                      "snapshot": {
                        "ref": "dbf5c1f09a60d24f03f3a78c35c3c40012f5ccb202a22f7be8bf50f616ae1636",
                        "schema_version": "race_debrief_facts_v1",
                        "artifact_run_id": "20261023T223430Z-327193c0",
                        "computed_at": "2026-10-23T22:34:30.105Z",
                        "revision_completeness": "partial",
                        "missing_revision_components": [
                          "artifact_source_revision_binding"
                        ],
                        "freshness": "no_newer_recorded_inputs",
                        "refresh_required": false,
                        "raw_gps_coverage_verified": false
                      },
                      "fleet_count": 10,
                      "next_before_boat_id": 26089,
                      "paging_order": "boat_id_descending",
                      "scope": "within_this_race_only",
                      "model_called": false,
                      "start_stats": [
                        {
                          "boat_id": "26091",
                          "boat_name": "USA-222035 | Rose C.",
                          "boat_color": "#42D4F4",
                          "start_time": 1789216381,
                          "start_time_local": {
                            "epoch": 1789216381.0,
                            "utc": "2026-09-12T12:33:01.000Z",
                            "local": "2026-09-12T05:33:01-07:00",
                            "label": "2026-09-12 05:33:01 PDT",
                            "time_zone": "America/Los_Angeles"
                          },
                          "cross_time": 1789216384.5,
                          "cross_time_local": {
                            "epoch": 1789216384.5,
                            "utc": "2026-09-12T12:33:04.500Z",
                            "local": "2026-09-12T05:33:04-07:00",
                            "label": "2026-09-12 05:33:04 PDT",
                            "time_zone": "America/Los_Angeles"
                          },
                          "finish_position": 2,
                          "finish_status": "finished",
                          "elapsed_seconds": 1095.839,
                          "excluded_from_stats": false,
                          "line_position_pct": 22.204,
                          "line_projection_pct_unclamped": 22.204,
                          "line_end_bucket": "pin",
                          "line_position_bias_vs_midline_m": 5.9,
                          "signed_distance_to_line_at_go_m": 3.9,
                          "distance_to_line_at_go_m": 3.9,
                          "time_late_to_cross_s": 3.5,
                          "sog_at_go_kt": 5.6,
                          "sog_15s_after_go_kt": 5.2,
                          "tack_at_go": "starboard",
                          "ocs": {
                            "status": "clear",
                            "verdict": "clear",
                            "over_at_go": false,
                            "evidence_kind": null,
                            "evidence_version": "raw_start_evidence_v1",
                            "evidence_gate_enabled": true,
                            "suppressed": false,
                            "gap_window": null,
                            "raw_coverage": {
                              "atGo": true,
                              "atCrossing": true,
                              "bracketWindowSeconds": 10
                            },
                            "cleared_time": null,
                            "first_legal_cross_time": 1789216384.5
                          },
                          "calculation_basis": {
                            "start_evidence_version": "raw_start_evidence_v1",
                            "line_position_basis": "projection_on_start_line",
                            "distance_basis": "signed_distance_to_start_line_segment",
                            "speed_window_seconds": 1,
                            "wind_source": "effective_wind_function",
                            "start_line_source": "race.start_line"
                          },
                          "start_type": "windward",
                          "start_type_source": "leg1_maneuvers+geometry",
                          "windward_progress_m": {
                            "5s": 18.8,
                            "10s": 27,
                            "15s": 35.8,
                            "30s": 66.4,
                            "60s": 123.5
                          },
                          "mark_one_distance_at_go_m": 736.3,
                          "mark_one_progress_m": {
                            "5s": 6.2,
                            "10s": 12.4,
                            "15s": 19.2,
                            "30s": 43.3,
                            "60s": 81.9
                          },
                          "metrics": {
                            "line_position_pct": 22.204,
                            "line_projection_pct_unclamped": 22.204,
                            "line_position_bias_vs_midline_m": 5.9,
                            "signed_distance_to_line_at_go_m": 3.9,
                            "distance_to_line_at_go_m": 3.9,
                            "time_late_to_cross_s": 3.5,
                            "sog_at_go_kt": 5.6,
                            "sog_15s_after_go_kt": 5.2,
                            "elapsed_seconds": 1095.839,
                            "mark_one_distance_at_go_m": 736.3
                          },
                          "units": {
                            "line_position_pct": "%",
                            "line_projection_pct_unclamped": "%",
                            "line_position_bias_vs_midline_m": "m",
                            "signed_distance_to_line_at_go_m": "m",
                            "distance_to_line_at_go_m": "m",
                            "time_late_to_cross_s": "s",
                            "sog_at_go_kt": "kt",
                            "sog_15s_after_go_kt": "kt",
                            "elapsed_seconds": "s",
                            "mark_one_distance_at_go_m": "m",
                            "mark_one_progress_m": "m",
                            "reach_favored_end_advantage_m": "m",
                            "reach_line_position_bias_m": "m"
                          },
                          "warnings": []
                        },
                        {
                          "boat_id": "26089",
                          "boat_name": "HUN-211551 | Erdi M.",
                          "boat_color": "#E6194B",
                          "start_time": 1789216381,
                          "start_time_local": {
                            "epoch": 1789216381.0,
                            "utc": "2026-09-12T12:33:01.000Z",
                            "local": "2026-09-12T05:33:01-07:00",
                            "label": "2026-09-12 05:33:01 PDT",
                            "time_zone": "America/Los_Angeles"
                          },
                          "cross_time": 1789216383.5,
                          "cross_time_local": {
                            "epoch": 1789216383.5,
                            "utc": "2026-09-12T12:33:03.500Z",
                            "local": "2026-09-12T05:33:03-07:00",
                            "label": "2026-09-12 05:33:03 PDT",
                            "time_zone": "America/Los_Angeles"
                          },
                          "finish_position": 3,
                          "finish_status": "finished",
                          "elapsed_seconds": 1104.769,
                          "excluded_from_stats": false,
                          "line_position_pct": 30.187,
                          "line_projection_pct_unclamped": 30.187,
                          "line_end_bucket": "middle",
                          "line_position_bias_vs_midline_m": 4.2,
                          "signed_distance_to_line_at_go_m": 3.2,
                          "distance_to_line_at_go_m": 3.2,
                          "time_late_to_cross_s": 2.5,
                          "sog_at_go_kt": 5.2,
                          "sog_15s_after_go_kt": 4.9,
                          "tack_at_go": "starboard",
                          "ocs": {
                            "status": "clear",
                            "verdict": "clear",
                            "over_at_go": false,
                            "evidence_kind": null,
                            "evidence_version": "raw_start_evidence_v1",
                            "evidence_gate_enabled": true,
                            "suppressed": false,
                            "gap_window": null,
                            "raw_coverage": {
                              "atGo": true,
                              "atCrossing": true,
                              "bracketWindowSeconds": 10
                            },
                            "cleared_time": null,
                            "first_legal_cross_time": 1789216383.5
                          },
                          "calculation_basis": {
                            "start_evidence_version": "raw_start_evidence_v1",
                            "line_position_basis": "projection_on_start_line",
                            "distance_basis": "signed_distance_to_start_line_segment",
                            "speed_window_seconds": 1,
                            "wind_source": "effective_wind_function",
                            "start_line_source": "race.start_line"
                          },
                          "start_type": "windward",
                          "start_type_source": "leg1_maneuvers+geometry",
                          "windward_progress_m": {
                            "5s": 18.4,
                            "10s": 25.7,
                            "15s": 34.5,
                            "30s": 64,
                            "60s": 120.4
                          },
                          "mark_one_distance_at_go_m": 736,
                          "mark_one_progress_m": {
                            "5s": 6.4,
                            "10s": 12.1,
                            "15s": 19.1,
                            "30s": 42.9,
                            "60s": 83.5
                          },
                          "metrics": {
                            "line_position_pct": 30.187,
                            "line_projection_pct_unclamped": 30.187,
                            "line_position_bias_vs_midline_m": 4.2,
                            "signed_distance_to_line_at_go_m": 3.2,
                            "distance_to_line_at_go_m": 3.2,
                            "time_late_to_cross_s": 2.5,
                            "sog_at_go_kt": 5.2,
                            "sog_15s_after_go_kt": 4.9,
                            "elapsed_seconds": 1104.769,
                            "mark_one_distance_at_go_m": 736
                          },
                          "units": {
                            "line_position_pct": "%",
                            "line_projection_pct_unclamped": "%",
                            "line_position_bias_vs_midline_m": "m",
                            "signed_distance_to_line_at_go_m": "m",
                            "distance_to_line_at_go_m": "m",
                            "time_late_to_cross_s": "s",
                            "sog_at_go_kt": "kt",
                            "sog_15s_after_go_kt": "kt",
                            "elapsed_seconds": "s",
                            "mark_one_distance_at_go_m": "m",
                            "mark_one_progress_m": "m",
                            "reach_favored_end_advantage_m": "m",
                            "reach_line_position_bias_m": "m"
                          },
                          "warnings": []
                        },
                        {
                          "boat_id": "26090",
                          "boat_name": "FRA-212121 | Cervera L.",
                          "boat_color": "#BFEF45",
                          "start_time": 1789216381,
                          "start_time_local": {
                            "epoch": 1789216381.0,
                            "utc": "2026-09-12T12:33:01.000Z",
                            "local": "2026-09-12T05:33:01-07:00",
                            "label": "2026-09-12 05:33:01 PDT",
                            "time_zone": "America/Los_Angeles"
                          },
                          "cross_time": 1789216385,
                          "cross_time_local": {
                            "epoch": 1789216385.0,
                            "utc": "2026-09-12T12:33:05.000Z",
                            "local": "2026-09-12T05:33:05-07:00",
                            "label": "2026-09-12 05:33:05 PDT",
                            "time_zone": "America/Los_Angeles"
                          },
                          "finish_position": 9,
                          "finish_status": "finished",
                          "elapsed_seconds": 1143.853,
                          "excluded_from_stats": false,
                          "line_position_pct": 62.042,
                          "line_projection_pct_unclamped": 62.042,
                          "line_end_bucket": "middle",
                          "line_position_bias_vs_midline_m": -2.6,
                          "signed_distance_to_line_at_go_m": 5.4,
                          "distance_to_line_at_go_m": 5.4,
                          "time_late_to_cross_s": 4,
                          "sog_at_go_kt": 4.7,
                          "sog_15s_after_go_kt": 3.9,
                          "tack_at_go": "starboard",
                          "ocs": {
                            "status": "clear",
                            "verdict": "clear",
                            "over_at_go": false,
                            "evidence_kind": null,
                            "evidence_version": "raw_start_evidence_v1",
                            "evidence_gate_enabled": true,
                            "suppressed": false,
                            "gap_window": null,
                            "raw_coverage": {
                              "atGo": true,
                              "atCrossing": true,
                              "bracketWindowSeconds": 10
                            },
                            "cleared_time": null,
                            "first_legal_cross_time": 1789216385
                          },
                          "calculation_basis": {
                            "start_evidence_version": "raw_start_evidence_v1",
                            "line_position_basis": "projection_on_start_line",
                            "distance_basis": "signed_distance_to_start_line_segment",
                            "speed_window_seconds": 1,
                            "wind_source": "effective_wind_function",
                            "start_line_source": "race.start_line"
                          },
                          "start_type": "windward",
                          "start_type_source": "leg1_maneuvers+geometry",
                          "windward_progress_m": {
                            "5s": 9.9,
                            "10s": 18.6,
                            "15s": 25.1,
                            "30s": 51.5,
                            "60s": 105.5
                          },
                          "mark_one_distance_at_go_m": 741.6,
                          "mark_one_progress_m": {
                            "5s": 8,
                            "10s": 15.9,
                            "15s": 22.9,
                            "30s": 51.5,
                            "60s": 107.7
                          },
                          "metrics": {
                            "line_position_pct": 62.042,
                            "line_projection_pct_unclamped": 62.042,
                            "line_position_bias_vs_midline_m": -2.6,
                            "signed_distance_to_line_at_go_m": 5.4,
                            "distance_to_line_at_go_m": 5.4,
                            "time_late_to_cross_s": 4,
                            "sog_at_go_kt": 4.7,
                            "sog_15s_after_go_kt": 3.9,
                            "elapsed_seconds": 1143.853,
                            "mark_one_distance_at_go_m": 741.6
                          },
                          "units": {
                            "line_position_pct": "%",
                            "line_projection_pct_unclamped": "%",
                            "line_position_bias_vs_midline_m": "m",
                            "signed_distance_to_line_at_go_m": "m",
                            "distance_to_line_at_go_m": "m",
                            "time_late_to_cross_s": "s",
                            "sog_at_go_kt": "kt",
                            "sog_15s_after_go_kt": "kt",
                            "elapsed_seconds": "s",
                            "mark_one_distance_at_go_m": "m",
                            "mark_one_progress_m": "m",
                            "reach_favored_end_advantage_m": "m",
                            "reach_line_position_bias_m": "m"
                          },
                          "warnings": []
                        }
                      ],
                      "start_line": {
                        "available": true,
                        "unavailable_reason": null,
                        "at_time": 1789216381,
                        "pin": {
                          "track_id": 26071,
                          "lat": 53.3127238,
                          "lng": -6.1324707,
                          "position_time": 1789216380.9,
                          "position_source": "mark_time_series_last_at_or_before",
                          "age_s": 0.1
                        },
                        "committee": {
                          "track_id": 26077,
                          "lat": 53.3136055,
                          "lng": -6.1323301,
                          "position_time": 1789216380.6,
                          "position_source": "mark_time_series_last_at_or_before",
                          "age_s": 0.4
                        },
                        "center": {
                          "lat": 53.3131647,
                          "lng": -6.1324004
                        },
                        "length_m": 98.5,
                        "bearing_pin_to_committee_deg": 5.4,
                        "wind_direction_deg": 263,
                        "wind_source": "effective_wind_function",
                        "favored_end": "pin",
                        "favored_end_bias_m": 21.2,
                        "warnings": [],
                        "favEnd": "Pin",
                        "bias": 21.21881817342593,
                        "start_type": "windward",
                        "start_type_source": "leg1_maneuvers+geometry"
                      },
                      "summary": {
                        "boat_count": 3,
                        "start_type": "windward",
                        "pin_count": 1,
                        "middle_count": 2,
                        "committee_count": 0,
                        "unknown_count": 0,
                        "ocs_count": 0,
                        "unknown_start_verdict_count": 0,
                        "excluded_count": 0
                      },
                      "units": {
                        "line_position_pct": "%",
                        "line_projection_pct_unclamped": "%",
                        "line_position_bias_vs_midline_m": "m",
                        "signed_distance_to_line_at_go_m": "m",
                        "distance_to_line_at_go_m": "m",
                        "time_late_to_cross_s": "s",
                        "sog_at_go_kt": "kt",
                        "sog_15s_after_go_kt": "kt",
                        "elapsed_seconds": "s",
                        "mark_one_distance_at_go_m": "m",
                        "mark_one_progress_m": "m",
                        "reach_favored_end_advantage_m": "m",
                        "reach_line_position_bias_m": "m"
                      }
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/StartStatisticsPage"
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked personal integration token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "example": {
                  "error": "authentication_required"
                }
              }
            }
          },
          "403": {
            "description": "Current subscription/scope unavailable",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "404": {
            "description": "Resource hidden or not authorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "409": {
            "description": "Data missing/changed; inspect safe reason",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "422": {
            "description": "Invalid filter/selection/snapshot",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "429": {
            "description": "Shared read/data quota; Retry-After",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Seconds before retrying.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "503": {
            "description": "A required limiter, budget service or backend is unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          }
        },
        "tags": [
          "Sessions & data"
        ]
      }
    },
    "/api/integrations/v1/sessions/{session_id}/data/races/{scope_id}/facts": {
      "get": {
        "operationId": "getSailSyncRaceFacts",
        "summary": "Read saved per-leg speed, VMG, distance, timing and maneuver comparison",
        "description": "Compare a subject boat with a named rival or leading finishers using saved race/leg facts. No FLO credits are spent.",
        "parameters": [
          {
            "name": "session_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991
            }
          },
          {
            "name": "scope_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 100
            }
          },
          {
            "name": "subject_id",
            "in": "query",
            "schema": {
              "type": "string",
              "maxLength": 30
            },
            "required": true
          },
          {
            "name": "rival_id",
            "in": "query",
            "schema": {
              "type": "string",
              "maxLength": 30
            }
          },
          {
            "name": "comparison_policy",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "leading_finishers",
                "named_rival"
              ]
            }
          },
          {
            "name": "leg_index",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100
            }
          },
          {
            "name": "expected_snapshot",
            "in": "query",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Authorized read response",
            "content": {
              "application/json": {
                "examples": {
                  "ilcaWorlds": {
                    "summary": "ILCA 6 Worlds \u00b7 September 12",
                    "description": "Captured from session 3455. Contact details are sanitized; example cursors are placeholders.",
                    "value": {
                      "schema_version": "race_debrief_facts_v1",
                      "session_id": "3455",
                      "status": "ready",
                      "snapshot": {
                        "ref": "dbf5c1f09a60d24f03f3a78c35c3c40012f5ccb202a22f7be8bf50f616ae1636",
                        "schema_version": "race_debrief_facts_v1",
                        "artifact_run_id": "20261023T223430Z-327193c0",
                        "computed_at": "2026-10-23T22:34:30.105Z",
                        "revision_completeness": "partial",
                        "missing_revision_components": [
                          "artifact_source_revision_binding"
                        ],
                        "freshness": "no_newer_recorded_inputs",
                        "refresh_required": false,
                        "raw_gps_coverage_verified": false
                      },
                      "scope": {
                        "kind": "race",
                        "id": "comment_6918",
                        "label": "Race 1",
                        "leg_index": 1
                      },
                      "comparison": {
                        "policy": "named_rival",
                        "subject_id": "26082",
                        "boat_ids": [
                          "26083"
                        ],
                        "peers_requested": 1,
                        "peers_selected": 1
                      },
                      "participants": [
                        {
                          "boat_id": "26082",
                          "name": "IRL-216116 | McMahon E.",
                          "role": "subject",
                          "comparison_color": "#42D4F4"
                        },
                        {
                          "boat_id": "26083",
                          "name": "GBR-228016 | Nicholls M.",
                          "role": "rival",
                          "comparison_color": "#F58231"
                        }
                      ],
                      "fleet_count": 10,
                      "results": [
                        {
                          "boat_id": "26083",
                          "position": 1,
                          "status": "finished",
                          "finish_time": 1789217473.4056194,
                          "elapsed_seconds": 1092.4056193828583,
                          "result_source": "completion.elapsed_seconds"
                        },
                        {
                          "boat_id": "26082",
                          "position": 8,
                          "status": "finished",
                          "finish_time": 1789217517.643135,
                          "elapsed_seconds": 1136.6431350708008,
                          "result_source": "completion.elapsed_seconds"
                        }
                      ],
                      "legs": [
                        {
                          "leg_index": 1,
                          "scope_id": "comment_6918",
                          "snapshot_ref": "dbf5c1f09a60d24f03f3a78c35c3c40012f5ccb202a22f7be8bf50f616ae1636",
                          "passages": {
                            "leg_index": 1,
                            "scope_id": "comment_6918",
                            "direction": "upwind",
                            "is_reach": false,
                            "subject": {
                              "boat_id": "26082",
                              "entry": {
                                "available": false,
                                "time": null,
                                "reason": "start_is_not_mark_passage",
                                "basis": "start"
                              },
                              "exit": {
                                "available": true,
                                "time": 1789216807,
                                "reason": null,
                                "basis": "mark_rounding_time",
                                "scope_id": "comment_6918",
                                "leg_index": 1,
                                "mark_ids": [
                                  "26074"
                                ],
                                "rounding_ids": [
                                  "rounding:comment_6918:boat:26082:leg:1:mark:26074"
                                ],
                                "quality": []
                              },
                              "available": false,
                              "reason": "start_is_not_mark_passage"
                            },
                            "pairs": [
                              {
                                "peer_id": "26083",
                                "available": false,
                                "reason": "start_is_not_mark_passage",
                                "entry_gap_s": null,
                                "exit_gap_s": null,
                                "gap_change_s": null,
                                "peer": {
                                  "boat_id": "26083",
                                  "entry": {
                                    "available": false,
                                    "time": null,
                                    "reason": "start_is_not_mark_passage",
                                    "basis": "start"
                                  },
                                  "exit": {
                                    "available": true,
                                    "time": 1789216789,
                                    "reason": null,
                                    "basis": "mark_rounding_time",
                                    "scope_id": "comment_6918",
                                    "leg_index": 1,
                                    "mark_ids": [
                                      "26074"
                                    ],
                                    "rounding_ids": [
                                      "rounding:comment_6918:boat:26083:leg:1:mark:26074"
                                    ],
                                    "quality": []
                                  },
                                  "available": false,
                                  "reason": "start_is_not_mark_passage"
                                }
                              }
                            ],
                            "exit_gaps": [
                              {
                                "peer_id": "26083",
                                "gap_s": 18,
                                "reason": null
                              }
                            ],
                            "subject_order_at_entry": null,
                            "subject_order_at_exit": {
                              "position": 9,
                              "measured_boats": 10,
                              "fleet_boats": 10,
                              "tied_boats": 0,
                              "basis": "recorded_mark_passage_order",
                              "reason": null
                            },
                            "median_paired_change_s": null,
                            "peers_requested": 1,
                            "peers_selected": 1,
                            "peers_measured": 0,
                            "coverage": {
                              "eligible_count": 1,
                              "measured_count": 0,
                              "unavailable_count": 1,
                              "excluded_count": 0,
                              "unavailable_reasons": {
                                "start_is_not_mark_passage": 1
                              }
                            },
                            "complete_peer_coverage": false,
                            "basis": "recorded_mark_passage",
                            "raw_gps_coverage_verified": false
                          },
                          "boats": [
                            {
                              "boat_id": "26082",
                              "time_range": {
                                "start": 1789216381,
                                "end": 1789216807,
                                "end_precise": 1789216805.675883
                              },
                              "reason": null,
                              "metrics": {
                                "avg_sog_kt": {
                                  "value": 4.592,
                                  "unit": "kn",
                                  "reason": null
                                },
                                "avg_mark_vmg_kt": {
                                  "value": 3.335,
                                  "unit": "kn",
                                  "reason": null
                                },
                                "avg_vmg_kt": {
                                  "value": 3.335,
                                  "unit": "kn",
                                  "reason": null
                                },
                                "distance_m": {
                                  "value": 1003,
                                  "unit": "m",
                                  "reason": null
                                },
                                "duration_seconds": {
                                  "value": 426,
                                  "unit": "s",
                                  "reason": null
                                }
                              },
                              "maneuver_loss": {
                                "type": "tack",
                                "qualifying_count": 3,
                                "measured_count": 3,
                                "unavailable_loss_count": 0,
                                "minimum_count": 1,
                                "median_loss_m": 3.776832305207659,
                                "reason": null,
                                "basis": "report_maneuver_loss_v1"
                              }
                            },
                            {
                              "boat_id": "26083",
                              "time_range": {
                                "start": 1789216381,
                                "end": 1789216789,
                                "end_precise": 1789216787.9516218
                              },
                              "reason": null,
                              "metrics": {
                                "avg_sog_kt": {
                                  "value": 4.861,
                                  "unit": "kn",
                                  "reason": null
                                },
                                "avg_mark_vmg_kt": {
                                  "value": 3.546,
                                  "unit": "kn",
                                  "reason": null
                                },
                                "avg_vmg_kt": {
                                  "value": 3.562,
                                  "unit": "kn",
                                  "reason": null
                                },
                                "distance_m": {
                                  "value": 1017.7,
                                  "unit": "m",
                                  "reason": null
                                },
                                "duration_seconds": {
                                  "value": 408,
                                  "unit": "s",
                                  "reason": null
                                }
                              },
                              "maneuver_loss": {
                                "type": "tack",
                                "qualifying_count": 3,
                                "measured_count": 3,
                                "unavailable_loss_count": 0,
                                "minimum_count": 1,
                                "median_loss_m": 3.4477307808109128,
                                "reason": null,
                                "basis": "report_maneuver_loss_v1"
                              }
                            }
                          ],
                          "peer_summary": {
                            "metrics": {
                              "avg_sog_kt": {
                                "value": 4.861,
                                "measured_count": 1,
                                "selected_count": 1,
                                "statistic": "median_of_boat_leg_values"
                              },
                              "avg_mark_vmg_kt": {
                                "value": 3.546,
                                "measured_count": 1,
                                "selected_count": 1,
                                "statistic": "median_of_boat_leg_values"
                              },
                              "avg_vmg_kt": {
                                "value": 3.562,
                                "measured_count": 1,
                                "selected_count": 1,
                                "statistic": "median_of_boat_leg_values"
                              },
                              "distance_m": {
                                "value": 1017.7,
                                "measured_count": 1,
                                "selected_count": 1,
                                "statistic": "median_of_boat_leg_values"
                              },
                              "duration_seconds": {
                                "value": 408,
                                "measured_count": 1,
                                "selected_count": 1,
                                "statistic": "median_of_boat_leg_values"
                              }
                            },
                            "maneuver_loss": {
                              "value": 3.4477307808109128,
                              "measured_count": 1,
                              "selected_count": 1,
                              "statistic": "median_of_boat_leg_medians"
                            },
                            "exit_gap": {
                              "value": 18,
                              "measured_count": 1,
                              "selected_count": 1,
                              "statistic": "median_exit_gap"
                            }
                          }
                        }
                      ],
                      "availability": {
                        "geometry": "available_on_request",
                        "actions": "not_implemented",
                        "raw_gps": "not_checked"
                      }
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/RaceFacts"
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked personal integration token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "example": {
                  "error": "authentication_required"
                }
              }
            }
          },
          "403": {
            "description": "Current subscription/scope unavailable",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "404": {
            "description": "Resource hidden or not authorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "409": {
            "description": "Data missing/changed; inspect safe reason",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "422": {
            "description": "Invalid filter/selection/snapshot",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "429": {
            "description": "Shared read/data quota; Retry-After",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Seconds before retrying.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "503": {
            "description": "A required limiter, budget service or backend is unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          }
        },
        "tags": [
          "Sessions & data"
        ]
      }
    },
    "/api/integrations/v1/sessions/{session_id}/flo/conversation": {
      "post": {
        "operationId": "openSailSyncFloConversation",
        "summary": "Create or resume this account\u2019s session FLO conversation",
        "description": "Requires flo:write. Open or reuse a conversation for a session you can access.",
        "parameters": [
          {
            "name": "session_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success, queued turn, permission/credit/budget/availability response. Use the returned turn ID for status; retry writes only with the same idempotency key.",
            "content": {
              "application/json": {
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "conversation_id": 39,
                      "session_id": 373,
                      "available_credit_microunits": 2000000,
                      "max_turn_credit_microunits": 1000000,
                      "unknown_usage_charge_policy": "declared_dispatched_call_maximum",
                      "integration_history_only": true
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/FloConversation"
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked personal integration token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "example": {
                  "error": "authentication_required"
                }
              }
            }
          },
          "402": {
            "description": "Success, queued turn, permission/credit/budget/availability response. Use the returned turn ID for status; retry writes only with the same idempotency key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "403": {
            "description": "Success, queued turn, permission/credit/budget/availability response. Use the returned turn ID for status; retry writes only with the same idempotency key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "error": "scope_required"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Success, queued turn, permission/credit/budget/availability response. Use the returned turn ID for status; retry writes only with the same idempotency key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "error": "not_available"
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Success, queued turn, permission/credit/budget/availability response. Use the returned turn ID for status; retry writes only with the same idempotency key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "422": {
            "description": "Success, queued turn, permission/credit/budget/availability response. Use the returned turn ID for status; retry writes only with the same idempotency key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "429": {
            "description": "Success, queued turn, permission/credit/budget/availability response. Use the returned turn ID for status; retry writes only with the same idempotency key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Seconds before retrying.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "503": {
            "description": "Success, queued turn, permission/credit/budget/availability response. Use the returned turn ID for status; retry writes only with the same idempotency key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          }
        },
        "tags": [
          "FLO"
        ]
      }
    },
    "/api/integrations/v1/sessions/{session_id}/flo/conversations/{conversation_id}": {
      "get": {
        "operationId": "getSailSyncFloConversation",
        "summary": "Read the latest 20 integration FLO turns",
        "description": "Requires flo:write. Read this conversation and its latest 20 integration turns.",
        "parameters": [
          {
            "name": "session_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991
            }
          },
          {
            "name": "conversation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success, queued turn, permission/credit/budget/availability response. Use the returned turn ID for status; retry writes only with the same idempotency key.",
            "content": {
              "application/json": {
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "conversation_id": 41,
                      "session_id": 376,
                      "available_credit_microunits": 1999160,
                      "max_turn_credit_microunits": 1000000,
                      "unknown_usage_charge_policy": "declared_dispatched_call_maximum",
                      "integration_history_only": true,
                      "turns": [
                        {
                          "id": 42,
                          "conversation_id": 41,
                          "session_id": 376,
                          "status": "completed",
                          "cancel_requested": false,
                          "reserved_credit_microunits": 1000000,
                          "charged_credit_microunits": 840,
                          "usage": {
                            "model_calls": 2,
                            "prompt_tokens": 200,
                            "completion_tokens": 40,
                            "source_bytes_reserved": 0
                          },
                          "answer": "The saved leg comparison supports this result [S1].",
                          "answer_format": "plain_text",
                          "citations": [
                            {
                              "id": "S1",
                              "kind": "results",
                              "scope_id": "comment_6814",
                              "session_id": 376,
                              "snapshot_ref": "8da8b9c70f9c34d8cb3769511c26a2d92ae30aba8a58538395a48536e5e8e9fd"
                            }
                          ],
                          "error": null,
                          "expires_at": "2026-10-27T17:21:09.473-07:00",
                          "settled_at": "2026-10-27T17:18:09.598-07:00",
                          "prompt": "Compare the saved race results"
                        }
                      ]
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/FloHistory"
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked personal integration token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "example": {
                  "error": "authentication_required"
                }
              }
            }
          },
          "402": {
            "description": "Success, queued turn, permission/credit/budget/availability response. Use the returned turn ID for status; retry writes only with the same idempotency key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "403": {
            "description": "Success, queued turn, permission/credit/budget/availability response. Use the returned turn ID for status; retry writes only with the same idempotency key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "404": {
            "description": "Success, queued turn, permission/credit/budget/availability response. Use the returned turn ID for status; retry writes only with the same idempotency key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "409": {
            "description": "Success, queued turn, permission/credit/budget/availability response. Use the returned turn ID for status; retry writes only with the same idempotency key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "422": {
            "description": "Success, queued turn, permission/credit/budget/availability response. Use the returned turn ID for status; retry writes only with the same idempotency key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "429": {
            "description": "Success, queued turn, permission/credit/budget/availability response. Use the returned turn ID for status; retry writes only with the same idempotency key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Seconds before retrying.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "503": {
            "description": "Success, queued turn, permission/credit/budget/availability response. Use the returned turn ID for status; retry writes only with the same idempotency key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          }
        },
        "tags": [
          "FLO"
        ]
      }
    },
    "/api/integrations/v1/sessions/{session_id}/flo/conversations/{conversation_id}/turns": {
      "post": {
        "operationId": "askSailSyncFlo",
        "summary": "Queue a bounded FLO turn using account credits",
        "description": "Requires flo:write. Ask a question up to 4,000 UTF-8 bytes. Reuse the Idempotency-Key on retries and poll at five-second intervals. Credit reservations use microunits (1,000,000 = 1 FLO credit). Unknown usage after dispatch may be charged up to the reserved maximum.",
        "parameters": [
          {
            "name": "session_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991
            }
          },
          {
            "name": "conversation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 80,
              "pattern": "^[A-Za-z0-9_-]{8,80}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success, queued turn, permission/credit/budget/availability response. Use the returned turn ID for status; retry writes only with the same idempotency key.",
            "content": {
              "application/json": {
                "examples": {
                  "completedRetry": {
                    "summary": "Synthetic integration-test response",
                    "description": "Completed receipt returned when retrying the same request. Test IDs are illustrative.",
                    "value": {
                      "id": 42,
                      "conversation_id": 41,
                      "session_id": 376,
                      "status": "completed",
                      "cancel_requested": false,
                      "reserved_credit_microunits": 1000000,
                      "charged_credit_microunits": 840,
                      "usage": {
                        "model_calls": 2,
                        "prompt_tokens": 200,
                        "completion_tokens": 40,
                        "source_bytes_reserved": 0
                      },
                      "answer": "The saved leg comparison supports this result [S1].",
                      "answer_format": "plain_text",
                      "citations": [
                        {
                          "id": "S1",
                          "kind": "results",
                          "scope_id": "comment_6814",
                          "session_id": 376,
                          "snapshot_ref": "8da8b9c70f9c34d8cb3769511c26a2d92ae30aba8a58538395a48536e5e8e9fd"
                        }
                      ],
                      "error": null,
                      "expires_at": "2026-10-27T17:21:09.473-07:00",
                      "settled_at": "2026-10-27T17:18:09.598-07:00"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/FloTurn"
                }
              }
            }
          },
          "202": {
            "description": "Success, queued turn, permission/credit/budget/availability response. Use the returned turn ID for status; retry writes only with the same idempotency key.",
            "content": {
              "application/json": {
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "id": 40,
                      "conversation_id": 39,
                      "session_id": 373,
                      "status": "queued",
                      "cancel_requested": false,
                      "reserved_credit_microunits": 1000000,
                      "charged_credit_microunits": 0,
                      "usage": {},
                      "answer": null,
                      "answer_format": "plain_text",
                      "citations": [],
                      "error": null,
                      "expires_at": "2026-10-27T17:21:09.357-07:00",
                      "settled_at": null
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/FloTurn"
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked personal integration token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "example": {
                  "error": "authentication_required"
                }
              }
            }
          },
          "402": {
            "description": "Success, queued turn, permission/credit/budget/availability response. Use the returned turn ID for status; retry writes only with the same idempotency key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "error": "insufficient_flo_credits",
                      "available_credit_microunits": 0,
                      "required_minimum_credit_microunits": 601536
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Success, queued turn, permission/credit/budget/availability response. Use the returned turn ID for status; retry writes only with the same idempotency key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "404": {
            "description": "Success, queued turn, permission/credit/budget/availability response. Use the returned turn ID for status; retry writes only with the same idempotency key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "409": {
            "description": "Success, queued turn, permission/credit/budget/availability response. Use the returned turn ID for status; retry writes only with the same idempotency key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "error": "idempotency_conflict"
                    }
                  }
                }
              }
            }
          },
          "422": {
            "description": "Success, queued turn, permission/credit/budget/availability response. Use the returned turn ID for status; retry writes only with the same idempotency key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "429": {
            "description": "Success, queued turn, permission/credit/budget/availability response. Use the returned turn ID for status; retry writes only with the same idempotency key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Seconds before retrying.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "503": {
            "description": "Success, queued turn, permission/credit/budget/availability response. Use the returned turn ID for status; retry writes only with the same idempotency key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "error": "flo_queue_unavailable"
                    }
                  }
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "prompt"
                ],
                "properties": {
                  "prompt": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 4000
                  },
                  "max_credit_microunits": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 1000000,
                    "default": 1000000
                  }
                }
              }
            }
          }
        },
        "tags": [
          "FLO"
        ]
      }
    },
    "/api/integrations/v1/sessions/{session_id}/flo/conversations/{conversation_id}/turns/{id}": {
      "get": {
        "operationId": "getSailSyncFloTurn",
        "summary": "Read a FLO turn status, answer, citations and credit usage",
        "description": "Requires flo:write. Read the turn status, answer, citations and credit charge. Poll no more than once every five seconds.",
        "parameters": [
          {
            "name": "session_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991
            }
          },
          {
            "name": "conversation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success, queued turn, permission/credit/budget/availability response. Use the returned turn ID for status; retry writes only with the same idempotency key.",
            "content": {
              "application/json": {
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "id": 42,
                      "conversation_id": 41,
                      "session_id": 376,
                      "status": "completed",
                      "cancel_requested": false,
                      "reserved_credit_microunits": 1000000,
                      "charged_credit_microunits": 840,
                      "usage": {
                        "model_calls": 2,
                        "prompt_tokens": 200,
                        "completion_tokens": 40,
                        "source_bytes_reserved": 0
                      },
                      "answer": "The saved leg comparison supports this result [S1].",
                      "answer_format": "plain_text",
                      "citations": [
                        {
                          "id": "S1",
                          "kind": "results",
                          "scope_id": "comment_6814",
                          "session_id": 376,
                          "snapshot_ref": "8da8b9c70f9c34d8cb3769511c26a2d92ae30aba8a58538395a48536e5e8e9fd"
                        }
                      ],
                      "error": null,
                      "expires_at": "2026-10-27T17:21:09.473-07:00",
                      "settled_at": "2026-10-27T17:18:09.598-07:00"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/FloTurn"
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked personal integration token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "error": "authentication_required"
                    }
                  }
                }
              }
            }
          },
          "402": {
            "description": "Success, queued turn, permission/credit/budget/availability response. Use the returned turn ID for status; retry writes only with the same idempotency key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "403": {
            "description": "Success, queued turn, permission/credit/budget/availability response. Use the returned turn ID for status; retry writes only with the same idempotency key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "404": {
            "description": "Success, queued turn, permission/credit/budget/availability response. Use the returned turn ID for status; retry writes only with the same idempotency key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "error": "not_found"
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Success, queued turn, permission/credit/budget/availability response. Use the returned turn ID for status; retry writes only with the same idempotency key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "422": {
            "description": "Success, queued turn, permission/credit/budget/availability response. Use the returned turn ID for status; retry writes only with the same idempotency key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "429": {
            "description": "Success, queued turn, permission/credit/budget/availability response. Use the returned turn ID for status; retry writes only with the same idempotency key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Seconds before retrying.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "503": {
            "description": "Success, queued turn, permission/credit/budget/availability response. Use the returned turn ID for status; retry writes only with the same idempotency key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          }
        },
        "tags": [
          "FLO"
        ]
      }
    },
    "/api/integrations/v1/sessions/{session_id}/flo/conversations/{conversation_id}/turns/{id}/cancel": {
      "post": {
        "operationId": "cancelSailSyncFloTurn",
        "summary": "Cancel queued work or request cancellation of a running FLO turn",
        "description": "Requires flo:write. Cancel a queued turn or request cancellation of a running turn. Already dispatched usage may still be charged.",
        "parameters": [
          {
            "name": "session_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991
            }
          },
          {
            "name": "conversation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success, queued turn, permission/credit/budget/availability response. Use the returned turn ID for status; retry writes only with the same idempotency key.",
            "content": {
              "application/json": {
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "id": 40,
                      "conversation_id": 39,
                      "session_id": 373,
                      "status": "canceled",
                      "cancel_requested": false,
                      "reserved_credit_microunits": 1000000,
                      "charged_credit_microunits": 0,
                      "usage": {},
                      "answer": null,
                      "answer_format": "plain_text",
                      "citations": [],
                      "error": "flo_turn_canceled",
                      "expires_at": "2026-10-27T17:21:09.357-07:00",
                      "settled_at": "2026-10-27T17:18:09.399-07:00"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/FloTurn"
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked personal integration token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "example": {
                  "error": "authentication_required"
                }
              }
            }
          },
          "402": {
            "description": "Success, queued turn, permission/credit/budget/availability response. Use the returned turn ID for status; retry writes only with the same idempotency key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "403": {
            "description": "Success, queued turn, permission/credit/budget/availability response. Use the returned turn ID for status; retry writes only with the same idempotency key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "404": {
            "description": "Success, queued turn, permission/credit/budget/availability response. Use the returned turn ID for status; retry writes only with the same idempotency key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "error": "not_found"
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Success, queued turn, permission/credit/budget/availability response. Use the returned turn ID for status; retry writes only with the same idempotency key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "422": {
            "description": "Success, queued turn, permission/credit/budget/availability response. Use the returned turn ID for status; retry writes only with the same idempotency key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "429": {
            "description": "Success, queued turn, permission/credit/budget/availability response. Use the returned turn ID for status; retry writes only with the same idempotency key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Seconds before retrying.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "503": {
            "description": "Success, queued turn, permission/credit/budget/availability response. Use the returned turn ID for status; retry writes only with the same idempotency key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          }
        },
        "tags": [
          "FLO"
        ]
      }
    },
    "/api/integrations/v1/sessions/{session_id}/imports/tracks": {
      "post": {
        "operationId": "importSailSyncTrack",
        "summary": "Import one normalized CSV and attach it to an owned session",
        "description": "Requires sessions:write and an owned session. Upload UTF-8 CSV with header time_epoch,lat,lng: increasing UTC Unix seconds within the session window, 2\u201320,000 points, maximum 1 MiB. Retry with the same Idempotency-Key. Imports do not recalculate analysis. Local MCP also accepts file_path.",
        "parameters": [
          {
            "name": "session_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 80,
              "pattern": "^[A-Za-z0-9_-]{8,80}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Completed receipt or current state. Retry uses the same key and returns the original result.",
            "content": {
              "application/json": {
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "receipt_id": 79,
                      "operation": "track",
                      "initiator_user_id": 601,
                      "source_sha256": "22f6a218614374b467af7f4951d194e83edd2b2725629174f36da74df02a8140",
                      "result": {
                        "session_id": 346,
                        "session_track_id": 149,
                        "manual_track_id": 125,
                        "points_sha256": "2b3b1e0eeeacbafa87018a45571c4ea148057f9d9e8610aa27995785098b04ce",
                        "point_count": 2,
                        "already_attached": false,
                        "compute_requested": false,
                        "completed": true
                      }
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/TrackImportReceipt"
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked personal integration token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "error": "authentication_required"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Subscription, scope or boat limit denied",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "error": "scope_required"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not enabled or not owned/found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "error": "not_available"
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Idempotency/version conflict or original result removed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "413": {
            "description": "Input too large",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input; safe code and optional numeric row",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "error": "invalid_track_point",
                      "row": 2
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Shared account/service budget exhausted; honor Retry-After",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Seconds before retrying.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "503": {
            "description": "Unavailable; keep the original idempotency key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "label": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200
                  },
                  "file_format": {
                    "type": "string",
                    "enum": [
                      "csv"
                    ]
                  },
                  "content_base64": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 1398104
                  },
                  "batch_reference": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 80
                  }
                },
                "required": [
                  "label",
                  "file_format",
                  "content_base64"
                ]
              }
            }
          }
        },
        "tags": [
          "Imports"
        ]
      }
    },
    "/api/integrations/v1/sessions/{session_id}/imports/wind": {
      "get": {
        "operationId": "getSailSyncWindVersion",
        "summary": "Read current wind version before import",
        "description": "Requires sessions:write and an owned session. Obtain the current wind version before replacing wind.",
        "parameters": [
          {
            "name": "session_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Completed receipt or current state. Retry uses the same key and returns the original result.",
            "content": {
              "application/json": {
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "session_id": 347,
                      "wind_version": "51d11f677e8229d907900c46d82d90dc20cdd5165efeed0a0867a930203789a0"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/WindVersion"
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked personal integration token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "example": {
                  "error": "authentication_required"
                }
              }
            }
          },
          "403": {
            "description": "Subscription, scope or boat limit denied",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "404": {
            "description": "Not enabled or not owned/found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "409": {
            "description": "Idempotency/version conflict or original result removed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "413": {
            "description": "Input too large",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input; safe code and optional numeric row",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "429": {
            "description": "Shared account/service budget exhausted; honor Retry-After",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Seconds before retrying.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "503": {
            "description": "Unavailable; keep the original idempotency key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          }
        },
        "tags": [
          "Imports"
        ]
      },
      "post": {
        "operationId": "importSailSyncWind",
        "summary": "Import normalized measured wind with explicit replacement consent",
        "description": "Requires sessions:write and an owned session. Supply ordered UTC observations. Replacing existing wind requires replace=true and the current version. Reuse the Idempotency-Key on retries. This does not trigger recalculation.",
        "parameters": [
          {
            "name": "session_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 80,
              "pattern": "^[A-Za-z0-9_-]{8,80}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Completed receipt or current state. Retry uses the same key and returns the original result.",
            "content": {
              "application/json": {
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "receipt_id": 80,
                      "operation": "wind",
                      "initiator_user_id": 602,
                      "source_sha256": "e5438a1e4df03f6974f514ce36b4a7f71b6d1d091fc2de1789543df6faeb9fcd",
                      "result": {
                        "session_id": 347,
                        "wind_version": "46a8ec17741b1caa492d89219c6ff4b02f390a7d74f4d371d8bab0b7ab3da29e",
                        "observation_count": 1,
                        "compute_requested": false,
                        "completed": true
                      }
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/WindImportReceipt"
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked personal integration token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "example": {
                  "error": "authentication_required"
                }
              }
            }
          },
          "403": {
            "description": "Subscription, scope or boat limit denied",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "404": {
            "description": "Not enabled or not owned/found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "409": {
            "description": "Idempotency/version conflict or original result removed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "error": "wind_replacement_required"
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "Input too large",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input; safe code and optional numeric row",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "429": {
            "description": "Shared account/service budget exhausted; honor Retry-After",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Seconds before retrying.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "503": {
            "description": "Unavailable; keep the original idempotency key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "expected_wind_version": {
                    "type": "string",
                    "pattern": "^[0-9a-f]{64}$"
                  },
                  "replace": {
                    "type": "boolean"
                  },
                  "source": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 200
                  },
                  "speed_unit": {
                    "type": "string",
                    "enum": [
                      "knots"
                    ]
                  },
                  "direction_reference": {
                    "type": "string",
                    "enum": [
                      "true_north_from"
                    ]
                  },
                  "observations": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 2000,
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "properties": {
                        "timestamp": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 40
                        },
                        "direction_deg": {
                          "type": "number",
                          "minimum": 0,
                          "maximum": 360
                        },
                        "speed": {
                          "type": "number",
                          "minimum": 0,
                          "maximum": 80
                        }
                      },
                      "required": [
                        "timestamp",
                        "direction_deg",
                        "speed"
                      ]
                    }
                  },
                  "batch_reference": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 80
                  }
                },
                "required": [
                  "expected_wind_version",
                  "replace",
                  "source",
                  "speed_unit",
                  "direction_reference",
                  "observations"
                ]
              }
            }
          }
        },
        "tags": [
          "Imports"
        ]
      }
    },
    "/api/integrations/v1/sessions/{session_id}/imports/setup_inquiry": {
      "post": {
        "operationId": "requestSailSyncSessionSetup",
        "summary": "Ask staff to help set up an owned session",
        "description": "Requires sessions:write and an owned session. Request human help with race setup; follow the receipt for status.",
        "parameters": [
          {
            "name": "session_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 80,
              "pattern": "^[A-Za-z0-9_-]{8,80}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Completed receipt or current state. Retry uses the same key and returns the original result.",
            "content": {
              "application/json": {
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "receipt_id": 90,
                      "operation": "inquiry",
                      "initiator_user_id": 607,
                      "source_sha256": null,
                      "result": {
                        "session_id": 353,
                        "staff_request_id": 4,
                        "status": "requested",
                        "automated_preparation": false,
                        "completed": true
                      }
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/SetupInquiryReceipt"
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked personal integration token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "example": {
                  "error": "authentication_required"
                }
              }
            }
          },
          "403": {
            "description": "Subscription, scope or boat limit denied",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "404": {
            "description": "Not enabled or not owned/found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "409": {
            "description": "Idempotency/version conflict or original result removed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "413": {
            "description": "Input too large",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input; safe code and optional numeric row",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "429": {
            "description": "Shared account/service budget exhausted; honor Retry-After",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Seconds before retrying.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "503": {
            "description": "Unavailable; keep the original idempotency key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "message": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 6000
                  },
                  "batch_reference": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 80
                  }
                },
                "required": [
                  "message"
                ]
              }
            }
          }
        },
        "tags": [
          "Imports"
        ]
      }
    },
    "/api/integrations/v1/sessions/{session_id}/imports/receipts/{id}": {
      "get": {
        "operationId": "getSailSyncImportReceipt",
        "summary": "Read a completed import receipt or current staff inquiry status",
        "description": "Requires sessions:write. Retrieve your import or setup receipt for a session you still own.",
        "parameters": [
          {
            "name": "session_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Completed receipt or current state. Retry uses the same key and returns the original result.",
            "content": {
              "application/json": {
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "receipt_id": 83,
                      "operation": "wind",
                      "initiator_user_id": 602,
                      "created_at": "2026-10-27T17:18:06.702-07:00",
                      "source_sha256": "960454e605b7b384c17bffbdaf9a7fde761cf07c56cf5b5545375dc4b647ee1e",
                      "result": {
                        "completed": true,
                        "session_id": 347,
                        "wind_version": "51d11f677e8229d907900c46d82d90dc20cdd5165efeed0a0867a930203789a0",
                        "compute_requested": false,
                        "observation_count": 1
                      }
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/ImportReceipt"
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked personal integration token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "example": {
                  "error": "authentication_required"
                }
              }
            }
          },
          "403": {
            "description": "Subscription, scope or boat limit denied",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "404": {
            "description": "Not enabled or not owned/found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "409": {
            "description": "Idempotency/version conflict or original result removed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "413": {
            "description": "Input too large",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input; safe code and optional numeric row",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "429": {
            "description": "Shared account/service budget exhausted; honor Retry-After",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Seconds before retrying.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "503": {
            "description": "Unavailable; keep the original idempotency key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          }
        },
        "tags": [
          "Imports"
        ]
      }
    },
    "/api/integrations/v1/sessions/{session_id}/compute": {
      "post": {
        "operationId": "requestSailSyncRecalculation",
        "summary": "Request bounded recalculation of an owned finished session",
        "description": "Requires compute:write and an owned, finished session. Reuse the Idempotency-Key on retries. Acceptance is not completion; poll the returned request. Uncertain or ongoing work may block another request.",
        "parameters": [
          {
            "name": "session_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 80,
              "pattern": "^[A-Za-z0-9_-]{8,80}$"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {}
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Existing request or status",
            "content": {
              "application/json": {
                "examples": {
                  "completedRetry": {
                    "summary": "Synthetic integration-test response",
                    "description": "Completed receipt returned when retrying the same request. Test IDs are illustrative.",
                    "value": {
                      "session_id": 366,
                      "request": {
                        "id": 28,
                        "status": "completed",
                        "error": null,
                        "source_revision": "a56d61f619725ce34b044d8b00d423b6032fcb11625d1c46656dcde2c41ceec3",
                        "dispatched_at": "2026-10-27T17:18:08.845-07:00",
                        "accepted_at": "2026-10-27T17:18:08.883-07:00",
                        "completed_at": "2026-10-27T17:18:08.910-07:00",
                        "queue_expires_at": "2026-10-27T17:23:08.794-07:00",
                        "overdue": false,
                        "same_key_retry_safe": true,
                        "dispatch_retry_allowed": false,
                        "publication_fenced": true
                      }
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/ComputeReceipt"
                }
              }
            }
          },
          "202": {
            "description": "Queued, not proof of invocation or successful results",
            "content": {
              "application/json": {
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "session_id": 366,
                      "request": {
                        "id": 28,
                        "status": "queued",
                        "error": null,
                        "source_revision": "a56d61f619725ce34b044d8b00d423b6032fcb11625d1c46656dcde2c41ceec3",
                        "dispatched_at": null,
                        "accepted_at": null,
                        "completed_at": null,
                        "queue_expires_at": "2026-10-27T17:23:08.794-07:00",
                        "overdue": false,
                        "same_key_retry_safe": true,
                        "dispatch_retry_allowed": true,
                        "publication_fenced": false
                      }
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/ComputeReceipt"
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked personal integration token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "error": "authentication_required"
                    }
                  }
                }
              }
            }
          },
          "403": {
            "description": "Current paid scope/ownership denied",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "error": "scope_required"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not enabled or not owned/found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "error": "not_available"
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Flight unresolved, conflicting key or changed sources",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "422": {
            "description": "Input, source/track count or committed recording unsupported",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "error": "invalid_compute_request"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Account/service budget or active-account/service guard; honor Retry-After",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Seconds before retrying.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "503": {
            "description": "Unavailable; retain original key and check request status",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "error": "compute_queue_unavailable",
                      "compute_request_id": 29
                    }
                  }
                }
              }
            }
          }
        },
        "tags": [
          "Compute"
        ]
      },
      "get": {
        "operationId": "getSailSyncComputeStatus",
        "summary": "Read owned-session native status and private compute receipt",
        "description": "Requires compute:write and current ownership. Poll at least 30 seconds apart. Once complete, use result_data_path to inspect the analysis.",
        "parameters": [
          {
            "name": "session_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991
            }
          },
          {
            "name": "request_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Existing request or status",
            "content": {
              "application/json": {
                "examples": {
                  "integrationTest": {
                    "summary": "Synthetic integration-test response",
                    "description": "Sanitized test-account example. IDs are illustrative.",
                    "value": {
                      "session_id": 366,
                      "compute_status": {
                        "state": "ready",
                        "computed_at": "2026-10-27T17:18:08-07:00",
                        "invoked_at": null,
                        "last_attempt_failed": false,
                        "can_retry": true
                      },
                      "request": {
                        "id": 28,
                        "status": "completed",
                        "error": null,
                        "source_revision": "a56d61f619725ce34b044d8b00d423b6032fcb11625d1c46656dcde2c41ceec3",
                        "dispatched_at": "2026-10-27T17:18:08.845-07:00",
                        "accepted_at": "2026-10-27T17:18:08.883-07:00",
                        "completed_at": "2026-10-27T17:18:08.910-07:00",
                        "queue_expires_at": "2026-10-27T17:23:08.794-07:00",
                        "overdue": false,
                        "same_key_retry_safe": true,
                        "dispatch_retry_allowed": false,
                        "publication_fenced": true
                      },
                      "result_data_path": "/api/integrations/v1/sessions/366/data/analysis",
                      "poll_after_seconds": 30,
                      "publication_fenced": true
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/ComputeStatus"
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked personal integration token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                },
                "example": {
                  "error": "authentication_required"
                }
              }
            }
          },
          "403": {
            "description": "Current paid scope/ownership denied",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "404": {
            "description": "Not enabled or not owned/found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "409": {
            "description": "Flight unresolved, conflicting key or changed sources",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "422": {
            "description": "Input, source/track count or committed recording unsupported",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          },
          "429": {
            "description": "Account/service budget or active-account/service guard; honor Retry-After",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Seconds before retrying.",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "503": {
            "description": "Unavailable; retain original key and check request status",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationError"
                }
              }
            }
          }
        },
        "tags": [
          "Compute"
        ]
      }
    }
  },
  "components": {
    "securitySchemes": {
      "integrationToken": {
        "type": "http",
        "scheme": "bearer",
        "description": "ssi_ personal API token; environment secret for local MCP. Never place it in URLs or tool arguments."
      }
    },
    "schemas": {
      "IntegrationError": {
        "type": "object",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "string",
            "description": "Machine-readable error code."
          },
          "reason": {
            "type": "string",
            "nullable": true
          },
          "budget": {
            "type": "string"
          },
          "limit": {
            "type": "integer"
          },
          "remaining": {
            "type": "integer"
          },
          "reset_at": {
            "type": "integer",
            "description": "UTC Unix seconds."
          },
          "retry_after": {
            "type": "integer",
            "description": "Seconds to wait before retrying."
          }
        },
        "additionalProperties": true,
        "description": "Machine-readable failure. Extra operation-specific detail fields may be present."
      },
      "SubscriberAccount": {
        "type": "object",
        "required": [
          "schema_version",
          "user_id",
          "plan",
          "scopes",
          "capabilities",
          "compute_available",
          "imports_available",
          "flo_available",
          "limits"
        ],
        "properties": {
          "schema_version": {
            "type": "string",
            "enum": [
              "subscriber_api_v1"
            ]
          },
          "user_id": {
            "type": "integer"
          },
          "plan": {
            "type": "string"
          },
          "scopes": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "capabilities": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "compute_available": {
            "type": "boolean"
          },
          "imports_available": {
            "type": "boolean"
          },
          "flo_available": {
            "type": "boolean"
          },
          "limits": {
            "type": "object",
            "required": [
              "max_page_size"
            ],
            "properties": {
              "max_page_size": {
                "type": "integer"
              }
            }
          }
        }
      },
      "OwnedSessionSummary": {
        "type": "object",
        "required": [
          "id",
          "name",
          "boat_class",
          "start_time",
          "end_time",
          "effective_start_time",
          "effective_end_time",
          "first_race_number",
          "track_count"
        ],
        "properties": {
          "id": {
            "type": "integer"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "boat_class": {
            "type": "string",
            "nullable": true
          },
          "start_time": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "end_time": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "effective_start_time": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "effective_end_time": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "first_race_number": {
            "type": "integer"
          },
          "track_count": {
            "type": "integer"
          }
        }
      },
      "OwnedSessionPage": {
        "type": "object",
        "required": [
          "schema_version",
          "sessions",
          "next_before_id"
        ],
        "properties": {
          "schema_version": {
            "type": "string",
            "enum": [
              "subscriber_sessions_v1"
            ]
          },
          "sessions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/OwnedSessionSummary"
            }
          },
          "next_before_id": {
            "type": "integer",
            "nullable": true
          }
        }
      },
      "EpochWindow": {
        "type": "object",
        "properties": {
          "start": {
            "type": "number",
            "nullable": true
          },
          "end": {
            "type": "number",
            "nullable": true
          },
          "end_precise": {
            "type": "number",
            "nullable": true
          }
        },
        "additionalProperties": true,
        "description": "UTC Unix seconds; missing boundaries may be null."
      },
      "LocalTime": {
        "type": "object",
        "properties": {
          "epoch": {
            "type": "number",
            "description": "UTC Unix seconds, potentially fractional."
          },
          "utc": {
            "type": "string",
            "format": "date-time"
          },
          "local": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "time_zone": {
            "type": "string"
          }
        },
        "additionalProperties": true,
        "description": "Display time context can differ from the event venue; use epoch/utc for comparisons."
      },
      "RaceMetadata": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "debrief_scope_id": {
            "type": "string"
          },
          "source_comment_id": {
            "type": "integer",
            "minimum": 1
          },
          "index": {
            "type": "integer"
          },
          "display_number": {
            "type": "integer"
          },
          "label": {
            "type": "string"
          },
          "heat": {
            "type": "string",
            "nullable": true
          },
          "time_range": {
            "$ref": "#/components/schemas/EpochWindow"
          }
        },
        "additionalProperties": true,
        "required": [
          "id",
          "debrief_scope_id",
          "source_comment_id",
          "index",
          "display_number",
          "label",
          "heat",
          "time_range"
        ]
      },
      "OwnedSessionDetail": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "boat_class": {
            "type": "string",
            "nullable": true
          },
          "first_race_number": {
            "type": "integer"
          },
          "start_time": {
            "type": "string",
            "format": "date-time"
          },
          "end_time": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true,
        "required": [
          "id",
          "name",
          "boat_class",
          "first_race_number",
          "start_time",
          "end_time"
        ]
      },
      "OwnedTrack": {
        "type": "object",
        "properties": {
          "session_track_id": {
            "type": "integer",
            "minimum": 1
          },
          "manual_track_id": {
            "type": "integer",
            "nullable": true
          },
          "points_sha256": {
            "type": "string",
            "nullable": true
          },
          "data_revision": {
            "type": "integer",
            "nullable": true
          },
          "name": {
            "type": "string"
          },
          "type": {
            "type": "string",
            "nullable": true
          },
          "time_offset": {
            "type": "number",
            "nullable": true
          },
          "sailing_window": {
            "type": "array",
            "items": {
              "type": "number",
              "nullable": true
            },
            "minItems": 2,
            "maxItems": 2,
            "nullable": true,
            "description": "Track sailing-window start and end in UTC Unix seconds."
          },
          "gps_supported": {
            "type": "boolean"
          }
        },
        "additionalProperties": true,
        "required": [
          "session_track_id",
          "manual_track_id",
          "points_sha256",
          "data_revision",
          "name",
          "type",
          "time_offset",
          "sailing_window",
          "gps_supported"
        ]
      },
      "OwnedSessionResponse": {
        "type": "object",
        "properties": {
          "schema_version": {
            "type": "string",
            "enum": [
              "subscriber_session_v1"
            ]
          },
          "session": {
            "$ref": "#/components/schemas/OwnedSessionDetail"
          },
          "tracks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/OwnedTrack"
            }
          },
          "next_before_track_id": {
            "type": "integer",
            "nullable": true
          }
        },
        "additionalProperties": true,
        "required": [
          "schema_version",
          "session",
          "tracks",
          "next_before_track_id"
        ]
      },
      "GpsPoint": {
        "type": "object",
        "properties": {
          "time_epoch": {
            "type": "number",
            "description": "UTC Unix seconds, potentially fractional."
          },
          "lat": {
            "type": "number",
            "nullable": true,
            "minimum": -90,
            "maximum": 90
          },
          "lng": {
            "type": "number",
            "nullable": true,
            "minimum": -180,
            "maximum": 180
          }
        },
        "additionalProperties": true,
        "description": "An invalid fix has null coordinates; keep it as a position barrier.",
        "required": [
          "time_epoch",
          "lat",
          "lng"
        ]
      },
      "GpsPage": {
        "type": "object",
        "properties": {
          "available": {
            "type": "boolean",
            "enum": [
              true
            ]
          },
          "session_id": {
            "type": "integer",
            "minimum": 1
          },
          "session_track_id": {
            "type": "integer",
            "minimum": 1
          },
          "resolution": {
            "type": "string",
            "enum": [
              "committed_full_resolution_gps"
            ]
          },
          "source_ref": {
            "type": "string",
            "description": "Opaque content/snapshot digest; compare for equality, do not interpret."
          },
          "time_basis": {
            "type": "string",
            "enum": [
              "session_epoch_seconds_with_track_offset"
            ]
          },
          "time_offset": {
            "type": "number"
          },
          "window": {
            "type": "object",
            "required": [
              "start",
              "end"
            ],
            "properties": {
              "start": {
                "type": "number",
                "description": "UTC Unix seconds."
              },
              "end": {
                "type": "number",
                "description": "UTC Unix seconds."
              }
            },
            "additionalProperties": true
          },
          "point_count": {
            "type": "integer",
            "minimum": 0
          },
          "points": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GpsPoint"
            }
          },
          "next_cursor": {
            "type": "string",
            "nullable": true,
            "description": "Signed continuation cursor, or null on the final page. Expires in 15 minutes."
          }
        },
        "additionalProperties": true,
        "required": [
          "available",
          "session_id",
          "session_track_id",
          "resolution",
          "source_ref",
          "time_basis",
          "time_offset",
          "window",
          "point_count",
          "points",
          "next_cursor"
        ]
      },
      "UnavailableGps": {
        "type": "object",
        "properties": {
          "available": {
            "type": "boolean",
            "enum": [
              false
            ]
          },
          "reason": {
            "type": "string"
          },
          "points": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/GpsPoint"
            },
            "maxItems": 0
          },
          "next_cursor": {
            "type": "string",
            "nullable": true,
            "enum": [
              null
            ]
          }
        },
        "additionalProperties": true,
        "description": "An unsupported, uncommitted or unavailable source returns HTTP 409 without an error key.",
        "required": [
          "available",
          "reason",
          "points",
          "next_cursor"
        ]
      },
      "SubscriberEvent": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "title": {
            "type": "string"
          },
          "starts_on": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "ends_on": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "timezone": {
            "type": "string",
            "nullable": true
          },
          "location": {
            "type": "string",
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "boat_classes": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "additionalProperties": true,
        "required": [
          "id",
          "title",
          "starts_on",
          "ends_on",
          "timezone",
          "location",
          "description",
          "boat_classes"
        ]
      },
      "EventPage": {
        "type": "object",
        "properties": {
          "events": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SubscriberEvent"
            }
          },
          "page": {
            "type": "integer",
            "minimum": 1
          },
          "next_page": {
            "type": "integer",
            "nullable": true
          },
          "total": {
            "type": "integer",
            "minimum": 0
          }
        },
        "additionalProperties": true,
        "required": [
          "events",
          "page",
          "next_page",
          "total"
        ]
      },
      "EventSession": {
        "type": "object",
        "properties": {
          "assignment_id": {
            "type": "integer",
            "minimum": 1
          },
          "session_id": {
            "type": "integer",
            "minimum": 1
          },
          "date": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "division": {
            "type": "string",
            "nullable": true
          },
          "boat_class": {
            "type": "string",
            "nullable": true
          },
          "races": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RaceMetadata"
            }
          },
          "access_allowed": {
            "type": "boolean"
          },
          "access_path": {
            "type": "string",
            "description": "Relative subscriber API path. This path does not independently grant access."
          }
        },
        "additionalProperties": true,
        "required": [
          "assignment_id",
          "session_id",
          "date",
          "division",
          "boat_class",
          "races",
          "access_allowed",
          "access_path"
        ]
      },
      "EventDetail": {
        "type": "object",
        "properties": {
          "event": {
            "$ref": "#/components/schemas/SubscriberEvent"
          },
          "sessions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EventSession"
            }
          },
          "next_after_assignment_id": {
            "type": "integer",
            "nullable": true
          }
        },
        "additionalProperties": true,
        "required": [
          "event",
          "sessions",
          "next_after_assignment_id"
        ]
      },
      "DayAccess": {
        "type": "object",
        "properties": {
          "event_id": {
            "type": "integer",
            "minimum": 1
          },
          "assignment_id": {
            "type": "integer",
            "minimum": 1
          },
          "session_id": {
            "type": "integer",
            "minimum": 1
          },
          "allowed": {
            "type": "boolean"
          },
          "state": {
            "type": "string",
            "enum": [
              "already_available",
              "access_required"
            ]
          },
          "day": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "unit": {
            "type": "object",
            "properties": {
              "report_date": {
                "type": "string",
                "format": "date"
              },
              "fleet_key": {
                "type": "string"
              }
            },
            "additionalProperties": true,
            "nullable": true
          },
          "allowance_debited": {
            "type": "integer",
            "enum": [
              0
            ]
          },
          "flo_credits_debited": {
            "type": "integer",
            "enum": [
              0
            ]
          },
          "data_path": {
            "type": "string",
            "description": "Relative subscriber API path. This path does not independently grant access.",
            "nullable": true
          }
        },
        "additionalProperties": true,
        "required": [
          "event_id",
          "assignment_id",
          "session_id",
          "allowed",
          "state",
          "day",
          "unit",
          "allowance_debited",
          "flo_credits_debited",
          "data_path"
        ]
      },
      "SessionManifest": {
        "type": "object",
        "properties": {
          "session": {
            "type": "object",
            "properties": {
              "id": {
                "type": "integer",
                "minimum": 1
              },
              "name": {
                "type": "string",
                "nullable": true
              },
              "boat_class": {
                "type": "string",
                "nullable": true
              },
              "first_race_number": {
                "type": "integer"
              },
              "start": {
                "type": "number",
                "description": "UTC Unix seconds, potentially fractional."
              },
              "end": {
                "type": "number",
                "description": "UTC Unix seconds, potentially fractional."
              }
            },
            "additionalProperties": true,
            "required": [
              "id",
              "name",
              "boat_class",
              "first_race_number",
              "start",
              "end"
            ]
          },
          "races": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RaceMetadata"
            }
          },
          "tracks": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "session_track_id": {
                  "type": "integer",
                  "minimum": 1
                },
                "type": {
                  "type": "string",
                  "nullable": true
                },
                "name": {
                  "type": "string"
                },
                "time_offset": {
                  "type": "number",
                  "nullable": true
                },
                "sailing_window": {
                  "type": "array",
                  "items": {
                    "type": "number",
                    "nullable": true
                  },
                  "minItems": 2,
                  "maxItems": 2,
                  "nullable": true,
                  "description": "Track sailing-window start and end in UTC Unix seconds."
                },
                "gps_path": {
                  "type": "string",
                  "description": "Relative subscriber API path. This path does not independently grant access.",
                  "nullable": true
                }
              },
              "additionalProperties": true,
              "required": [
                "session_track_id",
                "type",
                "name",
                "time_offset",
                "sailing_window",
                "gps_path"
              ]
            }
          },
          "next_after_track_id": {
            "type": "integer",
            "nullable": true
          },
          "analysis_path": {
            "type": "string",
            "description": "Relative subscriber API path. This path does not independently grant access."
          },
          "wind_path": {
            "type": "string",
            "description": "Relative subscriber API path. This path does not independently grant access."
          },
          "permissions": {
            "type": "object",
            "properties": {
              "read": {
                "type": "boolean",
                "enum": [
                  true
                ]
              },
              "write": {
                "type": "boolean",
                "enum": [
                  false
                ]
              }
            },
            "additionalProperties": true,
            "required": [
              "read",
              "write"
            ]
          }
        },
        "additionalProperties": true,
        "required": [
          "session",
          "races",
          "tracks",
          "next_after_track_id",
          "analysis_path",
          "wind_path",
          "permissions"
        ]
      },
      "WindPoint": {
        "type": "object",
        "properties": {
          "t": {
            "oneOf": [
              {
                "type": "number",
                "nullable": true
              },
              {
                "type": "string"
              }
            ],
            "description": "Numeric value in normal observations. Legacy saved rows may retain a numeric string or null."
          },
          "direction": {
            "oneOf": [
              {
                "type": "number",
                "nullable": true
              },
              {
                "type": "string"
              }
            ],
            "description": "Numeric value in normal observations. Legacy saved rows may retain a numeric string or null."
          },
          "avg_kt": {
            "oneOf": [
              {
                "type": "number",
                "nullable": true
              },
              {
                "type": "string"
              }
            ],
            "description": "Numeric value in normal observations. Legacy saved rows may retain a numeric string or null."
          },
          "gust_kt": {
            "oneOf": [
              {
                "type": "number",
                "nullable": true
              },
              {
                "type": "string"
              }
            ],
            "description": "Numeric value in normal observations. Legacy saved rows may retain a numeric string or null."
          },
          "lull_kt": {
            "oneOf": [
              {
                "type": "number",
                "nullable": true
              },
              {
                "type": "string"
              }
            ],
            "description": "Numeric value in normal observations. Legacy saved rows may retain a numeric string or null."
          },
          "source": {
            "type": "string",
            "nullable": true
          },
          "derived_from": {
            "type": "object",
            "nullable": true,
            "properties": {
              "race_id": {
                "oneOf": [
                  {
                    "type": "integer"
                  },
                  {
                    "type": "string"
                  }
                ]
              },
              "race_start": {
                "type": "number"
              },
              "lineup_id": {
                "oneOf": [
                  {
                    "type": "integer"
                  },
                  {
                    "type": "string"
                  }
                ]
              },
              "lineup_start": {
                "type": "number"
              },
              "level": {
                "type": "integer"
              },
              "v": {
                "type": "integer"
              }
            },
            "additionalProperties": true,
            "description": "Provenance metadata from the editor/automatic wind merge; present only on applicable rows."
          },
          "confidence": {
            "oneOf": [
              {
                "type": "number",
                "nullable": true
              },
              {
                "type": "string"
              }
            ],
            "description": "Numeric value in normal observations. Legacy saved rows may retain a numeric string or null."
          }
        },
        "additionalProperties": true,
        "description": "Configured wind row; available fields depend on series/source. Legacy metadata remains extensible.",
        "nullable": true
      },
      "WindPage": {
        "type": "object",
        "properties": {
          "series": {
            "type": "string",
            "enum": [
              "direction",
              "speed"
            ]
          },
          "unit": {
            "type": "string",
            "enum": [
              "degrees",
              "knots"
            ]
          },
          "representation": {
            "type": "string",
            "enum": [
              "configured_session_step_series"
            ]
          },
          "snapshot_ref": {
            "type": "string",
            "description": "Opaque content/snapshot digest; compare for equality, do not interpret."
          },
          "total_count": {
            "type": "integer",
            "minimum": 0
          },
          "default_direction_deg": {
            "type": "number",
            "nullable": true
          },
          "default_speed_kt": {
            "type": "number",
            "nullable": true
          },
          "points": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WindPoint"
            }
          },
          "next_offset": {
            "type": "integer",
            "nullable": true
          }
        },
        "additionalProperties": true,
        "required": [
          "series",
          "unit",
          "representation",
          "snapshot_ref",
          "total_count",
          "default_direction_deg",
          "default_speed_kt",
          "points",
          "next_offset"
        ]
      },
      "AnalysisSnapshot": {
        "type": "object",
        "properties": {
          "ref": {
            "type": "string",
            "description": "Opaque content/snapshot digest; compare for equality, do not interpret."
          },
          "schema_version": {
            "type": "string",
            "enum": [
              "race_debrief_facts_v1"
            ]
          },
          "artifact_run_id": {
            "type": "string",
            "nullable": true
          },
          "computed_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "revision_completeness": {
            "type": "string",
            "enum": [
              "partial"
            ]
          },
          "missing_revision_components": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "freshness": {
            "type": "string"
          },
          "refresh_required": {
            "type": "boolean"
          },
          "raw_gps_coverage_verified": {
            "type": "boolean",
            "enum": [
              false
            ]
          }
        },
        "additionalProperties": true,
        "required": [
          "ref",
          "schema_version",
          "artifact_run_id",
          "computed_at",
          "revision_completeness",
          "missing_revision_components",
          "freshness",
          "refresh_required",
          "raw_gps_coverage_verified"
        ]
      },
      "AnalysisRace": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "source_comment_id": {
            "type": "integer",
            "nullable": true
          },
          "kind": {
            "type": "string",
            "enum": [
              "race"
            ]
          },
          "label": {
            "type": "string",
            "nullable": true
          },
          "index": {
            "type": "integer"
          },
          "display_number": {
            "type": "integer"
          },
          "boat_ids": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Decimal session-track ID. Analysis endpoints serialize boat IDs as strings."
            }
          },
          "available": {
            "type": "boolean"
          },
          "reason": {
            "type": "string",
            "nullable": true
          },
          "legs": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "leg_index": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "additionalProperties": true,
              "required": [
                "leg_index"
              ]
            }
          },
          "snapshot": {
            "$ref": "#/components/schemas/AnalysisSnapshot"
          }
        },
        "additionalProperties": true,
        "required": [
          "id",
          "source_comment_id",
          "kind",
          "label",
          "index",
          "display_number",
          "boat_ids",
          "available",
          "reason",
          "legs",
          "snapshot"
        ]
      },
      "AnalysisCatalog": {
        "type": "object",
        "properties": {
          "schema_version": {
            "type": "string",
            "enum": [
              "race_debrief_facts_v1"
            ]
          },
          "session_id": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "ready",
              "not_ready"
            ]
          },
          "reason": {
            "type": "string",
            "nullable": true
          },
          "refresh_required": {
            "type": "boolean"
          },
          "freshness": {
            "type": "string"
          },
          "access": {
            "type": "object",
            "properties": {
              "allowed": {
                "type": "boolean"
              },
              "required_plans": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "trial_activation_supported": {
                "type": "boolean",
                "enum": [
                  false
                ]
              }
            },
            "additionalProperties": true,
            "required": [
              "allowed",
              "required_plans",
              "trial_activation_supported"
            ]
          },
          "boats": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "boat_id": {
                  "type": "string",
                  "description": "Decimal session-track ID. Analysis endpoints serialize boat IDs as strings."
                },
                "name": {
                  "type": "string",
                  "nullable": true
                }
              },
              "additionalProperties": true,
              "required": [
                "boat_id",
                "name"
              ]
            }
          },
          "races": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AnalysisRace"
            }
          },
          "comparison_policies": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "named_rival",
                "leading_finishers"
              ]
            }
          }
        },
        "additionalProperties": true,
        "required": [
          "schema_version",
          "session_id",
          "status",
          "reason",
          "refresh_required",
          "freshness",
          "access",
          "boats",
          "races",
          "comparison_policies"
        ]
      },
      "RaceResult": {
        "type": "object",
        "properties": {
          "boat_id": {
            "type": "string",
            "description": "Decimal session-track ID. Analysis endpoints serialize boat IDs as strings."
          },
          "boat_name": {
            "type": "string",
            "nullable": true
          },
          "boat_color": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "type": "string",
            "description": "Recorded/inferred completion status, e.g. finished, partial, not_started, excluded or unknown."
          },
          "finish_time": {
            "type": "number",
            "description": "UTC Unix seconds, potentially fractional."
          },
          "elapsed_seconds": {
            "type": "number"
          },
          "legs_completed": {
            "type": "integer"
          },
          "legs_expected": {
            "type": "integer"
          },
          "failed_leg_index": {
            "type": "integer"
          },
          "reason": {
            "type": "string"
          },
          "result_source": {
            "type": "string"
          },
          "last_recorded_leg_end": {
            "type": "number",
            "description": "UTC Unix seconds, potentially fractional."
          },
          "overall_order": {
            "type": "integer"
          },
          "position": {
            "type": "integer",
            "description": "Fleet-relative position within this race, independent of page order."
          },
          "finish_time_local": {
            "$ref": "#/components/schemas/LocalTime"
          },
          "last_recorded_leg_end_local": {
            "$ref": "#/components/schemas/LocalTime"
          },
          "requested_leg": {
            "type": "object",
            "properties": {
              "leg_index": {
                "type": "integer"
              },
              "time_range": {
                "$ref": "#/components/schemas/EpochWindow"
              },
              "metrics": {
                "type": "object",
                "properties": {},
                "additionalProperties": true,
                "description": "Saved leg metrics. Keys depend on artifact version; units are supplied alongside metrics."
              }
            },
            "additionalProperties": true
          }
        },
        "additionalProperties": true,
        "required": [
          "boat_id",
          "status",
          "legs_completed",
          "legs_expected"
        ]
      },
      "RaceResultsPage": {
        "type": "object",
        "properties": {
          "schema_version": {
            "type": "string",
            "enum": [
              "subscriber_saved_analysis_v1"
            ]
          },
          "session_id": {
            "type": "integer",
            "minimum": 1
          },
          "scope_id": {
            "type": "string"
          },
          "snapshot": {
            "$ref": "#/components/schemas/AnalysisSnapshot"
          },
          "fleet_count": {
            "type": "integer"
          },
          "next_before_boat_id": {
            "type": "integer",
            "nullable": true
          },
          "paging_order": {
            "type": "string",
            "enum": [
              "boat_id_descending"
            ]
          },
          "scope": {
            "type": "string",
            "enum": [
              "within_this_race_only"
            ]
          },
          "model_called": {
            "type": "boolean",
            "enum": [
              false
            ]
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RaceResult"
            }
          },
          "summary": {
            "type": "object",
            "properties": {
              "boat_count": {
                "type": "integer"
              },
              "finish_count": {
                "type": "integer"
              },
              "partial_count": {
                "type": "integer"
              },
              "not_started_count": {
                "type": "integer"
              },
              "excluded_count": {
                "type": "integer"
              },
              "other_count": {
                "type": "integer"
              },
              "requested_leg_index": {
                "type": "integer",
                "nullable": true
              }
            },
            "additionalProperties": true
          }
        },
        "additionalProperties": true,
        "description": "On an empty continuation page summary may be absent. Positions remain fleet-relative.",
        "required": [
          "schema_version",
          "session_id",
          "scope_id",
          "snapshot",
          "fleet_count",
          "next_before_boat_id",
          "paging_order",
          "scope",
          "model_called",
          "results"
        ]
      },
      "StartStatistics": {
        "type": "object",
        "properties": {
          "boat_id": {
            "type": "string",
            "description": "Decimal session-track ID. Analysis endpoints serialize boat IDs as strings."
          },
          "boat_name": {
            "type": "string"
          },
          "boat_color": {
            "type": "string"
          },
          "start_time": {
            "type": "number",
            "description": "UTC Unix seconds, potentially fractional."
          },
          "cross_time": {
            "type": "number",
            "description": "UTC Unix seconds, potentially fractional."
          },
          "start_time_local": {
            "$ref": "#/components/schemas/LocalTime"
          },
          "cross_time_local": {
            "$ref": "#/components/schemas/LocalTime"
          },
          "finish_position": {
            "type": "integer"
          },
          "finish_status": {
            "type": "string"
          },
          "excluded_from_stats": {
            "type": "boolean"
          },
          "line_end_bucket": {
            "type": "string"
          },
          "tack_at_go": {
            "type": "string"
          },
          "ocs": {
            "type": "object",
            "properties": {
              "status": {
                "type": "string"
              },
              "verdict": {
                "type": "string"
              },
              "over_at_go": {
                "type": "boolean"
              },
              "evidence_kind": {
                "type": "string",
                "nullable": true
              },
              "evidence_version": {
                "type": "string"
              },
              "suppressed": {
                "type": "boolean"
              },
              "first_legal_cross_time": {
                "type": "number",
                "nullable": true
              },
              "cleared_time": {
                "type": "number",
                "nullable": true
              }
            },
            "additionalProperties": true,
            "description": "Saved OCS evidence/verdict. Additional raw-coverage and exclusion fields depend on the artifact."
          },
          "calculation_basis": {
            "type": "object",
            "properties": {},
            "additionalProperties": true,
            "description": "Saved computation provenance for these start metrics."
          },
          "start_type": {
            "type": "string"
          },
          "start_type_source": {
            "type": "string"
          },
          "windward_progress_m": {
            "type": "object",
            "additionalProperties": {
              "type": "number",
              "nullable": true
            },
            "description": "Metric/horizon name to numeric value; unavailable values may be null."
          },
          "mark_one_progress_m": {
            "type": "object",
            "additionalProperties": {
              "type": "number",
              "nullable": true
            },
            "description": "Metric/horizon name to numeric value; unavailable values may be null."
          },
          "reach_favored_end": {
            "type": "string"
          },
          "metrics": {
            "type": "object",
            "additionalProperties": {
              "type": "number",
              "nullable": true
            },
            "description": "Metric/horizon name to numeric value; unavailable values may be null."
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            },
            "description": "Metric name to its unit."
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "line_position_pct": {
            "type": "number"
          },
          "line_projection_pct_unclamped": {
            "type": "number"
          },
          "line_position_bias_vs_midline_m": {
            "type": "number"
          },
          "signed_distance_to_line_at_go_m": {
            "type": "number"
          },
          "distance_to_line_at_go_m": {
            "type": "number"
          },
          "time_late_to_cross_s": {
            "type": "number"
          },
          "sog_at_go_kt": {
            "type": "number"
          },
          "sog_15s_after_go_kt": {
            "type": "number"
          },
          "elapsed_seconds": {
            "type": "number"
          },
          "mark_one_distance_at_go_m": {
            "type": "number"
          },
          "reach_line_position_bias_m": {
            "type": "number"
          },
          "reach_favored_end_advantage_m": {
            "type": "number"
          }
        },
        "additionalProperties": true,
        "description": "Absent metrics are omitted, not zero. Reaching starts can omit windward-referenced fields.",
        "required": [
          "boat_id"
        ]
      },
      "StartStatisticsPage": {
        "type": "object",
        "properties": {
          "schema_version": {
            "type": "string",
            "enum": [
              "subscriber_saved_analysis_v1"
            ]
          },
          "session_id": {
            "type": "integer",
            "minimum": 1
          },
          "scope_id": {
            "type": "string"
          },
          "snapshot": {
            "$ref": "#/components/schemas/AnalysisSnapshot"
          },
          "fleet_count": {
            "type": "integer"
          },
          "next_before_boat_id": {
            "type": "integer",
            "nullable": true
          },
          "paging_order": {
            "type": "string",
            "enum": [
              "boat_id_descending"
            ]
          },
          "scope": {
            "type": "string",
            "enum": [
              "within_this_race_only"
            ]
          },
          "model_called": {
            "type": "boolean",
            "enum": [
              false
            ]
          },
          "start_stats": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/StartStatistics"
            }
          },
          "start_line": {
            "type": "object",
            "properties": {
              "available": {
                "type": "boolean"
              },
              "unavailable_reason": {
                "type": "string",
                "nullable": true
              },
              "at_time": {
                "type": "number",
                "description": "UTC Unix seconds, potentially fractional."
              },
              "pin": {
                "type": "object",
                "properties": {},
                "additionalProperties": true
              },
              "committee": {
                "type": "object",
                "properties": {},
                "additionalProperties": true
              },
              "center": {
                "type": "object",
                "properties": {},
                "additionalProperties": true
              },
              "length_m": {
                "type": "number"
              },
              "bearing_pin_to_committee_deg": {
                "type": "number"
              },
              "wind_direction_deg": {
                "type": "number"
              },
              "favored_end": {
                "type": "string"
              },
              "favored_end_bias_m": {
                "type": "number"
              },
              "start_type": {
                "type": "string"
              }
            },
            "additionalProperties": true,
            "nullable": true
          },
          "summary": {
            "type": "object",
            "properties": {},
            "additionalProperties": true
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            },
            "description": "Metric name to its unit."
          },
          "missing_boat_ids": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "Decimal session-track ID. Analysis endpoints serialize boat IDs as strings."
            }
          }
        },
        "additionalProperties": true,
        "description": "An empty page may omit start_line/summary/units. Start-line geometry and evidence are extensible saved-artifact fields.",
        "required": [
          "schema_version",
          "session_id",
          "scope_id",
          "snapshot",
          "fleet_count",
          "next_before_boat_id",
          "paging_order",
          "scope",
          "model_called",
          "start_stats"
        ]
      },
      "MeasuredMetric": {
        "type": "object",
        "properties": {
          "value": {
            "type": "number",
            "nullable": true
          },
          "unit": {
            "type": "string"
          },
          "reason": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": true,
        "required": [
          "value",
          "unit",
          "reason"
        ]
      },
      "Statistic": {
        "type": "object",
        "properties": {
          "value": {
            "type": "number",
            "nullable": true
          },
          "measured_count": {
            "type": "integer"
          },
          "selected_count": {
            "type": "integer"
          },
          "statistic": {
            "type": "string"
          }
        },
        "additionalProperties": true,
        "required": [
          "value",
          "measured_count",
          "selected_count",
          "statistic"
        ]
      },
      "ManeuverLoss": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "nullable": true
          },
          "qualifying_count": {
            "type": "integer"
          },
          "measured_count": {
            "type": "integer"
          },
          "unavailable_loss_count": {
            "type": "integer"
          },
          "minimum_count": {
            "type": "integer"
          },
          "median_loss_m": {
            "type": "number",
            "nullable": true
          },
          "reason": {
            "type": "string",
            "nullable": true
          },
          "basis": {
            "type": "string"
          }
        },
        "additionalProperties": true,
        "required": [
          "type",
          "qualifying_count",
          "measured_count",
          "unavailable_loss_count",
          "minimum_count",
          "median_loss_m",
          "reason",
          "basis"
        ]
      },
      "MarkPassage": {
        "type": "object",
        "properties": {
          "available": {
            "type": "boolean"
          },
          "time": {
            "type": "number",
            "nullable": true
          },
          "reason": {
            "type": "string",
            "nullable": true
          },
          "basis": {
            "type": "string"
          },
          "scope_id": {
            "type": "string"
          },
          "leg_index": {
            "type": "integer"
          },
          "mark_ids": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "rounding_ids": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "quality": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {},
              "additionalProperties": true,
              "description": "Saved mark-passage quality metadata."
            }
          }
        },
        "additionalProperties": true,
        "required": [
          "available",
          "time",
          "reason",
          "basis"
        ]
      },
      "PassageInterval": {
        "type": "object",
        "properties": {
          "boat_id": {
            "type": "string",
            "description": "Decimal session-track ID. Analysis endpoints serialize boat IDs as strings."
          },
          "entry": {
            "$ref": "#/components/schemas/MarkPassage"
          },
          "exit": {
            "$ref": "#/components/schemas/MarkPassage"
          },
          "available": {
            "type": "boolean"
          },
          "reason": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": true,
        "required": [
          "boat_id",
          "entry",
          "exit",
          "available",
          "reason"
        ]
      },
      "LegPassages": {
        "type": "object",
        "properties": {
          "leg_index": {
            "type": "integer"
          },
          "scope_id": {
            "type": "string"
          },
          "direction": {
            "type": "string",
            "nullable": true
          },
          "is_reach": {
            "type": "boolean",
            "nullable": true
          },
          "subject": {
            "$ref": "#/components/schemas/PassageInterval"
          },
          "pairs": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "peer_id": {
                  "type": "string",
                  "description": "Decimal session-track ID. Analysis endpoints serialize boat IDs as strings."
                },
                "available": {
                  "type": "boolean"
                },
                "reason": {
                  "type": "string",
                  "nullable": true
                },
                "entry_gap_s": {
                  "type": "number",
                  "nullable": true
                },
                "exit_gap_s": {
                  "type": "number",
                  "nullable": true
                },
                "gap_change_s": {
                  "type": "number",
                  "nullable": true
                },
                "peer": {
                  "$ref": "#/components/schemas/PassageInterval"
                }
              },
              "additionalProperties": true,
              "required": [
                "peer_id",
                "available",
                "reason",
                "entry_gap_s",
                "exit_gap_s",
                "gap_change_s",
                "peer"
              ]
            }
          },
          "exit_gaps": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "peer_id": {
                  "type": "string",
                  "description": "Decimal session-track ID. Analysis endpoints serialize boat IDs as strings."
                },
                "gap_s": {
                  "type": "number",
                  "nullable": true
                },
                "reason": {
                  "type": "string",
                  "nullable": true
                }
              },
              "additionalProperties": true,
              "required": [
                "peer_id",
                "gap_s",
                "reason"
              ]
            }
          },
          "subject_order_at_entry": {
            "type": "object",
            "properties": {
              "position": {
                "type": "integer",
                "nullable": true
              },
              "measured_boats": {
                "type": "integer"
              },
              "fleet_boats": {
                "type": "integer"
              },
              "tied_boats": {
                "type": "integer"
              },
              "basis": {
                "type": "string"
              },
              "reason": {
                "type": "string",
                "nullable": true
              }
            },
            "additionalProperties": true,
            "nullable": true
          },
          "subject_order_at_exit": {
            "type": "object",
            "properties": {
              "position": {
                "type": "integer",
                "nullable": true
              },
              "measured_boats": {
                "type": "integer"
              },
              "fleet_boats": {
                "type": "integer"
              },
              "tied_boats": {
                "type": "integer"
              },
              "basis": {
                "type": "string"
              },
              "reason": {
                "type": "string",
                "nullable": true
              }
            },
            "additionalProperties": true,
            "nullable": true
          },
          "median_paired_change_s": {
            "type": "number",
            "nullable": true
          },
          "peers_requested": {
            "type": "integer"
          },
          "peers_selected": {
            "type": "integer"
          },
          "peers_measured": {
            "type": "integer"
          },
          "coverage": {
            "type": "object",
            "properties": {
              "eligible_count": {
                "type": "integer"
              },
              "measured_count": {
                "type": "integer"
              },
              "unavailable_count": {
                "type": "integer"
              },
              "excluded_count": {
                "type": "integer"
              },
              "unavailable_reasons": {
                "type": "object",
                "additionalProperties": {
                  "type": "integer"
                }
              }
            },
            "additionalProperties": true
          },
          "complete_peer_coverage": {
            "type": "boolean"
          },
          "basis": {
            "type": "string"
          },
          "raw_gps_coverage_verified": {
            "type": "boolean"
          }
        },
        "additionalProperties": true,
        "required": [
          "leg_index",
          "scope_id",
          "direction",
          "is_reach",
          "subject",
          "pairs",
          "exit_gaps",
          "subject_order_at_entry",
          "subject_order_at_exit",
          "median_paired_change_s",
          "peers_requested",
          "peers_selected",
          "peers_measured",
          "coverage",
          "complete_peer_coverage",
          "basis",
          "raw_gps_coverage_verified"
        ]
      },
      "BoatLegFacts": {
        "type": "object",
        "properties": {
          "boat_id": {
            "type": "string",
            "description": "Decimal session-track ID. Analysis endpoints serialize boat IDs as strings."
          },
          "time_range": {
            "type": "object",
            "properties": {
              "start": {
                "type": "number",
                "nullable": true
              },
              "end": {
                "type": "number",
                "nullable": true
              },
              "end_precise": {
                "type": "number",
                "nullable": true
              }
            },
            "additionalProperties": true,
            "description": "UTC Unix seconds; missing boundaries may be null.",
            "nullable": true
          },
          "reason": {
            "type": "string",
            "nullable": true
          },
          "metrics": {
            "type": "object",
            "properties": {
              "avg_sog_kt": {
                "$ref": "#/components/schemas/MeasuredMetric"
              },
              "avg_mark_vmg_kt": {
                "$ref": "#/components/schemas/MeasuredMetric"
              },
              "avg_vmg_kt": {
                "$ref": "#/components/schemas/MeasuredMetric"
              },
              "distance_m": {
                "$ref": "#/components/schemas/MeasuredMetric"
              },
              "duration_seconds": {
                "$ref": "#/components/schemas/MeasuredMetric"
              }
            },
            "additionalProperties": true,
            "required": [
              "avg_sog_kt",
              "avg_mark_vmg_kt",
              "avg_vmg_kt",
              "distance_m",
              "duration_seconds"
            ]
          },
          "maneuver_loss": {
            "$ref": "#/components/schemas/ManeuverLoss"
          },
          "maneuvers": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "maneuver_id": {
                  "type": "string"
                },
                "boat_id": {
                  "type": "string",
                  "description": "Decimal session-track ID. Analysis endpoints serialize boat IDs as strings."
                },
                "time": {
                  "type": "number",
                  "description": "UTC Unix seconds, potentially fractional."
                },
                "type": {
                  "type": "string",
                  "enum": [
                    "tack",
                    "gybe"
                  ]
                },
                "loss_m": {
                  "type": "number",
                  "nullable": true
                }
              },
              "additionalProperties": true
            }
          }
        },
        "additionalProperties": true,
        "description": "maneuvers is an optional newer field; older deployed responses may omit it.",
        "required": [
          "boat_id",
          "time_range",
          "reason",
          "metrics",
          "maneuver_loss"
        ]
      },
      "LegFacts": {
        "type": "object",
        "properties": {
          "leg_index": {
            "type": "integer"
          },
          "scope_id": {
            "type": "string"
          },
          "snapshot_ref": {
            "type": "string",
            "description": "Opaque content/snapshot digest; compare for equality, do not interpret."
          },
          "passages": {
            "$ref": "#/components/schemas/LegPassages"
          },
          "boats": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BoatLegFacts"
            }
          },
          "peer_summary": {
            "type": "object",
            "properties": {
              "metrics": {
                "type": "object",
                "properties": {
                  "avg_sog_kt": {
                    "$ref": "#/components/schemas/Statistic"
                  },
                  "avg_mark_vmg_kt": {
                    "$ref": "#/components/schemas/Statistic"
                  },
                  "avg_vmg_kt": {
                    "$ref": "#/components/schemas/Statistic"
                  },
                  "distance_m": {
                    "$ref": "#/components/schemas/Statistic"
                  },
                  "duration_seconds": {
                    "$ref": "#/components/schemas/Statistic"
                  }
                },
                "additionalProperties": true
              },
              "maneuver_loss": {
                "$ref": "#/components/schemas/Statistic"
              },
              "exit_gap": {
                "$ref": "#/components/schemas/Statistic"
              }
            },
            "additionalProperties": true
          }
        },
        "additionalProperties": true,
        "required": [
          "leg_index",
          "scope_id",
          "snapshot_ref",
          "passages",
          "boats",
          "peer_summary"
        ]
      },
      "RaceFacts": {
        "type": "object",
        "properties": {
          "schema_version": {
            "type": "string",
            "enum": [
              "race_debrief_facts_v1"
            ]
          },
          "session_id": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "ready"
            ]
          },
          "snapshot": {
            "$ref": "#/components/schemas/AnalysisSnapshot"
          },
          "scope": {
            "type": "object",
            "properties": {
              "kind": {
                "type": "string",
                "enum": [
                  "race"
                ]
              },
              "id": {
                "type": "string"
              },
              "label": {
                "type": "string",
                "nullable": true
              },
              "leg_index": {
                "type": "integer",
                "nullable": true
              }
            },
            "additionalProperties": true,
            "required": [
              "kind",
              "id",
              "label",
              "leg_index"
            ]
          },
          "comparison": {
            "type": "object",
            "properties": {
              "policy": {
                "type": "string",
                "enum": [
                  "named_rival",
                  "leading_finishers"
                ]
              },
              "subject_id": {
                "type": "string",
                "description": "Decimal session-track ID. Analysis endpoints serialize boat IDs as strings."
              },
              "boat_ids": {
                "type": "array",
                "items": {
                  "type": "string",
                  "description": "Decimal session-track ID. Analysis endpoints serialize boat IDs as strings."
                }
              },
              "peers_requested": {
                "type": "integer"
              },
              "peers_selected": {
                "type": "integer"
              },
              "reason": {
                "type": "string",
                "nullable": true
              },
              "selection_basis": {
                "type": "string"
              },
              "tie_policy": {
                "type": "string"
              }
            },
            "additionalProperties": true,
            "required": [
              "policy",
              "subject_id",
              "boat_ids",
              "peers_requested",
              "peers_selected"
            ]
          },
          "participants": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "boat_id": {
                  "type": "string",
                  "description": "Decimal session-track ID. Analysis endpoints serialize boat IDs as strings."
                },
                "name": {
                  "type": "string",
                  "nullable": true
                },
                "role": {
                  "type": "string"
                },
                "comparison_color": {
                  "type": "string"
                }
              },
              "additionalProperties": true,
              "required": [
                "boat_id",
                "name",
                "role",
                "comparison_color"
              ]
            }
          },
          "fleet_count": {
            "type": "integer"
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "boat_id": {
                  "type": "string",
                  "description": "Decimal session-track ID. Analysis endpoints serialize boat IDs as strings."
                },
                "position": {
                  "type": "integer",
                  "description": "Fleet-relative position within this race, independent of page order."
                },
                "status": {
                  "type": "string",
                  "description": "Recorded/inferred completion status, e.g. finished, partial, not_started, excluded or unknown."
                },
                "finish_time": {
                  "type": "number",
                  "description": "UTC Unix seconds, potentially fractional."
                },
                "elapsed_seconds": {
                  "type": "number"
                },
                "result_source": {
                  "type": "string"
                },
                "reason": {
                  "type": "string"
                }
              },
              "additionalProperties": true,
              "required": [
                "boat_id",
                "status"
              ]
            }
          },
          "legs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LegFacts"
            }
          },
          "availability": {
            "type": "object",
            "properties": {
              "geometry": {
                "type": "string"
              },
              "actions": {
                "type": "string"
              },
              "raw_gps": {
                "type": "string"
              }
            },
            "additionalProperties": true,
            "required": [
              "geometry",
              "actions",
              "raw_gps"
            ]
          }
        },
        "additionalProperties": true,
        "required": [
          "schema_version",
          "session_id",
          "status",
          "snapshot",
          "scope",
          "comparison",
          "participants",
          "fleet_count",
          "results",
          "legs",
          "availability"
        ]
      },
      "FloConversation": {
        "type": "object",
        "properties": {
          "conversation_id": {
            "type": "integer",
            "minimum": 1
          },
          "session_id": {
            "type": "integer",
            "minimum": 1
          },
          "available_credit_microunits": {
            "type": "integer"
          },
          "max_turn_credit_microunits": {
            "type": "integer"
          },
          "unknown_usage_charge_policy": {
            "type": "string",
            "enum": [
              "declared_dispatched_call_maximum"
            ]
          },
          "integration_history_only": {
            "type": "boolean",
            "enum": [
              true
            ]
          }
        },
        "additionalProperties": true,
        "required": [
          "conversation_id",
          "session_id",
          "available_credit_microunits",
          "max_turn_credit_microunits",
          "unknown_usage_charge_policy",
          "integration_history_only"
        ]
      },
      "FloCitation": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "scope_id": {
            "type": "string"
          },
          "session_id": {
            "type": "integer",
            "minimum": 1
          },
          "snapshot_ref": {
            "type": "string",
            "description": "Opaque content/snapshot digest; compare for equality, do not interpret."
          }
        },
        "additionalProperties": true,
        "description": "Evidence reference for the answer; extra fields depend on the tool/citation kind."
      },
      "FloTurn": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "conversation_id": {
            "type": "integer",
            "minimum": 1
          },
          "session_id": {
            "type": "integer",
            "minimum": 1
          },
          "status": {
            "type": "string",
            "enum": [
              "queued",
              "running",
              "completed",
              "failed",
              "canceled"
            ]
          },
          "cancel_requested": {
            "type": "boolean"
          },
          "reserved_credit_microunits": {
            "type": "integer"
          },
          "charged_credit_microunits": {
            "type": "integer"
          },
          "usage": {
            "type": "object",
            "properties": {
              "model_calls": {
                "type": "integer"
              },
              "prompt_tokens": {
                "type": "integer"
              },
              "completion_tokens": {
                "type": "integer"
              },
              "source_bytes_reserved": {
                "type": "integer"
              }
            },
            "additionalProperties": true,
            "description": "Recorded usage fields; queued turns can have an empty object."
          },
          "answer": {
            "type": "string",
            "nullable": true
          },
          "answer_format": {
            "type": "string",
            "enum": [
              "plain_text"
            ]
          },
          "citations": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FloCitation"
            }
          },
          "error": {
            "type": "string",
            "nullable": true
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "settled_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "prompt": {
            "type": "string",
            "description": "Only included in conversation history."
          }
        },
        "additionalProperties": true,
        "required": [
          "id",
          "conversation_id",
          "session_id",
          "status",
          "cancel_requested",
          "reserved_credit_microunits",
          "charged_credit_microunits",
          "usage",
          "answer",
          "answer_format",
          "citations",
          "error",
          "expires_at",
          "settled_at"
        ]
      },
      "FloHistory": {
        "type": "object",
        "properties": {
          "conversation_id": {
            "type": "integer",
            "minimum": 1
          },
          "session_id": {
            "type": "integer",
            "minimum": 1
          },
          "available_credit_microunits": {
            "type": "integer"
          },
          "max_turn_credit_microunits": {
            "type": "integer"
          },
          "unknown_usage_charge_policy": {
            "type": "string",
            "enum": [
              "declared_dispatched_call_maximum"
            ]
          },
          "integration_history_only": {
            "type": "boolean",
            "enum": [
              true
            ]
          },
          "turns": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FloTurn"
            }
          }
        },
        "additionalProperties": true,
        "required": [
          "conversation_id",
          "session_id",
          "available_credit_microunits",
          "max_turn_credit_microunits",
          "unknown_usage_charge_policy",
          "integration_history_only",
          "turns"
        ]
      },
      "SessionImportResult": {
        "type": "object",
        "properties": {
          "session_id": {
            "type": "integer",
            "minimum": 1
          },
          "wind_version": {
            "type": "string",
            "description": "Opaque content/snapshot digest; compare for equality, do not interpret."
          },
          "completed": {
            "type": "boolean",
            "enum": [
              true
            ]
          }
        },
        "additionalProperties": true,
        "required": [
          "session_id",
          "wind_version",
          "completed"
        ]
      },
      "TrackImportResult": {
        "type": "object",
        "properties": {
          "session_id": {
            "type": "integer",
            "minimum": 1
          },
          "session_track_id": {
            "type": "integer",
            "minimum": 1
          },
          "manual_track_id": {
            "type": "integer",
            "minimum": 1
          },
          "points_sha256": {
            "type": "string",
            "description": "Opaque content/snapshot digest; compare for equality, do not interpret."
          },
          "point_count": {
            "type": "integer",
            "minimum": 2
          },
          "already_attached": {
            "type": "boolean"
          },
          "compute_requested": {
            "type": "boolean",
            "enum": [
              false
            ]
          },
          "completed": {
            "type": "boolean",
            "enum": [
              true
            ]
          }
        },
        "additionalProperties": true,
        "required": [
          "session_id",
          "session_track_id",
          "manual_track_id",
          "points_sha256",
          "point_count",
          "already_attached",
          "compute_requested",
          "completed"
        ]
      },
      "WindImportResult": {
        "type": "object",
        "properties": {
          "session_id": {
            "type": "integer",
            "minimum": 1
          },
          "wind_version": {
            "type": "string",
            "description": "Opaque content/snapshot digest; compare for equality, do not interpret."
          },
          "observation_count": {
            "type": "integer"
          },
          "compute_requested": {
            "type": "boolean",
            "enum": [
              false
            ]
          },
          "completed": {
            "type": "boolean",
            "enum": [
              true
            ]
          }
        },
        "additionalProperties": true,
        "required": [
          "session_id",
          "wind_version",
          "observation_count",
          "compute_requested",
          "completed"
        ]
      },
      "SetupInquiryResult": {
        "type": "object",
        "properties": {
          "session_id": {
            "type": "integer",
            "minimum": 1
          },
          "staff_request_id": {
            "type": "integer",
            "minimum": 1
          },
          "status": {
            "type": "string"
          },
          "automated_preparation": {
            "type": "boolean",
            "enum": [
              false
            ]
          },
          "completed": {
            "type": "boolean",
            "enum": [
              true
            ]
          }
        },
        "additionalProperties": true,
        "required": [
          "session_id",
          "staff_request_id",
          "status",
          "automated_preparation",
          "completed"
        ]
      },
      "SessionImportReceipt": {
        "type": "object",
        "properties": {
          "receipt_id": {
            "type": "integer",
            "minimum": 1
          },
          "operation": {
            "type": "string",
            "enum": [
              "session"
            ]
          },
          "initiator_user_id": {
            "type": "integer",
            "minimum": 1
          },
          "source_sha256": {
            "type": "string",
            "nullable": true
          },
          "result": {
            "$ref": "#/components/schemas/SessionImportResult"
          }
        },
        "additionalProperties": true,
        "required": [
          "receipt_id",
          "operation",
          "initiator_user_id",
          "source_sha256",
          "result"
        ]
      },
      "TrackImportReceipt": {
        "type": "object",
        "properties": {
          "receipt_id": {
            "type": "integer",
            "minimum": 1
          },
          "operation": {
            "type": "string",
            "enum": [
              "track"
            ]
          },
          "initiator_user_id": {
            "type": "integer",
            "minimum": 1
          },
          "source_sha256": {
            "type": "string",
            "nullable": true
          },
          "result": {
            "$ref": "#/components/schemas/TrackImportResult"
          }
        },
        "additionalProperties": true,
        "required": [
          "receipt_id",
          "operation",
          "initiator_user_id",
          "source_sha256",
          "result"
        ]
      },
      "WindImportReceipt": {
        "type": "object",
        "properties": {
          "receipt_id": {
            "type": "integer",
            "minimum": 1
          },
          "operation": {
            "type": "string",
            "enum": [
              "wind"
            ]
          },
          "initiator_user_id": {
            "type": "integer",
            "minimum": 1
          },
          "source_sha256": {
            "type": "string",
            "nullable": true
          },
          "result": {
            "$ref": "#/components/schemas/WindImportResult"
          }
        },
        "additionalProperties": true,
        "required": [
          "receipt_id",
          "operation",
          "initiator_user_id",
          "source_sha256",
          "result"
        ]
      },
      "SetupInquiryReceipt": {
        "type": "object",
        "properties": {
          "receipt_id": {
            "type": "integer",
            "minimum": 1
          },
          "operation": {
            "type": "string",
            "enum": [
              "inquiry"
            ]
          },
          "initiator_user_id": {
            "type": "integer",
            "minimum": 1
          },
          "source_sha256": {
            "type": "string",
            "nullable": true
          },
          "result": {
            "$ref": "#/components/schemas/SetupInquiryResult"
          }
        },
        "additionalProperties": true,
        "required": [
          "receipt_id",
          "operation",
          "initiator_user_id",
          "source_sha256",
          "result"
        ]
      },
      "ImportReceipt": {
        "oneOf": [
          {
            "allOf": [
              {
                "$ref": "#/components/schemas/SessionImportReceipt"
              },
              {
                "type": "object",
                "properties": {
                  "created_at": {
                    "type": "string",
                    "format": "date-time"
                  }
                },
                "additionalProperties": true,
                "required": [
                  "created_at"
                ]
              }
            ]
          },
          {
            "allOf": [
              {
                "$ref": "#/components/schemas/TrackImportReceipt"
              },
              {
                "type": "object",
                "properties": {
                  "created_at": {
                    "type": "string",
                    "format": "date-time"
                  }
                },
                "additionalProperties": true,
                "required": [
                  "created_at"
                ]
              }
            ]
          },
          {
            "allOf": [
              {
                "$ref": "#/components/schemas/WindImportReceipt"
              },
              {
                "type": "object",
                "properties": {
                  "created_at": {
                    "type": "string",
                    "format": "date-time"
                  }
                },
                "additionalProperties": true,
                "required": [
                  "created_at"
                ]
              }
            ]
          },
          {
            "allOf": [
              {
                "$ref": "#/components/schemas/SetupInquiryReceipt"
              },
              {
                "type": "object",
                "properties": {
                  "created_at": {
                    "type": "string",
                    "format": "date-time"
                  }
                },
                "additionalProperties": true,
                "required": [
                  "created_at"
                ]
              }
            ]
          }
        ]
      },
      "WindVersion": {
        "type": "object",
        "properties": {
          "session_id": {
            "type": "integer",
            "minimum": 1
          },
          "wind_version": {
            "type": "string",
            "description": "Opaque content/snapshot digest; compare for equality, do not interpret."
          }
        },
        "additionalProperties": true,
        "required": [
          "session_id",
          "wind_version"
        ]
      },
      "ComputeRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "status": {
            "type": "string",
            "enum": [
              "queued",
              "dispatched",
              "unknown",
              "completed",
              "reused",
              "failed"
            ]
          },
          "error": {
            "type": "string",
            "nullable": true
          },
          "source_revision": {
            "type": "string",
            "description": "Opaque content/snapshot digest; compare for equality, do not interpret."
          },
          "dispatched_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "accepted_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "completed_at": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "queue_expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "overdue": {
            "type": "boolean"
          },
          "same_key_retry_safe": {
            "type": "boolean",
            "enum": [
              true
            ]
          },
          "dispatch_retry_allowed": {
            "type": "boolean"
          },
          "publication_fenced": {
            "type": "boolean"
          }
        },
        "additionalProperties": true,
        "required": [
          "id",
          "status",
          "error",
          "source_revision",
          "dispatched_at",
          "accepted_at",
          "completed_at",
          "queue_expires_at",
          "overdue",
          "same_key_retry_safe",
          "dispatch_retry_allowed",
          "publication_fenced"
        ]
      },
      "ComputeReceipt": {
        "type": "object",
        "properties": {
          "session_id": {
            "type": "integer",
            "minimum": 1
          },
          "request": {
            "$ref": "#/components/schemas/ComputeRequest"
          }
        },
        "additionalProperties": true,
        "required": [
          "session_id",
          "request"
        ]
      },
      "ComputeStatus": {
        "type": "object",
        "properties": {
          "session_id": {
            "type": "integer",
            "minimum": 1
          },
          "compute_status": {
            "type": "object",
            "properties": {
              "state": {
                "type": "string",
                "enum": [
                  "ready",
                  "computing",
                  "recomputing",
                  "stale",
                  "absent"
                ]
              },
              "computed_at": {
                "type": "string",
                "format": "date-time",
                "nullable": true
              },
              "invoked_at": {
                "type": "string",
                "format": "date-time",
                "nullable": true
              },
              "last_attempt_failed": {
                "type": "boolean"
              },
              "can_retry": {
                "type": "boolean"
              }
            },
            "additionalProperties": true,
            "required": [
              "state",
              "computed_at",
              "invoked_at",
              "last_attempt_failed",
              "can_retry"
            ]
          },
          "request": {
            "type": "object",
            "properties": {
              "id": {
                "type": "integer",
                "minimum": 1
              },
              "status": {
                "type": "string",
                "enum": [
                  "queued",
                  "dispatched",
                  "unknown",
                  "completed",
                  "reused",
                  "failed"
                ]
              },
              "error": {
                "type": "string",
                "nullable": true
              },
              "source_revision": {
                "type": "string",
                "description": "Opaque content/snapshot digest; compare for equality, do not interpret."
              },
              "dispatched_at": {
                "type": "string",
                "format": "date-time",
                "nullable": true
              },
              "accepted_at": {
                "type": "string",
                "format": "date-time",
                "nullable": true
              },
              "completed_at": {
                "type": "string",
                "format": "date-time",
                "nullable": true
              },
              "queue_expires_at": {
                "type": "string",
                "format": "date-time"
              },
              "overdue": {
                "type": "boolean"
              },
              "same_key_retry_safe": {
                "type": "boolean",
                "enum": [
                  true
                ]
              },
              "dispatch_retry_allowed": {
                "type": "boolean"
              },
              "publication_fenced": {
                "type": "boolean"
              }
            },
            "additionalProperties": true,
            "required": [
              "id",
              "status",
              "error",
              "source_revision",
              "dispatched_at",
              "accepted_at",
              "completed_at",
              "queue_expires_at",
              "overdue",
              "same_key_retry_safe",
              "dispatch_retry_allowed",
              "publication_fenced"
            ],
            "nullable": true
          },
          "result_data_path": {
            "type": "string",
            "description": "Relative subscriber API path. This path does not independently grant access."
          },
          "poll_after_seconds": {
            "type": "integer",
            "enum": [
              30
            ]
          },
          "publication_fenced": {
            "type": "boolean"
          }
        },
        "additionalProperties": true,
        "required": [
          "session_id",
          "compute_status",
          "request",
          "result_data_path",
          "poll_after_seconds",
          "publication_fenced"
        ]
      }
    }
  }
}
