{"description":"Unified Rust/Actix-Web backend aggregating eleven microservice APIs, each under its own prefix with its own OpenAPI document.","global":{"docsIndex":"/docs","health":"/health","openapiIndex":"/openapi.json"},"name":"master-api","services":[{"dataSource":{"note":"Client profiles (WEB/ANDROID/IOS) with per-endpoint fallback chains, mirroring the original service.","provider":"YouTube InnerTube (public web client credentials scraped from the homepage)","requiresApiKey":false,"upstream":["https://www.youtube.com/youtubei/v1","https://www.youtube.com/"]},"description":"YouTube search, trending, video/channel/playlist details, transcripts, comments and related videos over YouTube's InnerTube API — no API key, no quota.","docs":"/docs/youtube","endpoints":[{"description":"Search videos/channels/playlists with type/sort/duration/upload-date filters","method":"GET","path":"/youtube/search"},{"description":"Body-driven search, for clients that cannot send long query strings","method":"POST","path":"/youtube/search"},{"description":"Trending videos","method":"GET","path":"/youtube/trending"},{"description":"Resolve a YouTube URL to its canonical target","method":"GET","path":"/youtube/resolve"},{"description":"Batch video lookup (id=a&id=b)","method":"GET","path":"/youtube/videos"},{"description":"Video details","method":"GET","path":"/youtube/videos/{id}"},{"description":"Stream formats","method":"GET","path":"/youtube/videos/{id}/formats"},{"description":"Caption track as transcript lines","method":"GET","path":"/youtube/videos/{id}/transcript"},{"description":"Comments with paging and ordering","method":"GET","path":"/youtube/videos/{id}/comments"},{"description":"Related videos","method":"GET","path":"/youtube/videos/{id}/related"},{"description":"Batch channel lookup (id=a&id=b)","method":"GET","path":"/youtube/channels"},{"description":"Channel details (id or @handle)","method":"GET","path":"/youtube/channels/{id}"},{"description":"Channel videos","method":"GET","path":"/youtube/channels/{id}/videos"},{"description":"Channel shorts","method":"GET","path":"/youtube/channels/{id}/shorts"},{"description":"Channel live streams","method":"GET","path":"/youtube/channels/{id}/live"},{"description":"Channel posts","method":"GET","path":"/youtube/channels/{id}/posts"},{"description":"Channel playlists","method":"GET","path":"/youtube/channels/{id}/playlists"},{"description":"Arbitrary channel tab","method":"GET","path":"/youtube/channels/{id}/tabs"},{"description":"Playlist details","method":"GET","path":"/youtube/playlists/{id}"},{"description":"Playlist videos","method":"GET","path":"/youtube/playlists/{id}/videos"},{"description":"Data-API-v3-style batch: id=a&id=b","method":"GET","path":"/youtube/v1/videos"},{"description":"Data-API-v3-style batch: id=a&id=b","method":"GET","path":"/youtube/v1/channels"},{"description":"Compat alias: ?id=","method":"GET","path":"/youtube/video"},{"description":"Compat alias: ?id=","method":"GET","path":"/youtube/channel"},{"description":"Compat alias: ?id=","method":"GET","path":"/youtube/channel/videos"},{"description":"Compat alias: ?id=","method":"GET","path":"/youtube/comments"},{"description":"Compat alias: ?id=","method":"GET","path":"/youtube/playlist"},{"description":"Liveness plus a real InnerTube probe","method":"GET","path":"/youtube/health"},{"description":"Readiness probe","method":"GET","path":"/youtube/health/ready"},{"description":"OpenAPI 3 document for this service","method":"GET","path":"/youtube/openapi.json"}],"health":"/youtube/health","name":"youtube-api","openapi":"/youtube/openapi.json","prefix":"/youtube","version":"1.0.0"},{"dataSource":{"note":"Requests are serialised with a 1.1s minimum spacing and cached per Open Library's usage guidelines.","provider":"Open Library (Internet Archive)","requiresApiKey":false,"upstream":["https://openlibrary.org","https://covers.openlibrary.org"]},"description":"Book search, work/author records, ISBN resolution and subject browsing over Open Library, plus a country reference listing.","docs":"/docs/books","endpoints":[{"description":"Search works (q/title/author/subject required)","method":"GET","path":"/books/books/search"},{"description":"ISBN-10/13 lookup with normalisation and check-digit validation","method":"GET","path":"/books/books/isbn/{isbn}"},{"description":"One work, e.g. OL45804W","method":"GET","path":"/books/books/{key}"},{"description":"Authors credited on a work, with resolved names","method":"GET","path":"/books/books/{key}/authors"},{"description":"One author, e.g. OL26320A","method":"GET","path":"/books/authors/{authorKey}"},{"description":"Browse the works under one subject","method":"GET","path":"/books/subjects"},{"description":"Country reference listing","method":"GET","path":"/books/countries"},{"description":"Liveness plus a real Open Library probe","method":"GET","path":"/books/health"},{"description":"Readiness probe","method":"GET","path":"/books/health/ready"},{"description":"OpenAPI 3 document for this service","method":"GET","path":"/books/openapi.json"}],"health":"/books/health","name":"book-api","openapi":"/books/openapi.json","prefix":"/books","version":"1.0.0"},{"dataSource":{"note":"The mledoze dataset is embedded in the binary; GeoNames countryInfo is refreshed at most once per TTL window.","provider":"mledoze/countries + GeoNames","requiresApiKey":false,"upstream":["https://raw.githubusercontent.com/mledoze/countries/master/countries.json","https://download.geonames.org/export/dump/countryInfo.txt"]},"description":"Country reference data (250 countries) with search, filters, sorting, pagination and neighbour resolution. Served from an embedded mledoze/countries snapshot joined with GeoNames countryInfo.","docs":"/docs/countries","endpoints":[{"description":"Static metadata about the dataset and the fields parameter","method":"GET","path":"/countries/fields"},{"description":"Reference aggregates: regions, subregions and continents","method":"GET","path":"/countries/regions"},{"description":"Search, filter, sort and paginate the whole dataset","method":"GET","path":"/countries/countries"},{"description":"One country by alpha-2/alpha-3/numeric/IOC code or name","method":"GET","path":"/countries/countries/{code}"},{"description":"Resolved border countries","method":"GET","path":"/countries/countries/{code}/neighbours"},{"description":"Currencies in circulation for a country","method":"GET","path":"/countries/countries/{code}/currencies"},{"description":"Official languages of a country","method":"GET","path":"/countries/countries/{code}/languages"},{"description":"Liveness plus a real snapshot load probe","method":"GET","path":"/countries/health"},{"description":"Readiness probe","method":"GET","path":"/countries/health/ready"},{"description":"OpenAPI 3 document for this service","method":"GET","path":"/countries/openapi.json"}],"health":"/countries/health","name":"countries-api","openapi":"/countries/openapi.json","prefix":"/countries","version":"1.0.0"},{"dataSource":{"note":"Reference rates are published on business days only, so a request for a weekend or public holiday is answered with the most recent preceding publication; every response reports the effective publication date alongside the requested one.","provider":"ECB","requiresApiKey":false,"upstream":["https://api.frankfurter.dev"]},"description":"Central bank reference exchange rates without an API key, plus amount conversion. Sourced from Frankfurter v2, pinned to the European Central Bank by default.","docs":"/docs/currency","endpoints":[{"description":"Latest reference rates for a base currency, optionally filtered","method":"GET","path":"/currency/rates/latest"},{"description":"Paginated list of the days a provider published rates","method":"GET","path":"/currency/rates/dates"},{"description":"Daily time series over a date window, grouped by publication date","method":"GET","path":"/currency/rates"},{"description":"An amount in one currency expressed in another","method":"GET","path":"/currency/convert"},{"description":"Reference list of supported currency codes","method":"GET","path":"/currency/currencies"},{"description":"A single currency. Unknown codes return 404.","method":"GET","path":"/currency/currencies/{code}"},{"description":"The data providers behind the rates, and which one is the default","method":"GET","path":"/currency/providers"},{"description":"Liveness plus a real upstream probe","method":"GET","path":"/currency/health"},{"description":"Readiness probe","method":"GET","path":"/currency/health/ready"},{"description":"OpenAPI 3 document for this service","method":"GET","path":"/currency/openapi.json"}],"health":"/currency/health","name":"currency-api","openapi":"/currency/openapi.json","prefix":"/currency","version":"1.0.0"},{"dataSource":{"note":"USGS responses are cached ~60s (matching their cache-control); air quality ~15min.","provider":"USGS FDSN Event Web Service","requiresApiKey":false,"upstream":["https://earthquake.usgs.gov/fdsnws/event/1","https://air-quality-api.open-meteo.com/v1/air-quality"]},"description":"Earthquake queries over the USGS FDSN Event Web Service (list with rectangle filters, aggregate summary with magnitude/energy/region breakdowns, single event by id), plus Open-Meteo air-quality forecasts and AQI classification.","docs":"/docs/earthquake","endpoints":[{"description":"Aggregate statistics over a window (magnitudes, buckets, regions, energy)","method":"GET","path":"/earthquake/summary"},{"description":"Current European/US AQI with named bands","method":"GET","path":"/earthquake/air-quality/aqi"},{"description":"Hourly air-quality forecast","method":"GET","path":"/earthquake/air-quality"},{"description":"One event by USGS id","method":"GET","path":"/earthquake/{id}"},{"description":"Filtered, paginated, stably sorted event list","method":"GET","path":"/earthquake"},{"description":"Liveness plus a real upstream probe","method":"GET","path":"/earthquake/health"},{"description":"Readiness probe","method":"GET","path":"/earthquake/health/ready"},{"description":"OpenAPI 3 document for this service","method":"GET","path":"/earthquake/openapi.json"}],"health":"/earthquake/health","name":"earthquake-api","openapi":"/earthquake/openapi.json","prefix":"/earthquake","version":"1.0.0"},{"dataSource":{"note":"Geolocation records are cached for an hour; address facts (/validate) are computed locally from the parsed address.","provider":"ipwho.is","requiresApiKey":false,"upstream":["https://ipwho.is"]},"description":"IP address intelligence: geolocation over the keyless ipwho.is provider, ASN/ISP details, field projection and local address classification (loopback/private/multicast/...).","docs":"/docs/ip-geolocation","endpoints":[{"description":"Look up the caller's address (X-Forwarded-For aware) with field projection","method":"GET","path":"/ip-geolocation/ip"},{"description":"Full geolocation record for one address, with field projection","method":"GET","path":"/ip-geolocation/ip/{address}"},{"description":"Geographic subset for one address","method":"GET","path":"/ip-geolocation/geo/{address}"},{"description":"ASN/ISP details for one address","method":"GET","path":"/ip-geolocation/asn/{address}"},{"description":"Local address facts: version, scope, loopback/private/multicast flags","method":"GET","path":"/ip-geolocation/validate/{address}"},{"description":"Liveness plus a real upstream probe","method":"GET","path":"/ip-geolocation/health"},{"description":"Readiness probe","method":"GET","path":"/ip-geolocation/health/ready"},{"description":"OpenAPI 3 document for this service","method":"GET","path":"/ip-geolocation/openapi.json"}],"health":"/ip-geolocation/health","name":"ip-geolocation-api","openapi":"/ip-geolocation/openapi.json","prefix":"/ip-geolocation","version":"1.0.0"},{"dataSource":{"note":"A country's dataset is downloaded at most once per TTL window and indexed in memory; the reference table is refreshed separately.","provider":"GeoNames","requiresApiKey":false,"upstream":["https://download.geonames.org/export/zip","https://download.geonames.org/export/dump/countryInfo.txt"]},"description":"Postal-code lookup, validation, place search and great-circle distance over the GeoNames postal datasets, with per-country reference data (formats, patterns, currency) from countryInfo.txt.","docs":"/docs/postal-code","endpoints":[{"description":"Search places by postal code or name, optionally within a radius","method":"GET","path":"/postal-code/search"},{"description":"Validate a code against its country's documented pattern","method":"GET","path":"/postal-code/validate/{country}/{postalCode}"},{"description":"Great-circle distance between two postal codes","method":"GET","path":"/postal-code/distance/{country}/{postalCode}/{country2}/{postalCode2}"},{"description":"Country reference list with filters","method":"GET","path":"/postal-code/countries"},{"description":"One country with its postal format rules","method":"GET","path":"/postal-code/countries/{code}"},{"description":"All places for one postal code","method":"GET","path":"/postal-code/{country}/{postalCode}"},{"description":"Liveness plus a real upstream probe","method":"GET","path":"/postal-code/health"},{"description":"Readiness probe","method":"GET","path":"/postal-code/health/ready"},{"description":"OpenAPI 3 document for this service","method":"GET","path":"/postal-code/openapi.json"}],"health":"/postal-code/health","name":"postal-code-api","openapi":"/postal-code/openapi.json","prefix":"/postal-code","version":"1.0.0"},{"dataSource":{"note":"Nager v4 serves 2025-2031 only; the upstream window is validated locally so out-of-range years are an instant, explanatory 400.","provider":"Nager.Date Community v4","requiresApiKey":false,"upstream":["https://date.nager.at"]},"description":"Worldwide public holidays with subdivision filtering, working-day computation and upcoming-holiday windows, backed by the Nager.Date Community API v4.","docs":"/docs/public-holidays","endpoints":[{"description":"Supported countries, with opt-in region counts","method":"GET","path":"/public-holidays/countries"},{"description":"Working days over a date range for one country","method":"GET","path":"/public-holidays/working-days"},{"description":"Next holidays for one country (365-day forward window)","method":"GET","path":"/public-holidays/holidays/upcoming"},{"description":"Whether a date is a public holiday for one country","method":"GET","path":"/public-holidays/holidays/is-holiday"},{"description":"Windowed holiday list across countries","method":"GET","path":"/public-holidays/holidays"},{"description":"One country's holidays for a year","method":"GET","path":"/public-holidays/holidays/{countryCode}"},{"description":"Subdivision-scope holidays for a country/year","method":"GET","path":"/public-holidays/holidays/{countryCode}/{year}"},{"description":"Liveness plus a real upstream probe","method":"GET","path":"/public-holidays/health"},{"description":"Readiness probe","method":"GET","path":"/public-holidays/health/ready"},{"description":"OpenAPI 3 document for this service","method":"GET","path":"/public-holidays/openapi.json"}],"health":"/public-holidays/health","name":"public-holidays-api","openapi":"/public-holidays/openapi.json","prefix":"/public-holidays","version":"1.0.0"},{"dataSource":{"note":"A feed (26 KB to 6 MB zip) is downloaded at most once per TTL window, on the first request that needs it; concurrent callers share one download.","provider":"GTFS Schedule publishers (per agency)","requiresApiKey":false,"upstream":["https://rrgtfsfeeds.s3.amazonaws.com/gtfs_subway.zip","https://eu.ftp.opendatasoft.com/sncf/plandata/Export_OpenData_SNCF_GTFS_NewTripId.zip","https://gtfs.sound.obaweb.org/prod/40_gtfs.zip","https://www.bart.gov/dev/schedules/google_transit.zip","https://gtfs.sound.obaweb.org/prod/96_gtfs.zip"]},"description":"Transit agencies, routes, stops and scheduled departures over keyless GTFS Schedule feeds (MTA Subway, SNCF Réseau, Sound Transit, BART, Seattle Monorail).","docs":"/docs/transit","endpoints":[{"description":"The agency registry, with search/country filter and paging","method":"GET","path":"/transit/agencies"},{"description":"One agency, plus its feed summary when cached","method":"GET","path":"/transit/agencies/{agencyId}"},{"description":"Routes of a feed, with search and route_type filter","method":"GET","path":"/transit/agencies/{agencyId}/routes"},{"description":"One route","method":"GET","path":"/transit/routes/{agencyId}/{routeId}"},{"description":"One stop","method":"GET","path":"/transit/stops/{agencyId}/{stopId}"},{"description":"Stops near a point, over cached feeds","method":"GET","path":"/transit/stops/nearby"},{"description":"Scheduled departures from a stop","method":"GET","path":"/transit/departures/{agencyId}/{stopId}"},{"description":"The GTFS route_type catalogue","method":"GET","path":"/transit/transport-modes"},{"description":"Liveness plus registry health","method":"GET","path":"/transit/health"},{"description":"Readiness probe","method":"GET","path":"/transit/health/ready"},{"description":"OpenAPI 3 document for this service","method":"GET","path":"/transit/openapi.json"}],"health":"/transit/health","name":"transit-api","openapi":"/transit/openapi.json","prefix":"/transit","version":"1.0.0"},{"dataSource":{"note":"The ~2 MB dataset is downloaded at most once per TTL window and fully indexed in memory.","provider":"Hipo university-domains-list","requiresApiKey":false,"upstream":["https://raw.githubusercontent.com/Hipo/university-domains-list/master/world_universities_and_domains.json"]},"description":"Searchable directory of world universities with stable ids, multi-country grouping and academic domain resolution, backed by the Hipo university-domains-list dataset.","docs":"/docs/university","endpoints":[{"description":"Search and paginate universities (name substring and/or country filter)","method":"GET","path":"/university/universities"},{"description":"Countries present in the dataset, with university counts","method":"GET","path":"/university/countries"},{"description":"Resolve an academic domain (or URL) to its institution","method":"GET","path":"/university/universities/domain/{domain}"},{"description":"One university by stable id","method":"GET","path":"/university/universities/{id}"},{"description":"Which countries an institution appears in","method":"GET","path":"/university/universities/{id}/countries"},{"description":"Liveness plus a real dataset probe","method":"GET","path":"/university/health"},{"description":"Readiness probe","method":"GET","path":"/university/health/ready"},{"description":"OpenAPI 3 document for this service","method":"GET","path":"/university/openapi.json"}],"health":"/university/health","name":"university-api","openapi":"/university/openapi.json","prefix":"/university","version":"1.0.0"},{"dataSource":{"note":"Responses are cached in-process; unit systems (standard/metric/imperial) are applied upstream.","provider":"Open-Meteo","requiresApiKey":false,"upstream":["https://api.open-meteo.com","https://archive-api.open-meteo.com","https://geocoding-api.open-meteo.com"]},"description":"Weather forecasts, historical archive, place geocoding, elevation lookups and a derived multi-point grid over the Open-Meteo family of APIs.","docs":"/docs/weather","endpoints":[{"description":"Current conditions for a point","method":"GET","path":"/weather/current"},{"description":"Hourly/daily forecast for a point","method":"GET","path":"/weather/forecast"},{"description":"Place search with sorting and pagination","method":"GET","path":"/weather/geocode/search"},{"description":"One place by GeoNames id","method":"GET","path":"/weather/places/{id}"},{"description":"Elevation for one or more points","method":"GET","path":"/weather/elevation"},{"description":"Current conditions across a bbox grid","method":"GET","path":"/weather/grid"},{"description":"ERA5/IFS reanalysis archive","method":"GET","path":"/weather/archive"},{"description":"Liveness plus a real upstream probe","method":"GET","path":"/weather/health"},{"description":"Readiness probe","method":"GET","path":"/weather/health/ready"},{"description":"OpenAPI 3 document for this service","method":"GET","path":"/weather/openapi.json"}],"health":"/weather/health","name":"weather-api","openapi":"/weather/openapi.json","prefix":"/weather","version":"1.0.0"}],"version":"1.0.0"}