{
  "openapi": "3.0.3",
  "info": {
    "title": "Geo Toolkit",
    "description": "Plus Codes, geohash & Maidenhead encode/decode + distance, bearing, destination, bounding box, and DD⇄DMS — all open, pure compute.",
    "version": "1.0.0"
  },
  "components": {
    "schemas": {}
  },
  "paths": {
    "/plus-code/encode": {
      "get": {
        "summary": "Encode Plus Code",
        "tags": [
          "Geo"
        ],
        "description": "Encode latitude and longitude to a Plus Code.",
        "parameters": [
          {
            "schema": {
              "type": "string"
            },
            "example": "37.4220",
            "in": "query",
            "name": "lat",
            "required": true,
            "description": "Latitude (-90 to 90)"
          },
          {
            "schema": {
              "type": "string"
            },
            "example": "-122.0841",
            "in": "query",
            "name": "lng",
            "required": true,
            "description": "Longitude (-180 to 180)"
          },
          {
            "schema": {
              "type": "integer",
              "default": 10
            },
            "example": 10,
            "in": "query",
            "name": "codeLength",
            "required": false,
            "description": "Code length (even 2-10, or 11+ for grid refinement)"
          }
        ],
        "responses": {
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Bad request",
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    },
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/plus-code/decode": {
      "get": {
        "summary": "Decode Plus Code",
        "tags": [
          "Geo"
        ],
        "description": "Decode a Plus Code to its center and bounds.",
        "parameters": [
          {
            "schema": {
              "type": "string"
            },
            "example": "849VCWC8+R9",
            "in": "query",
            "name": "code",
            "required": true,
            "description": "An Open Location Code (Plus Code)"
          }
        ],
        "responses": {
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Bad request",
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    },
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "hash/encode": {
      "get": {
        "summary": "Encode Geohash",
        "tags": [
          "Geo"
        ],
        "description": "Encode latitude and longitude to a geohash.",
        "parameters": [
          {
            "schema": {
              "type": "string"
            },
            "example": "37.4220",
            "in": "query",
            "name": "lat",
            "required": true,
            "description": "Latitude"
          },
          {
            "schema": {
              "type": "string"
            },
            "example": "-122.0841",
            "in": "query",
            "name": "lng",
            "required": true,
            "description": "Longitude"
          },
          {
            "schema": {
              "type": "integer",
              "default": 9
            },
            "example": 9,
            "in": "query",
            "name": "precision",
            "required": false,
            "description": "Geohash length (1-12)"
          }
        ],
        "responses": {
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Bad request",
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    },
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "hash/decode": {
      "get": {
        "summary": "Decode Geohash",
        "tags": [
          "Geo"
        ],
        "description": "Decode a geohash to its center and bounds.",
        "parameters": [
          {
            "schema": {
              "type": "string"
            },
            "example": "9q9hvu7wbq2",
            "in": "query",
            "name": "geohash",
            "required": true,
            "description": "A geohash string"
          }
        ],
        "responses": {
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Bad request",
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    },
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "hash/neighbors": {
      "get": {
        "summary": "Geohash Neighbors",
        "tags": [
          "Geo"
        ],
        "description": "Get the eight neighboring geohashes.",
        "parameters": [
          {
            "schema": {
              "type": "string"
            },
            "example": "9q9hvu7wbq2",
            "in": "query",
            "name": "geohash",
            "required": true,
            "description": "A geohash string"
          }
        ],
        "responses": {
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Bad request",
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    },
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/maidenhead/encode": {
      "get": {
        "summary": "Encode Maidenhead Locator",
        "tags": [
          "Geo"
        ],
        "description": "Encode latitude and longitude to a Maidenhead locator.",
        "parameters": [
          {
            "schema": {
              "type": "string"
            },
            "example": "37.4220",
            "in": "query",
            "name": "lat",
            "required": true,
            "description": "Latitude"
          },
          {
            "schema": {
              "type": "string"
            },
            "example": "-122.0841",
            "in": "query",
            "name": "lng",
            "required": true,
            "description": "Longitude"
          },
          {
            "schema": {
              "type": "integer",
              "default": 3
            },
            "example": 3,
            "in": "query",
            "name": "precision",
            "required": false,
            "description": "Locator precision (1-4 pairs)"
          }
        ],
        "responses": {
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Bad request",
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    },
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/maidenhead/decode": {
      "get": {
        "summary": "Decode Maidenhead Locator",
        "tags": [
          "Geo"
        ],
        "description": "Decode a Maidenhead locator to its center.",
        "parameters": [
          {
            "schema": {
              "type": "string"
            },
            "example": "CM87wm",
            "in": "query",
            "name": "locator",
            "required": true,
            "description": "A Maidenhead grid locator"
          }
        ],
        "responses": {
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Bad request",
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    },
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/distance": {
      "get": {
        "summary": "Distance and Bearing",
        "tags": [
          "Geo"
        ],
        "description": "Calculate distance, bearing, and midpoint between two points.",
        "parameters": [
          {
            "schema": {
              "type": "string"
            },
            "example": "40.7128",
            "in": "query",
            "name": "lat1",
            "required": true,
            "description": "Start latitude"
          },
          {
            "schema": {
              "type": "string"
            },
            "example": "-74.0060",
            "in": "query",
            "name": "lng1",
            "required": true,
            "description": "Start longitude"
          },
          {
            "schema": {
              "type": "string"
            },
            "example": "34.0522",
            "in": "query",
            "name": "lat2",
            "required": true,
            "description": "End latitude"
          },
          {
            "schema": {
              "type": "string"
            },
            "example": "-118.2437",
            "in": "query",
            "name": "lng2",
            "required": true,
            "description": "End longitude"
          },
          {
            "schema": {
              "type": "string",
              "enum": [
                "km",
                "mi",
                "m",
                "nmi"
              ],
              "default": "km"
            },
            "example": "km",
            "in": "query",
            "name": "unit",
            "required": false
          }
        ],
        "responses": {
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Bad request",
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    },
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/destination": {
      "get": {
        "summary": "Destination Point",
        "tags": [
          "Geo"
        ],
        "description": "Calculate destination point given start, distance and bearing.",
        "parameters": [
          {
            "schema": {
              "type": "string"
            },
            "example": "0",
            "in": "query",
            "name": "lat",
            "required": true,
            "description": "Start latitude"
          },
          {
            "schema": {
              "type": "string"
            },
            "example": "0",
            "in": "query",
            "name": "lng",
            "required": true,
            "description": "Start longitude"
          },
          {
            "schema": {
              "type": "string"
            },
            "example": "111.32",
            "in": "query",
            "name": "distance",
            "required": true,
            "description": "Distance to travel"
          },
          {
            "schema": {
              "type": "string"
            },
            "example": "0",
            "in": "query",
            "name": "bearing",
            "required": true,
            "description": "Initial bearing in degrees (0 = north)"
          },
          {
            "schema": {
              "type": "string",
              "enum": [
                "km",
                "mi",
                "m",
                "nmi"
              ],
              "default": "km"
            },
            "example": "km",
            "in": "query",
            "name": "unit",
            "required": false
          }
        ],
        "responses": {
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Bad request",
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    },
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/bbox": {
      "get": {
        "summary": "Bounding Box",
        "tags": [
          "Geo"
        ],
        "description": "Compute bounding box around a point given radius.",
        "parameters": [
          {
            "schema": {
              "type": "string"
            },
            "example": "37.4220",
            "in": "query",
            "name": "lat",
            "required": true,
            "description": "Center latitude"
          },
          {
            "schema": {
              "type": "string"
            },
            "example": "-122.0841",
            "in": "query",
            "name": "lng",
            "required": true,
            "description": "Center longitude"
          },
          {
            "schema": {
              "type": "string"
            },
            "example": "10",
            "in": "query",
            "name": "radius",
            "required": true,
            "description": "Radius around the point"
          },
          {
            "schema": {
              "type": "string",
              "enum": [
                "km",
                "mi",
                "m",
                "nmi"
              ],
              "default": "km"
            },
            "example": "km",
            "in": "query",
            "name": "unit",
            "required": false
          }
        ],
        "responses": {
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Bad request",
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    },
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/coordinate": {
      "get": {
        "summary": "Coordinate Formats",
        "tags": [
          "Geo"
        ],
        "description": "Convert decimal degrees to DMS.",
        "parameters": [
          {
            "schema": {
              "type": "string"
            },
            "example": "37.4220",
            "in": "query",
            "name": "lat",
            "required": true,
            "description": "Latitude in decimal degrees"
          },
          {
            "schema": {
              "type": "string"
            },
            "example": "-122.0841",
            "in": "query",
            "name": "lng",
            "required": true,
            "description": "Longitude in decimal degrees"
          }
        ],
        "responses": {
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "schema": {
                  "description": "Bad request",
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    },
                    "message": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "servers": [
    {
      "url": "https://web-toolbox-api-production.up.railway.app/geo",
      "description": "Production"
    }
  ]
}