{"openapi":"3.1.0","info":{"title":"Set and Drift API","version":"1.0.0","description":"Current-sailing (set and drift) navigation maths as an API, computed locally and deterministically — the course-over-ground, course-to-steer and current numbers a mariner, navigator or marine app plots a passage with. The course-made-good endpoint adds the boat's velocity through the water to the current vector to give the real track: the course over ground (COG) and speed over ground (SOG), with the drift angle the current pushes you off your nose — steering 090° through the water at 10 knots with a 2-knot current setting north comes out around 079° over the ground at 10.2 knots. The course-to-steer endpoint solves the other way: the heading to steer to make good a desired ground track, steering up-current to cancel the across-track set (sin(H−T) = −drift·sin(set−track) ÷ speed), and the resulting SOG — usually slower into a current, faster with it astern, and impossible if the current across the track beats your speed. The current endpoint finds the set and drift from the offset between a dead-reckoning position and an observed fix: the set is the bearing DR-to-fix and the drift is that distance ÷ the elapsed time, ready to carry forward. Everything is computed locally and deterministically, so it is instant and private. Ideal for marine-navigation and chartplotter apps, sailing and boating tools, and maritime-training utilities. Pure local computation — no key, no third-party service, instant. Degrees true. 3 compute endpoints. For great-circle distance use a geo-distance API; for tide times a tides API.","contact":{"name":"PremiumApi","url":"https://www.oanor.com/by/premiumapi"}},"servers":[{"url":"https://api.oanor.com/setanddrift-api","description":"oanor gateway"}],"tags":[{"name":"Nav"},{"name":"Meta"}],"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/course-made-good":{"get":{"operationId":"get_v1_course_made_good","tags":["Nav"],"summary":"Course/speed over ground","description":"","parameters":[{"name":"heading_deg","in":"query","required":true,"description":"Heading through the water (°T)","schema":{"type":"string"},"example":"90"},{"name":"speed_through_water_kt","in":"query","required":true,"description":"Speed through water (knots)","schema":{"type":"string"},"example":"10"},{"name":"set_deg","in":"query","required":true,"description":"Current set — direction it flows toward (°T)","schema":{"type":"string"},"example":"0"},{"name":"drift_kt","in":"query","required":true,"description":"Current drift (knots)","schema":{"type":"string"},"example":"2"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK"},"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/course-to-steer":{"get":{"operationId":"get_v1_course_to_steer","tags":["Nav"],"summary":"Heading to steer for a track","description":"","parameters":[{"name":"desired_track_deg","in":"query","required":true,"description":"Desired ground track (°T)","schema":{"type":"string"},"example":"90"},{"name":"speed_through_water_kt","in":"query","required":true,"description":"Speed through water (knots)","schema":{"type":"string"},"example":"10"},{"name":"set_deg","in":"query","required":true,"description":"Current set (°T)","schema":{"type":"string"},"example":"0"},{"name":"drift_kt","in":"query","required":true,"description":"Current drift (knots)","schema":{"type":"string"},"example":"2"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK"},"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/current":{"get":{"operationId":"get_v1_current","tags":["Nav"],"summary":"Set & drift from a DR-to-fix offset","description":"","parameters":[{"name":"dr_to_fix_bearing_deg","in":"query","required":true,"description":"Bearing DR → fix (°T)","schema":{"type":"string"},"example":"45"},{"name":"dr_to_fix_distance_nm","in":"query","required":true,"description":"Distance DR → fix (nm)","schema":{"type":"string"},"example":"3"},{"name":"elapsed_hours","in":"query","required":true,"description":"Elapsed time (hours)","schema":{"type":"string"},"example":"2"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK"},"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/meta":{"get":{"operationId":"get_v1_meta","tags":["Meta"],"summary":"Spec","description":"","parameters":[],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK"},"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":5450,"rps_limit":2,"hard_limit":true},{"slug":"starter","name":"Starter","price_cents_month":1250,"monthly_call_quota":54500,"rps_limit":6,"hard_limit":true},{"slug":"pro","name":"Pro","price_cents_month":3950,"monthly_call_quota":229500,"rps_limit":15,"hard_limit":true},{"slug":"mega","name":"Mega","price_cents_month":12150,"monthly_call_quota":1145000,"rps_limit":40,"hard_limit":true}],"x-oanor-marketplace-url":"https://www.oanor.com/api/setanddrift-api"}