{"openapi":"3.1.0","info":{"title":"Geo Distance API","version":"1.0.0","description":"A fast, fully-local great-circle geospatial toolkit: compute the haversine distance between two coordinates (in km, m, miles or nautical miles), the initial and final compass bearing, the geographic midpoint, the destination point reached from an origin on a bearing at a given distance, and a bounding box around a center for a radius. Pure server-side compute, no third-party upstream, so responses are instant and always available. Ideal for logistics, delivery and fleet apps, store locators, real-estate search, travel and mapping tools.","contact":{"name":"PremiumApi","url":"https://www.oanor.com/by/premiumapi"}},"servers":[{"url":"https://api.oanor.com/geo-api","description":"oanor gateway"}],"tags":[{"name":"Geo"}],"components":{"securitySchemes":{"oanorKey":{"type":"apiKey","in":"header","name":"x-oanor-key","description":"Get your key at https://www.oanor.com/developer/keys"}}},"security":[{"oanorKey":[]}],"paths":{"/v1/bbox":{"get":{"operationId":"get_v1_bbox","tags":["Geo"],"summary":"Bounding box","description":"","parameters":[{"name":"center","in":"query","required":true,"description":"Center \"lat,lon\"","schema":{"type":"string"},"example":"52.520,13.405"},{"name":"radius","in":"query","required":true,"description":"Radius","schema":{"type":"string"},"example":"10"},{"name":"unit","in":"query","required":false,"description":"km, m, mi, nmi","schema":{"type":"string"},"example":"km"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"bbox":{"max_lat":52.609932,"max_lon":13.552797,"min_lat":52.430068,"min_lon":13.257203},"unit":"km","center":{"lat":52.52,"lon":13.405},"radius":10},"meta":{"timestamp":"2026-05-30T09:00:25.299Z","request_id":"b2332b35-8075-4362-b88c-1713a705a2bc"},"status":"ok","message":"Bounding box computed","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}},"/v1/bearing":{"get":{"operationId":"get_v1_bearing","tags":["Geo"],"summary":"Compass bearing","description":"","parameters":[{"name":"from","in":"query","required":true,"description":"Origin \"lat,lon\"","schema":{"type":"string"},"example":"52.520,13.405"},{"name":"to","in":"query","required":true,"description":"Destination \"lat,lon\"","schema":{"type":"string"},"example":"48.857,2.352"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"to":{"lat":48.857,"lon":2.352},"from":{"lat":52.52,"lon":13.405},"compass":"WSW","final_bearing":238.18,"initial_bearing":246.75},"meta":{"timestamp":"2026-05-30T09:00:25.348Z","request_id":"e1f8c971-1ba0-467d-8843-3fd50fb10d77"},"status":"ok","message":"Bearing computed","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}},"/v1/destination":{"get":{"operationId":"get_v1_destination","tags":["Geo"],"summary":"Destination point","description":"","parameters":[{"name":"from","in":"query","required":true,"description":"Origin \"lat,lon\"","schema":{"type":"string"},"example":"52.520,13.405"},{"name":"bearing","in":"query","required":true,"description":"Bearing 0-360","schema":{"type":"string"},"example":"90"},{"name":"distance","in":"query","required":true,"description":"Distance","schema":{"type":"string"},"example":"100"},{"name":"unit","in":"query","required":false,"description":"km, m, mi, nmi","schema":{"type":"string"},"example":"km"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"from":{"lat":52.52,"lon":13.405},"unit":"km","bearing":90,"distance":100,"destination":{"lat":52.510796,"lon":14.882761}},"meta":{"timestamp":"2026-05-30T09:00:25.429Z","request_id":"e6a91f57-c2ca-4341-a11a-49a697a5fbad"},"status":"ok","message":"Destination computed","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}},"/v1/distance":{"get":{"operationId":"get_v1_distance","tags":["Geo"],"summary":"Great-circle distance","description":"","parameters":[{"name":"from","in":"query","required":true,"description":"Origin \"lat,lon\"","schema":{"type":"string"},"example":"52.520,13.405"},{"name":"to","in":"query","required":true,"description":"Destination \"lat,lon\"","schema":{"type":"string"},"example":"48.857,2.352"},{"name":"unit","in":"query","required":false,"description":"km, m, mi, nmi","schema":{"type":"string"},"example":"km"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"to":{"lat":48.857,"lon":2.352},"from":{"lat":52.52,"lon":13.405},"unit":"km","bearing":246.75,"distance":877.4535},"meta":{"timestamp":"2026-05-30T09:00:25.517Z","request_id":"9e0c1b09-e4a2-42e5-965d-e7aa575c5635"},"status":"ok","message":"Distance computed","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}},"/v1/midpoint":{"get":{"operationId":"get_v1_midpoint","tags":["Geo"],"summary":"Geographic midpoint","description":"","parameters":[{"name":"from","in":"query","required":true,"description":"Origin \"lat,lon\"","schema":{"type":"string"},"example":"52.520,13.405"},{"name":"to","in":"query","required":true,"description":"Destination \"lat,lon\"","schema":{"type":"string"},"example":"48.857,2.352"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"to":{"lat":48.857,"lon":2.352},"from":{"lat":52.52,"lon":13.405},"midpoint":{"lat":50.819089,"lon":7.66201}},"meta":{"timestamp":"2026-05-30T09:00:25.599Z","request_id":"58be2ffd-4604-43fd-80d1-2f7858dee173"},"status":"ok","message":"Midpoint computed","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}}},"x-oanor-pricing":[{"slug":"free","name":"Free","price_cents_month":0,"monthly_call_quota":9000,"rps_limit":3,"hard_limit":true},{"slug":"basic","name":"Basic","price_cents_month":500,"monthly_call_quota":110000,"rps_limit":12,"hard_limit":true},{"slug":"pro","name":"Pro","price_cents_month":1700,"monthly_call_quota":600000,"rps_limit":40,"hard_limit":true},{"slug":"mega","name":"Mega","price_cents_month":4600,"monthly_call_quota":3500000,"rps_limit":120,"hard_limit":true}],"x-oanor-marketplace-url":"https://www.oanor.com/api/geo-api"}