For points
{ "timezones": [ { "tz": "Europe/Paris", "offsetMin": 60 }, { "tz": "America/New_York", "offsetMin": -300 } ] }
offsetMin is minutes east of UTC at at, or now when it is left out. At sea, where no country's zone applies, the answer is the nautical zone, such as Etc/GMT-1, so every point gets a zone.
Along a route
POST /v1/route/timezones takes a GeoJSON route and returns each zone it passes with the kilometres where it starts and ends, for trip planners and ride logs that cross borders: [{"tz", "fromKm", "toKm", "offsetMin"}].
With the place name
GET /v1/where?lon=&lat=&lang= gives the country, region, town and nearest place for a point, the administrative areas it lies in, and its time zone, in the language you ask for where OpenStreetMap has the name. POST /v1/where takes up to 1,000 points.
Price
A batch counts as one request, whatever its size. The free plan gives 500 requests a day, also for commercial apps; Developer is $14.99 a month for 5,000 a day.
Credits: time zone boundaries from timezone-boundary-builder (ODbL); places © OpenStreetMap contributors (ODbL).