MarineVerse AI

MarineVerse AI · GPT-Aktionen

MarineVerse API V3

MarineVerse API v3 documentation.

  • GET /api/v3/globe_boatsGet all boats owned by or crewed by the current user
  • GET /api/v3/globe_boats/{uuid}Get details for a specific boat
  • GET /api/v3/globe_boats/{uuid}/proximity_infoGet proximity information (closest port and land) for a boat
  • GET /api/v3/globe_boats/{uuid}/port_historyGet port visit history for a boat
  • GET /api/v3/globe_boats/{uuid}/travel_statsGet travel statistics for a boat
  • GET /api/v3/sailing_progressGet sailing progress for the current user
  • GET /api/v3/users/meGet the current user profile
Ursprüngliches API-Schema
{
  "openapi": "3.1.0",
  "info": {
    "title": "MarineVerse API V3",
    "version": "v3",
    "description": "MarineVerse API v3 documentation."
  },
  "servers": [
    {
      "url": "https://api.marineverse.com"
    },
    {
      "url": "http://localhost:3000"
    }
  ],
  "components": {
    "securitySchemes": {
      "OAuth2": {
        "type": "oauth2",
        "flows": {
          "authorizationCode": {
            "authorizationUrl": "https://www.marineverse.com/oauth/authorize",
            "tokenUrl": "https://api.marineverse.com/oauth/token",
            "refreshUrl": "https://api.marineverse.com/oauth/token",
            "scopes": {
              "public": "Basic public access.",
              "sailing_cv": "Read sailing tutorial progress and CV data.",
              "globe_read": "Read MarineVerse Globe boat data."
            }
          }
        },
        "x-tokenEndpointAuthMethodsSupported": [
          "none"
        ],
        "x-revocationEndpoint": "https://api.marineverse.com/oauth/revoke",
        "x-responseTypesSupported": [
          "code"
        ],
        "x-codeChallengeMethodsSupported": [
          "S256",
          "plain"
        ],
        "x-issuer": "https://api.marineverse.com"
      }
    },
    "schemas": {
      "ErrorResponse": {
        "type": "object",
        "properties": {
          "error": {
            "type": "string"
          }
        },
        "required": [
          "error"
        ]
      },
      "SailingTutorialProgress": {
        "type": "object",
        "properties": {
          "yacht_tutorial_basics_started_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date_time"
          },
          "yacht_tutorial_basics_finished_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date_time"
          },
          "yacht_tutorial_steering_started_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date_time"
          },
          "yacht_tutorial_steering_finished_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date_time"
          },
          "yacht_tutorial_wind_direction_started_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date_time"
          },
          "yacht_tutorial_wind_direction_finished_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date_time"
          },
          "yacht_tutorial_sailing_terms_started_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date_time"
          },
          "yacht_tutorial_sailing_terms_finished_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date_time"
          },
          "yacht_tutorial_upwind_started_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date_time"
          },
          "yacht_tutorial_upwind_finished_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date_time"
          },
          "yacht_tutorial_pos_speed_started_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date_time"
          },
          "yacht_tutorial_pos_speed_finished_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date_time"
          },
          "yacht_tutorial_starting_race_started_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date_time"
          },
          "yacht_tutorial_starting_race_finished_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date_time"
          },
          "yacht_tutorial_spinnaker_started_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date_time"
          },
          "yacht_tutorial_spinnaker_finished_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date_time"
          },
          "dinghy_tutorial_basics_started_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date_time"
          },
          "dinghy_tutorial_basics_finished_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date_time"
          },
          "dinghy_tutorial_sailing_terms_started_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date_time"
          },
          "dinghy_tutorial_sailing_terms_finished_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date_time"
          },
          "dinghy_tutorial_going_fast_started_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date_time"
          },
          "dinghy_tutorial_going_fast_finished_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date_time"
          },
          "sailing_ed_self_mastery_started_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date_time"
          },
          "sailing_ed_self_mastery_finished_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date_time"
          }
        },
        "required": [
          "yacht_tutorial_basics_started_at",
          "yacht_tutorial_basics_finished_at",
          "yacht_tutorial_steering_started_at",
          "yacht_tutorial_steering_finished_at",
          "yacht_tutorial_wind_direction_started_at",
          "yacht_tutorial_wind_direction_finished_at",
          "yacht_tutorial_sailing_terms_started_at",
          "yacht_tutorial_sailing_terms_finished_at",
          "yacht_tutorial_upwind_started_at",
          "yacht_tutorial_upwind_finished_at",
          "yacht_tutorial_pos_speed_started_at",
          "yacht_tutorial_pos_speed_finished_at",
          "yacht_tutorial_starting_race_started_at",
          "yacht_tutorial_starting_race_finished_at",
          "yacht_tutorial_spinnaker_started_at",
          "yacht_tutorial_spinnaker_finished_at",
          "dinghy_tutorial_basics_started_at",
          "dinghy_tutorial_basics_finished_at",
          "dinghy_tutorial_sailing_terms_started_at",
          "dinghy_tutorial_sailing_terms_finished_at",
          "dinghy_tutorial_going_fast_started_at",
          "dinghy_tutorial_going_fast_finished_at",
          "sailing_ed_self_mastery_started_at",
          "sailing_ed_self_mastery_finished_at"
        ]
      },
      "SailingProgressResponse": {
        "type": "object",
        "properties": {
          "tutorial": {
            "$ref": "#/components/schemas/SailingTutorialProgress"
          },
          "next_step": {
            "type": [
              "string",
              "null"
            ]
          },
          "yacht_onboarding_progress": {
            "type": [
              "number",
              "null"
            ],
            "format": "float"
          },
          "dinghy_onboarding_progress": {
            "type": [
              "number",
              "null"
            ],
            "format": "float"
          },
          "finished_race": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "display_name": {
            "type": "string"
          },
          "uuid": {
            "type": "string",
            "format": "uuid"
          }
        },
        "required": [
          "tutorial",
          "next_step",
          "yacht_onboarding_progress",
          "dinghy_onboarding_progress",
          "finished_race",
          "display_name",
          "uuid"
        ]
      },
      "UserMeResponse": {
        "type": "object",
        "properties": {
          "display_name": {
            "type": "string"
          },
          "sailing_experience": {
            "type": [
              "string",
              "null"
            ]
          },
          "marineverse_interests": {
            "type": [
              "string",
              "null"
            ]
          },
          "time_zone": {
            "type": [
              "string",
              "null"
            ]
          },
          "country_code": {
            "type": [
              "string",
              "null"
            ]
          },
          "uuid": {
            "type": "string",
            "format": "uuid"
          }
        },
        "required": [
          "display_name",
          "sailing_experience",
          "marineverse_interests",
          "time_zone",
          "country_code",
          "uuid"
        ]
      },
      "BoatSummary": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "uuid": {
            "type": "string",
            "format": "uuid"
          },
          "coordinates": {
            "type": "string"
          },
          "latitude": {
            "type": "number",
            "format": "float"
          },
          "longitude": {
            "type": "number",
            "format": "float"
          },
          "heading": {
            "type": "number",
            "format": "float"
          },
          "location_name": {
            "type": [
              "string",
              "null"
            ]
          },
          "last_speed_kts": {
            "type": [
              "number",
              "null"
            ],
            "format": "float"
          },
          "is_owner": {
            "type": "boolean"
          },
          "is_crew": {
            "type": "boolean"
          }
        },
        "required": [
          "name",
          "uuid",
          "coordinates",
          "latitude",
          "longitude",
          "heading",
          "location_name",
          "last_speed_kts",
          "is_owner",
          "is_crew"
        ]
      },
      "BoatDetails": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "uuid": {
            "type": "string",
            "format": "uuid"
          },
          "coordinates": {
            "type": "string"
          },
          "latitude": {
            "type": "number",
            "format": "float"
          },
          "longitude": {
            "type": "number",
            "format": "float"
          },
          "heading": {
            "type": "number",
            "format": "float"
          },
          "location_name": {
            "type": [
              "string",
              "null"
            ]
          },
          "last_speed_kts": {
            "type": [
              "number",
              "null"
            ],
            "format": "float"
          },
          "mainsail_hoist": {
            "type": [
              "number",
              "null"
            ],
            "format": "float"
          },
          "jib_hoist": {
            "type": [
              "number",
              "null"
            ],
            "format": "float"
          },
          "is_owner": {
            "type": "boolean"
          },
          "is_crew": {
            "type": "boolean"
          }
        },
        "required": [
          "name",
          "uuid",
          "coordinates",
          "latitude",
          "longitude",
          "heading",
          "location_name",
          "last_speed_kts",
          "mainsail_hoist",
          "jib_hoist",
          "is_owner",
          "is_crew"
        ]
      },
      "BoatsIndexResponse": {
        "type": "object",
        "properties": {
          "boats": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BoatSummary"
            }
          }
        },
        "required": [
          "boats"
        ]
      },
      "BoatShowResponse": {
        "type": "object",
        "properties": {
          "boat": {
            "$ref": "#/components/schemas/BoatDetails"
          }
        },
        "required": [
          "boat"
        ]
      },
      "PortInfo": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "uuid": {
            "type": "string",
            "format": "uuid"
          },
          "distance_nm": {
            "type": "number",
            "format": "float"
          },
          "compass_bearing": {
            "type": "string"
          }
        },
        "required": [
          "name",
          "uuid",
          "distance_nm",
          "compass_bearing"
        ]
      },
      "LandInfo": {
        "type": "object",
        "properties": {
          "distance_nm": {
            "type": "number",
            "format": "float"
          }
        },
        "required": [
          "distance_nm"
        ]
      },
      "ProximityInfoResponse": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "uuid": {
            "type": "string",
            "format": "uuid"
          },
          "coordinates": {
            "type": "string"
          },
          "closest_port": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/PortInfo"
              },
              {
                "type": "null"
              }
            ]
          },
          "closest_land": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/LandInfo"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "name",
          "uuid",
          "coordinates",
          "closest_port",
          "closest_land"
        ]
      },
      "PortCall": {
        "type": "object",
        "properties": {
          "port_name": {
            "type": "string"
          },
          "port_uuid": {
            "type": "string",
            "format": "uuid"
          },
          "event_type": {
            "type": "string"
          },
          "event_timestamp": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "port_name",
          "port_uuid",
          "event_type",
          "event_timestamp"
        ]
      },
      "PortHistoryResponse": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "uuid": {
            "type": "string",
            "format": "uuid"
          },
          "total_ports_visited": {
            "type": "integer"
          },
          "recent_port_calls": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PortCall"
            }
          }
        },
        "required": [
          "name",
          "uuid",
          "total_ports_visited",
          "recent_port_calls"
        ]
      },
      "TravelStatsResponse": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "uuid": {
            "type": "string",
            "format": "uuid"
          },
          "period_type": {
            "type": "string"
          },
          "metric_date": {
            "type": "string",
            "format": "date"
          },
          "distance_nm": {
            "type": "number",
            "format": "float"
          }
        },
        "required": [
          "name",
          "uuid",
          "period_type",
          "metric_date",
          "distance_nm"
        ]
      }
    }
  },
  "paths": {
    "/api/v3/globe_boats": {
      "get": {
        "summary": "Get all boats owned by or crewed by the current user",
        "tags": [
          "Globe Boats"
        ],
        "operationId": "getGlobeBoats",
        "security": [
          {
            "OAuth2": [
              "globe_read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "type": "string",
            "required": true,
            "description": "Bearer token for OAuth2 authentication",
            "schema": {
              "type": "string",
              "default": "Bearer <token>"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "boats returned",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BoatsIndexResponse"
                }
              }
            }
          },
          "410": {
            "description": "user account deleted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v3/globe_boats/{uuid}": {
      "get": {
        "summary": "Get details for a specific boat",
        "tags": [
          "Globe Boats"
        ],
        "operationId": "getGlobeBoat",
        "security": [
          {
            "OAuth2": [
              "globe_read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "type": "string",
            "required": true,
            "description": "Bearer token for OAuth2 authentication",
            "schema": {
              "type": "string",
              "default": "Bearer <token>"
            }
          },
          {
            "name": "uuid",
            "in": "path",
            "required": true,
            "description": "Boat UUID",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "boat details returned",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BoatShowResponse"
                }
              }
            }
          },
          "404": {
            "description": "boat not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "410": {
            "description": "user account deleted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v3/globe_boats/{uuid}/proximity_info": {
      "get": {
        "summary": "Get proximity information (closest port and land) for a boat",
        "tags": [
          "Globe Boats"
        ],
        "operationId": "getBoatProximityInfo",
        "security": [
          {
            "OAuth2": [
              "globe_read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "type": "string",
            "required": true,
            "description": "Bearer token for OAuth2 authentication",
            "schema": {
              "type": "string",
              "default": "Bearer <token>"
            }
          },
          {
            "name": "uuid",
            "in": "path",
            "required": true,
            "description": "Boat UUID",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "proximity information returned",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProximityInfoResponse"
                }
              }
            }
          },
          "404": {
            "description": "boat not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "410": {
            "description": "user account deleted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v3/globe_boats/{uuid}/port_history": {
      "get": {
        "summary": "Get port visit history for a boat",
        "tags": [
          "Globe Boats"
        ],
        "operationId": "getBoatPortHistory",
        "security": [
          {
            "OAuth2": [
              "globe_read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "type": "string",
            "required": true,
            "description": "Bearer token for OAuth2 authentication",
            "schema": {
              "type": "string",
              "default": "Bearer <token>"
            }
          },
          {
            "name": "uuid",
            "in": "path",
            "required": true,
            "description": "Boat UUID",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximum number of port calls to return (default: 10)",
            "schema": {
              "type": "integer",
              "default": 10
            }
          }
        ],
        "responses": {
          "200": {
            "description": "port history returned",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PortHistoryResponse"
                }
              }
            }
          },
          "404": {
            "description": "boat not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "410": {
            "description": "user account deleted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v3/globe_boats/{uuid}/travel_stats": {
      "get": {
        "summary": "Get travel statistics for a boat",
        "tags": [
          "Globe Boats"
        ],
        "operationId": "getBoatTravelStats",
        "security": [
          {
            "OAuth2": [
              "globe_read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "type": "string",
            "required": true,
            "description": "Bearer token for OAuth2 authentication",
            "schema": {
              "type": "string",
              "default": "Bearer <token>"
            }
          },
          {
            "name": "uuid",
            "in": "path",
            "required": true,
            "description": "Boat UUID",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "period_type",
            "in": "query",
            "required": false,
            "description": "Period type: 'daily', 'monthly', 'yearly', or 'overall' (default: 'overall')",
            "schema": {
              "type": "string",
              "enum": [
                "daily",
                "monthly",
                "yearly",
                "overall"
              ],
              "default": "overall"
            }
          },
          {
            "name": "metric_date",
            "in": "query",
            "required": false,
            "description": "Metric date in YYYY-MM-DD format (or YYYY-MM, or YYYY)",
            "schema": {
              "type": "string",
              "format": "date"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "travel stats returned",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TravelStatsResponse"
                }
              }
            }
          },
          "404": {
            "description": "boat not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "410": {
            "description": "user account deleted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "invalid date format",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v3/sailing_progress": {
      "get": {
        "summary": "Get sailing progress for the current user",
        "tags": [
          "Sailing Progress"
        ],
        "operationId": "getSailingProgress",
        "security": [
          {
            "OAuth2": [
              "sailing_cv"
            ]
          }
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "type": "string",
            "required": true,
            "description": "Bearer token for OAuth2 authentication",
            "schema": {
              "type": "string",
              "default": "Bearer <token>"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "sailing progress found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SailingProgressResponse"
                }
              }
            }
          },
          "410": {
            "description": "user account deleted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v3/users/me": {
      "get": {
        "summary": "Get the current user profile",
        "tags": [
          "Users"
        ],
        "operationId": "getCurrentUser",
        "security": [
          {
            "OAuth2": [
              "public"
            ]
          }
        ],
        "parameters": [
          {
            "name": "Authorization",
            "in": "header",
            "type": "string",
            "required": true,
            "description": "Bearer token for OAuth2 authentication",
            "schema": {
              "type": "string",
              "default": "Bearer <token>"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "current user returned",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserMeResponse"
                }
              }
            }
          },
          "410": {
            "description": "user account deleted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    }
  }
}