{
  "openapi": "3.1.0",
  "info": {
    "title": "Potservers API",
    "version": "1",
    "summary": "Path of Titans dino, map and quest data.",
    "description": "Five read-only JSON endpoints: the dino list, one dino, one map, the quest list and one quest. No key needed; up to 120 requests a minute.\n\nCredit Potservers with a link to https://potservers.net wherever the data appears, in any wording. Potservers is an unofficial fan project, not affiliated with Alderon Games. Path of Titans and its game data belong to Alderon Games, and modded creature data to its mod authors.",
    "termsOfService": "https://potservers.net/developers#terms",
    "contact": {
      "name": "Potservers",
      "url": "https://potservers.net/developers"
    }
  },
  "servers": [
    {
      "url": "https://potservers.net"
    }
  ],
  "tags": [
    {
      "name": "Dinos"
    },
    {
      "name": "Maps"
    },
    {
      "name": "Quests"
    },
    {
      "name": "About"
    }
  ],
  "paths": {
    "/api/v1/dinos": {
      "get": {
        "operationId": "listDinos",
        "tags": [
          "Dinos"
        ],
        "summary": "Get the dino list",
        "description": "Every dino, official and modded, sorted by name.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "The dinos.",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/DinoSummary"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ]
                }
              }
            }
          },
          "304": {
            "$ref": "#/components/responses/NotModified"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-example": "/api/v1/dinos"
      }
    },
    "/api/v1/dinos/{id}": {
      "get": {
        "operationId": "getDino",
        "tags": [
          "Dinos"
        ],
        "summary": "Get a dino",
        "description": "Everything about one dino: stats, subspecies, abilities and growth curves.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Dino id, from the dino list.",
            "schema": {
              "type": "string"
            },
            "example": "tyrannosaurus"
          }
        ],
        "responses": {
          "200": {
            "description": "The dino.",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Dino"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ]
                }
              }
            }
          },
          "304": {
            "$ref": "#/components/responses/NotModified"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-example": "/api/v1/dinos/tyrannosaurus"
      }
    },
    "/api/v1/maps/{map}": {
      "get": {
        "operationId": "getMap",
        "tags": [
          "Maps"
        ],
        "summary": "Get a map",
        "description": "Everything on one map: items, regions, landmarks, flight paths and images. Every position comes in map units and as a game position.",
        "parameters": [
          {
            "name": "map",
            "in": "path",
            "required": true,
            "description": "gondwa, panjura or riparia.",
            "schema": {
              "type": "string",
              "enum": [
                "gondwa",
                "panjura",
                "riparia"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The map.",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Map"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ]
                }
              }
            }
          },
          "304": {
            "$ref": "#/components/responses/NotModified"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-example": "/api/v1/maps/riparia"
      }
    },
    "/api/v1/maps/{map}/image": {
      "get": {
        "operationId": "getMapImage",
        "tags": [
          "Maps"
        ],
        "summary": "Map image",
        "description": "The map image. Use the URLs in a map's images list. Only some size and format pairs exist: 400, 800, 1024 and 2048 as jpeg; 2048 and 4096 as avif; 4096 as webp. Any other pair returns 400 invalid_parameter. With no parameters you get a 2048 jpeg, and format=webp alone gives the 4096 webp. Image requests do not count against the rate limit.",
        "parameters": [
          {
            "name": "map",
            "in": "path",
            "required": true,
            "description": "gondwa, panjura or riparia.",
            "schema": {
              "type": "string",
              "enum": [
                "gondwa",
                "panjura",
                "riparia"
              ]
            }
          },
          {
            "name": "size",
            "in": "query",
            "required": false,
            "description": "Width and height in pixels. Must suit the format: jpeg 400, 800, 1024 or 2048; avif 2048 or 4096; webp 4096.",
            "schema": {
              "type": "integer",
              "enum": [
                400,
                800,
                1024,
                2048,
                4096
              ],
              "default": 2048
            }
          },
          {
            "name": "format",
            "in": "query",
            "required": false,
            "description": "Image format. See size for which sizes each one comes in.",
            "schema": {
              "type": "string",
              "enum": [
                "jpeg",
                "avif",
                "webp"
              ],
              "default": "jpeg"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The image.",
            "content": {
              "image/jpeg": {},
              "image/avif": {},
              "image/webp": {}
            }
          },
          "304": {
            "$ref": "#/components/responses/NotModified"
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        }
      }
    },
    "/api/v1/quests": {
      "get": {
        "operationId": "listQuests",
        "tags": [
          "Quests"
        ],
        "summary": "Get the quest list",
        "description": "Every quest players can get, sorted by name.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "The quests.",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/QuestSummary"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ]
                }
              }
            }
          },
          "304": {
            "$ref": "#/components/responses/NotModified"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-example": "/api/v1/quests"
      }
    },
    "/api/v1/quests/{id}": {
      "get": {
        "operationId": "getQuest",
        "tags": [
          "Quests"
        ],
        "summary": "Get a quest",
        "description": "Everything about one quest: where it is, its tasks and their items.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Quest id, from the quest list.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The quest.",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/X-RateLimit-Remaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/X-RateLimit-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Quest"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ]
                }
              }
            }
          },
          "304": {
            "$ref": "#/components/responses/NotModified"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "x-example": "/api/v1/quests/blueprints_quests_riparia_both_any_bp_quest_riparia_kelp_vale"
      }
    },
    "/api/v1/openapi.json": {
      "get": {
        "operationId": "getOpenAPI",
        "tags": [
          "About"
        ],
        "summary": "This OpenAPI document",
        "responses": {
          "200": {
            "description": "OpenAPI 3.1 JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Meta": {
        "type": "object",
        "properties": {
          "count": {
            "type": "integer",
            "description": "How many items the list has."
          },
          "updated_at": {
            "type": "string",
            "description": "When this data last changed.",
            "format": "date-time"
          },
          "attribution": {
            "type": "string",
            "description": "A ready-made credit line. Any wording that names Potservers and links to potservers.net works."
          }
        },
        "required": [
          "attribution"
        ]
      },
      "Error": {
        "type": "object",
        "properties": {
          "error": {
            "type": "string",
            "description": "Short error code.",
            "enum": [
              "not_found",
              "method_not_allowed",
              "rate_limited",
              "data_unavailable",
              "invalid_parameter"
            ]
          },
          "message": {
            "type": "string",
            "description": "What went wrong, in plain words."
          }
        },
        "required": [
          "error",
          "message"
        ]
      },
      "Point": {
        "type": "array",
        "items": {
          "type": "number"
        },
        "description": "A position as [x, y] in map units: 0 to 500 across the map image, counted from the top left.",
        "minItems": 2,
        "maxItems": 2,
        "example": [
          120.5,
          341.27
        ]
      },
      "WorldPoint": {
        "type": "array",
        "items": {
          "type": "number"
        },
        "description": "A game position as [x, y, z] in centimetres, the units the game uses (what /mapbug prints). z is the height; it is left out where unknown.",
        "minItems": 2,
        "maxItems": 3,
        "example": [
          -47380,
          21623,
          -13228
        ]
      },
      "WorldPoint2D": {
        "type": "array",
        "items": {
          "type": "number"
        },
        "description": "A flat game position as [x, y] in centimetres, with no height. Region centres and outlines use this.",
        "minItems": 2,
        "maxItems": 2,
        "example": [
          -47380,
          21623
        ]
      },
      "DinoSummary": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Dino id.",
            "example": "tyrannosaurus"
          },
          "name": {
            "type": "string",
            "description": "Name.",
            "example": "Tyrannosaurus"
          },
          "url": {
            "type": "string",
            "description": "Its full data in the API.",
            "format": "uri"
          },
          "diet": {
            "type": "string",
            "description": "carnivore or herbivore."
          },
          "modded": {
            "type": "boolean",
            "description": "True for community mod dinos."
          },
          "icon_url": {
            "type": [
              "string",
              "null"
            ],
            "description": "Portrait (PNG).",
            "format": "uri"
          }
        },
        "required": [
          "id",
          "name",
          "url",
          "diet",
          "modded",
          "icon_url"
        ]
      },
      "Dino": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Dino id.",
            "example": "tyrannosaurus"
          },
          "name": {
            "type": "string",
            "description": "Name."
          },
          "url": {
            "type": "string",
            "description": "This dino in the API.",
            "format": "uri"
          },
          "page_url": {
            "type": "string",
            "description": "This dino on potservers.net.",
            "format": "uri"
          },
          "modded": {
            "type": "boolean",
            "description": "True for community mod dinos."
          },
          "mod": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/DinoMod"
              },
              {
                "type": "null"
              }
            ]
          },
          "diet": {
            "type": "string",
            "description": "carnivore or herbivore."
          },
          "aquatic": {
            "type": "boolean",
            "description": "Lives in or near water."
          },
          "flying": {
            "type": "boolean",
            "description": "Can fly."
          },
          "group_slots": {
            "type": "integer",
            "description": "Group slots it takes."
          },
          "nest_materials": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Map item types its nest needs, matching marker ids in map data."
          },
          "icon_url": {
            "type": [
              "string",
              "null"
            ],
            "description": "Portrait (PNG).",
            "format": "uri"
          },
          "stats": {
            "type": "object",
            "description": "Adult stats by id, such as health or sprint_speed. Each one says its name, unit and whether higher is better.",
            "additionalProperties": {
              "$ref": "#/components/schemas/Stat"
            }
          },
          "subspecies": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Subspecies"
            },
            "description": "Subspecies it can take."
          },
          "stats_changed_at": {
            "type": [
              "string",
              "null"
            ],
            "description": "When its stats last changed.",
            "format": "date-time"
          },
          "stats_changed_at_approximate": {
            "type": "boolean",
            "description": "True when that date is only a rough floor."
          },
          "live_hotfix": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/LiveHotfix"
              },
              {
                "type": "null"
              }
            ]
          },
          "abilities": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Ability"
            },
            "description": "Its abilities, starting ones first."
          },
          "curves": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CurveTable"
            },
            "description": "Growth curves: how each value grows from hatchling to adult."
          }
        },
        "required": [
          "id",
          "name",
          "url",
          "page_url",
          "modded",
          "mod",
          "diet",
          "aquatic",
          "flying",
          "group_slots",
          "nest_materials",
          "icon_url",
          "stats",
          "subspecies",
          "stats_changed_at",
          "stats_changed_at_approximate",
          "live_hotfix",
          "abilities",
          "curves"
        ]
      },
      "Stat": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Name, as on the site.",
            "example": "Sprint Speed"
          },
          "value": {
            "type": "number",
            "description": "The adult value."
          },
          "unit": {
            "type": [
              "string",
              "null"
            ],
            "description": "Unit, or null for a plain number.",
            "enum": [
              "km/h",
              "m",
              "min",
              "/s",
              null
            ]
          },
          "better": {
            "type": "string",
            "description": "Whether a bigger or smaller number is better.",
            "enum": [
              "higher",
              "lower"
            ]
          }
        },
        "required": [
          "name",
          "value",
          "unit",
          "better"
        ]
      },
      "DinoMod": {
        "type": "object",
        "properties": {
          "name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Mod name."
          },
          "sku": {
            "type": [
              "string",
              "null"
            ],
            "description": "The mod's id in the game's mod browser."
          },
          "version": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Mod version the data comes from."
          },
          "author": {
            "type": [
              "string",
              "null"
            ],
            "description": "Mod author, when known."
          }
        },
        "required": [
          "name",
          "sku",
          "version",
          "author"
        ]
      },
      "Subspecies": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Subspecies id."
          },
          "name": {
            "type": "string",
            "description": "Name."
          },
          "description": {
            "type": [
              "string",
              "null"
            ],
            "description": "What it changes, such as \"+25% Knockback Resist\"."
          },
          "unlock_cost": {
            "type": [
              "number",
              "null"
            ],
            "description": "Price in Marks."
          }
        },
        "required": [
          "id",
          "name",
          "description",
          "unlock_cost"
        ]
      },
      "LiveHotfix": {
        "type": "object",
        "properties": {
          "captured_at": {
            "type": "string",
            "description": "When the live values were read.",
            "format": "date-time"
          },
          "curve_rows": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Curves the live balance patch changes."
          }
        },
        "required": [
          "captured_at",
          "curve_rows"
        ],
        "description": "Set when official servers run different values than the game files."
      },
      "Ability": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Ability id."
          },
          "name": {
            "type": "string",
            "description": "Name."
          },
          "description": {
            "type": [
              "string",
              "null"
            ],
            "description": "The game's description."
          },
          "slot": {
            "type": "string",
            "description": "Slot it goes in.",
            "enum": [
              "head",
              "front_limb",
              "back_limb",
              "legs",
              "tail",
              "hide",
              "senses",
              "metabolism",
              "voice",
              "passives",
              "other"
            ]
          },
          "slot_name": {
            "type": "string",
            "description": "The slot as shown in game."
          },
          "unlock_cost": {
            "type": [
              "number",
              "null"
            ],
            "description": "Price in Marks, or null if it comes free."
          },
          "unlocked_by_default": {
            "type": "boolean",
            "description": "Owned from the start."
          },
          "icon_url": {
            "type": [
              "string",
              "null"
            ],
            "description": "Icon (PNG).",
            "format": "uri"
          },
          "metrics": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Metric"
            },
            "description": "Its numbers, most important first."
          },
          "sub_abilities": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Ability"
            },
            "description": "Abilities that come with this one."
          }
        },
        "required": [
          "id",
          "name",
          "description",
          "slot",
          "slot_name",
          "unlock_cost",
          "unlocked_by_default",
          "icon_url",
          "metrics",
          "sub_abilities"
        ]
      },
      "Metric": {
        "type": "object",
        "properties": {
          "key": {
            "type": "string",
            "description": "The game's internal name for the number."
          },
          "name": {
            "type": "string",
            "description": "Name, as on the site.",
            "example": "Damage"
          },
          "value": {
            "type": "number"
          },
          "unit": {
            "type": [
              "string",
              "null"
            ],
            "description": "Unit, or null for a plain number.",
            "enum": [
              "%",
              "%/s",
              "/s",
              "s",
              "m",
              null
            ]
          },
          "kind": {
            "type": [
              "string",
              "null"
            ],
            "description": "What sort of number it is.",
            "enum": [
              "damage",
              "bone_break",
              "fracture",
              "bleed",
              "venom",
              "toxin",
              "knockback",
              "stamina_cost",
              "cooldown",
              "range",
              "carry_weight",
              "hit_ramp",
              "full_charge",
              null
            ]
          },
          "display_value": {
            "type": [
              "string",
              "null"
            ],
            "description": "Text to show instead of the value, such as \"Can trigger\", or a hit ramp listed hit by hit (\"4 → 12 → 20 → 28 → 36 → 44 · 30 s buff\")."
          },
          "condition": {
            "type": [
              "string",
              "null"
            ],
            "description": "When it applies."
          },
          "scope": {
            "type": [
              "string",
              "null"
            ],
            "description": "How the hit has to land, when that matters."
          },
          "note": {
            "type": [
              "string",
              "null"
            ],
            "description": "A short explanation."
          }
        },
        "required": [
          "key",
          "name",
          "value",
          "unit",
          "kind",
          "display_value",
          "condition",
          "scope",
          "note"
        ]
      },
      "CurveTable": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "core, combat or multiplier."
          },
          "name": {
            "type": "string",
            "description": "Name."
          },
          "rows": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CurveRow"
            }
          }
        },
        "required": [
          "id",
          "name",
          "rows"
        ]
      },
      "CurveRow": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "The game's internal name.",
            "example": "Tyrannosaurus.Core.MaxHealth"
          },
          "name": {
            "type": "string",
            "description": "Name.",
            "example": "Max health"
          },
          "adult_value": {
            "type": [
              "number",
              "null"
            ],
            "description": "The value when fully grown. Null for the few rows that are not by growth stage."
          },
          "points": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CurvePoint"
            },
            "description": "Points on the curve. Values in between change in a straight line."
          }
        },
        "required": [
          "id",
          "name",
          "adult_value",
          "points"
        ]
      },
      "CurvePoint": {
        "type": "object",
        "properties": {
          "x": {
            "type": "number",
            "description": "Growth stage: 1 (hatchling) to 5 (adult), or 0 to 4 for a few modded dinos. A few rows use another input, such as armor or level."
          },
          "y": {
            "type": "number",
            "description": "The value at that stage."
          }
        },
        "required": [
          "x",
          "y"
        ]
      },
      "Map": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Map id.",
            "enum": [
              "gondwa",
              "panjura",
              "riparia"
            ]
          },
          "name": {
            "type": "string",
            "description": "Name."
          },
          "url": {
            "type": "string",
            "description": "This map in the API.",
            "format": "uri"
          },
          "page_url": {
            "type": "string",
            "description": "This map on potservers.net.",
            "format": "uri"
          },
          "updated_at": {
            "type": "string",
            "description": "When the map data last changed.",
            "format": "date-time"
          },
          "coordinates": {
            "$ref": "#/components/schemas/MapCoordinates"
          },
          "images": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MapImage"
            },
            "description": "The map image in several sizes."
          },
          "markers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MarkerKind"
            },
            "description": "Every item on the map, grouped by type."
          },
          "regions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Region"
            },
            "description": "Named areas."
          },
          "landmarks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Landmark"
            },
            "description": "Landmarks players can discover."
          },
          "flight_paths": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FlightPath"
            },
            "description": "Flight routes for flyers."
          }
        },
        "required": [
          "id",
          "name",
          "url",
          "page_url",
          "updated_at",
          "coordinates",
          "images",
          "markers",
          "regions",
          "landmarks",
          "flight_paths"
        ]
      },
      "MapCoordinates": {
        "type": "object",
        "properties": {
          "size": {
            "type": "integer",
            "description": "Map units run from 0 to this across the image.",
            "example": 500
          },
          "origin": {
            "type": "string",
            "description": "Where map position [0, 0] is.",
            "enum": [
              "top_left"
            ]
          },
          "world_unit": {
            "type": "string",
            "description": "Unit of the world_* fields and world_bounds: centimetres, as the game measures.",
            "enum": [
              "cm"
            ]
          },
          "world_bounds": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/WorldBounds"
              },
              {
                "type": "null"
              }
            ]
          },
          "meters_per_unit": {
            "type": [
              "number",
              "null"
            ],
            "description": "Metres in one map unit along x. Some maps are not square, so use meters_per_unit_y for the y axis."
          },
          "meters_per_unit_y": {
            "type": [
              "number",
              "null"
            ],
            "description": "Metres in one map unit along y. It matches meters_per_unit on a square map and differs slightly on others, such as Gondwa."
          }
        },
        "required": [
          "size",
          "origin",
          "world_unit",
          "world_bounds",
          "meters_per_unit",
          "meters_per_unit_y"
        ],
        "description": "The two ways positions are given. Map units run from 0 to 500 across the map image, from its top left, for drawing on the images. The world_* fields give the same positions as the game does, in centimetres with height. world_bounds is where the image edges sit in the game."
      },
      "WorldBounds": {
        "type": "object",
        "properties": {
          "min_x": {
            "type": "number",
            "description": "Game x at map x 0."
          },
          "min_y": {
            "type": "number",
            "description": "Game y at map y 0."
          },
          "max_x": {
            "type": "number",
            "description": "Game x at map x 500."
          },
          "max_y": {
            "type": "number",
            "description": "Game y at map y 500."
          }
        },
        "required": [
          "min_x",
          "min_y",
          "max_x",
          "max_y"
        ],
        "description": "The game x and y at the edges of the map image. A few world positions lie just past them; their map units stop at 0 or 500."
      },
      "MapImage": {
        "type": "object",
        "properties": {
          "size": {
            "type": "integer",
            "description": "Width and height in pixels."
          },
          "format": {
            "type": "string",
            "description": "Image format.",
            "enum": [
              "jpeg",
              "avif",
              "webp"
            ]
          },
          "url": {
            "type": "string",
            "description": "Where to get it.",
            "format": "uri"
          }
        },
        "required": [
          "size",
          "format",
          "url"
        ]
      },
      "MarkerKind": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Item type id.",
            "example": "bones"
          },
          "name": {
            "type": "string",
            "description": "Name, as on the map page.",
            "example": "Bones"
          },
          "category": {
            "type": "string",
            "description": "Category id.",
            "example": "terrestrial_wildlife"
          },
          "category_name": {
            "type": "string",
            "description": "Category name.",
            "example": "Terrestrial Wildlife"
          },
          "icon_url": {
            "type": [
              "string",
              "null"
            ],
            "description": "Icon (PNG), where there is one.",
            "format": "uri"
          },
          "count": {
            "type": "integer",
            "description": "How many there are."
          },
          "points": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Point"
            },
            "description": "Where each one is."
          },
          "world_points": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/WorldPoint"
            },
            "description": "The same points as game positions, in the same order."
          }
        },
        "required": [
          "id",
          "name",
          "category",
          "category_name",
          "icon_url",
          "count",
          "points",
          "world_points"
        ]
      },
      "Region": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Region id."
          },
          "name": {
            "type": "string",
            "description": "Name."
          },
          "center": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Point"
              }
            ],
            "description": "A good spot for a label, inside the area."
          },
          "world_center": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/WorldPoint2D"
              },
              {
                "type": "null"
              }
            ],
            "description": "The label spot as a game position, [x, y]."
          },
          "polygon": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Point"
            },
            "description": "The outline."
          },
          "world_polygon": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/WorldPoint2D"
            },
            "description": "The outline as game positions, [x, y] each, in the same order."
          },
          "page_url": {
            "type": "string",
            "description": "The map centred on this area.",
            "format": "uri"
          }
        },
        "required": [
          "id",
          "name",
          "center",
          "world_center",
          "polygon",
          "world_polygon",
          "page_url"
        ]
      },
      "Landmark": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Landmark id."
          },
          "name": {
            "type": "string",
            "description": "Name."
          },
          "position": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Point"
              }
            ],
            "description": "Where it is."
          },
          "world_position": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/WorldPoint"
              },
              {
                "type": "null"
              }
            ],
            "description": "Where it is, as a game position."
          },
          "radius": {
            "type": "number",
            "description": "How close players must get to discover it, in map units."
          },
          "world_radius": {
            "type": [
              "number",
              "null"
            ],
            "description": "The same radius in centimetres."
          },
          "page_url": {
            "type": "string",
            "description": "The map centred on this landmark.",
            "format": "uri"
          }
        },
        "required": [
          "id",
          "name",
          "position",
          "world_position",
          "radius",
          "world_radius",
          "page_url"
        ]
      },
      "FlightPath": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "description": "Flight path or flight expedition.",
            "enum": [
              "flight_path",
              "flight_expedition"
            ]
          },
          "name": {
            "type": "string",
            "description": "Name."
          },
          "start": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Point"
              }
            ],
            "description": "Where it starts."
          },
          "world_start": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/WorldPoint"
              },
              {
                "type": "null"
              }
            ],
            "description": "Where it starts, as a game position."
          },
          "route": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Point"
            },
            "description": "The route, in order."
          },
          "world_route": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/WorldPoint"
            },
            "description": "The route as game positions, in the same order."
          }
        },
        "required": [
          "type",
          "name",
          "start",
          "world_start",
          "route",
          "world_route"
        ]
      },
      "QuestSummary": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Quest id."
          },
          "name": {
            "type": "string",
            "description": "Name."
          },
          "url": {
            "type": "string",
            "description": "Its full data in the API.",
            "format": "uri"
          },
          "type": {
            "type": "string",
            "description": "Quest type, such as gathering or hunting."
          },
          "map": {
            "type": [
              "string",
              "null"
            ],
            "description": "Map id, or null when it can come up on any map."
          }
        },
        "required": [
          "id",
          "name",
          "url",
          "type",
          "map"
        ]
      },
      "Quest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Quest id."
          },
          "name": {
            "type": "string",
            "description": "Name."
          },
          "url": {
            "type": "string",
            "description": "This quest in the API.",
            "format": "uri"
          },
          "description": {
            "type": [
              "string",
              "null"
            ],
            "description": "The game's description."
          },
          "type": {
            "type": "string",
            "description": "Quest type, such as gathering or hunting."
          },
          "map": {
            "type": [
              "string",
              "null"
            ],
            "description": "Map id, or null when it can come up on any map."
          },
          "location": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/QuestPlace"
              },
              {
                "type": "null"
              }
            ]
          },
          "share": {
            "type": [
              "string",
              "null"
            ],
            "description": "How it is shared between players.",
            "enum": [
              "personal",
              "group",
              "local_world",
              "survival",
              null
            ]
          },
          "mod": {
            "type": [
              "string",
              "null"
            ],
            "description": "The mod that adds it, if any."
          },
          "enabled": {
            "type": "boolean",
            "description": "Turned on in the game."
          },
          "tutorial": {
            "type": "boolean",
            "description": "A tutorial quest."
          },
          "tasks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/QuestTask"
            },
            "description": "What it asks for."
          }
        },
        "required": [
          "id",
          "name",
          "url",
          "description",
          "type",
          "map",
          "location",
          "share",
          "mod",
          "enabled",
          "tutorial",
          "tasks"
        ]
      },
      "QuestPlace": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "The place, as the game names it."
          },
          "region_id": {
            "type": [
              "string",
              "null"
            ],
            "description": "The matching region in the map data, when there is one."
          }
        },
        "required": [
          "name",
          "region_id"
        ]
      },
      "QuestTask": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "description": "Task type, such as gather, deliver or explore."
          },
          "name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Name."
          },
          "description": {
            "type": [
              "string",
              "null"
            ],
            "description": "The game's description."
          },
          "count": {
            "type": [
              "number",
              "null"
            ],
            "description": "How many it needs."
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/QuestItem"
            },
            "description": "Items that count toward it."
          }
        },
        "required": [
          "type",
          "name",
          "description",
          "count",
          "items"
        ]
      },
      "QuestItem": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Item id."
          },
          "name": {
            "type": "string",
            "description": "Name."
          },
          "count": {
            "type": [
              "number",
              "null"
            ],
            "description": "How many."
          },
          "diet": {
            "type": [
              "string",
              "null"
            ],
            "description": "Set when the item depends on what the player eats.",
            "enum": [
              "carnivore",
              "herbivore",
              "omnivore",
              null
            ]
          },
          "marker_kinds": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Map item types it comes from on the quest's map, matching marker ids in that map's data."
          }
        },
        "required": [
          "id",
          "name",
          "count",
          "diet",
          "marker_kinds"
        ]
      }
    },
    "headers": {
      "ETag": {
        "description": "Send back as If-None-Match to get an empty 304 when nothing changed.",
        "schema": {
          "type": "string"
        }
      },
      "X-RateLimit-Limit": {
        "description": "Requests allowed a minute.",
        "schema": {
          "type": "integer"
        }
      },
      "X-RateLimit-Remaining": {
        "description": "Requests left this minute.",
        "schema": {
          "type": "integer"
        }
      },
      "X-RateLimit-Reset": {
        "description": "Unix time the minute resets.",
        "schema": {
          "type": "integer"
        }
      },
      "Retry-After": {
        "description": "Seconds to wait.",
        "schema": {
          "type": "integer"
        }
      }
    },
    "responses": {
      "NotModified": {
        "description": "Unchanged since the ETag sent in If-None-Match."
      },
      "BadRequest": {
        "description": "A size or format the image does not come in.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "NotFound": {
        "description": "No such dino, map or quest.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "RateLimited": {
        "description": "Over 120 requests a minute.",
        "headers": {
          "Retry-After": {
            "$ref": "#/components/headers/Retry-After"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "Unavailable": {
        "description": "The data could not be loaded.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      }
    }
  }
}
