@apifreaks/openapi-specs 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +156 -0
  3. package/dist/index.cjs +44663 -0
  4. package/dist/index.d.cts +30 -0
  5. package/dist/index.d.ts +30 -0
  6. package/dist/index.js +44631 -0
  7. package/package.json +81 -0
  8. package/specs/commodity/commodity-fluctuation.json +301 -0
  9. package/specs/commodity/commodity-prices.json +317 -0
  10. package/specs/commodity/commodity-symbols.json +215 -0
  11. package/specs/commodity/commodity-time-series.json +329 -0
  12. package/specs/commodity/historical-commodity-prices.json +273 -0
  13. package/specs/currency/currency-converter.json +261 -0
  14. package/specs/currency/currency-fluctuation.json +282 -0
  15. package/specs/currency/currency-historical-data-limit.json +158 -0
  16. package/specs/currency/currency-rate.json +229 -0
  17. package/specs/currency/currency-supported.json +234 -0
  18. package/specs/currency/currency-symbols.json +161 -0
  19. package/specs/currency/currency-time-series.json +325 -0
  20. package/specs/currency/geolocalized-currency-conversion.json +287 -0
  21. package/specs/currency/historical-currency-converter.json +269 -0
  22. package/specs/currency/historical-currency-rate.json +246 -0
  23. package/specs/dns/bulk-dns-lookup.json +624 -0
  24. package/specs/dns/dns-history-lookup.json +579 -0
  25. package/specs/dns/dns-lookup.json +466 -0
  26. package/specs/dns/reverse-dns-lookup.json +414 -0
  27. package/specs/domain/bulk-domain-checker.json +284 -0
  28. package/specs/domain/domain-search-with-suggestions.json +280 -0
  29. package/specs/domain/domain-search.json +206 -0
  30. package/specs/domain/subdomain-lookup.json +343 -0
  31. package/specs/email-validation/bulk-email-validation.json +534 -0
  32. package/specs/email-validation/email-checker.json +586 -0
  33. package/specs/financial/bulk-vat-rates-country.json +341 -0
  34. package/specs/financial/financial-apis-supported-countries.json +204 -0
  35. package/specs/financial/iban-validation.json +328 -0
  36. package/specs/financial/swift-code-finder.json +192 -0
  37. package/specs/financial/swift-code-lookup.json +220 -0
  38. package/specs/financial/vat-number-validation.json +283 -0
  39. package/specs/financial/vat-rates-by-ip.json +275 -0
  40. package/specs/financial/vat-rates-country.json +288 -0
  41. package/specs/general/usage-credits.json +218 -0
  42. package/specs/geocoding/forward-geocoding.json +402 -0
  43. package/specs/geocoding/reverse-geocoding.json +326 -0
  44. package/specs/geodb/administrative-units-details.json +250 -0
  45. package/specs/geodb/administrative-units-levels.json +198 -0
  46. package/specs/geodb/administrative-units.json +237 -0
  47. package/specs/geodb/cities.json +288 -0
  48. package/specs/geodb/countries-details.json +274 -0
  49. package/specs/geodb/countries.json +276 -0
  50. package/specs/geodb/flags-supported.json +166 -0
  51. package/specs/geodb/flags.json +227 -0
  52. package/specs/geodb/regions.json +109 -0
  53. package/specs/geodb/subregions.json +217 -0
  54. package/specs/ip-intelligence/bulk-ip-lookup.json +1162 -0
  55. package/specs/ip-intelligence/bulk-ip-threat-intelligence.json +417 -0
  56. package/specs/ip-intelligence/ip-locator.json +941 -0
  57. package/specs/ip-intelligence/ip-threat-intelligence.json +316 -0
  58. package/specs/other/astronomy-data.json +803 -0
  59. package/specs/pdf/delete-pdf-page.json +286 -0
  60. package/specs/pdf/linearize-pdf.json +277 -0
  61. package/specs/pdf/merge-pdf.json +285 -0
  62. package/specs/pdf/pdf-compress.json +304 -0
  63. package/specs/pdf/pdf-decrypt.json +297 -0
  64. package/specs/pdf/pdf-encrypt.json +314 -0
  65. package/specs/pdf/pdf-extract-pages.json +295 -0
  66. package/specs/pdf/pdf-file-status.json +208 -0
  67. package/specs/pdf/pdf-file.json +190 -0
  68. package/specs/pdf/pdf-files.json +126 -0
  69. package/specs/pdf/pdf-resource-download.json +168 -0
  70. package/specs/pdf/pdf-resource-upload-binary.json +218 -0
  71. package/specs/pdf/pdf-resource-upload.json +248 -0
  72. package/specs/pdf/pdf-restrict.json +343 -0
  73. package/specs/pdf/pdf-split-pages.json +281 -0
  74. package/specs/pdf/pdf-task-status.json +252 -0
  75. package/specs/pdf/pdf-to-image.json +1219 -0
  76. package/specs/pdf/pdf-unrestrict.json +324 -0
  77. package/specs/pdf/rotate-pdf-pages.json +305 -0
  78. package/specs/phone-validation/bulk-phone-number-validation.json +518 -0
  79. package/specs/phone-validation/phone-number-validation.json +456 -0
  80. package/specs/scraper/web-scraper.json +674 -0
  81. package/specs/screenshot/bulk-screenshot.json +949 -0
  82. package/specs/screenshot/website-screenshot.json +1147 -0
  83. package/specs/ssl/ssl-certificate-chain-lookup.json +756 -0
  84. package/specs/ssl/ssl-certificate-lookup.json +634 -0
  85. package/specs/timezone/timezone-converter.json +362 -0
  86. package/specs/timezone/timezone-lookup.json +910 -0
  87. package/specs/user-agent/bulk-user-agent-parser.json +441 -0
  88. package/specs/user-agent/user-agent-parser.json +346 -0
  89. package/specs/weather/air-quality.json +779 -0
  90. package/specs/weather/bulk-live-weather.json +834 -0
  91. package/specs/weather/flood-forecast.json +693 -0
  92. package/specs/weather/historical-weather.json +1019 -0
  93. package/specs/weather/live-weather.json +789 -0
  94. package/specs/weather/marine-weather.json +940 -0
  95. package/specs/weather/time-series-weather.json +1056 -0
  96. package/specs/weather/weather-forecast.json +1202 -0
  97. package/specs/whois/asn-lookup.json +729 -0
  98. package/specs/whois/bulk-whois-lookup.json +698 -0
  99. package/specs/whois/domain-whois-history-lookup.json +500 -0
  100. package/specs/whois/reverse-whois.json +625 -0
  101. package/specs/whois/whois-domain-lookup.json +533 -0
  102. package/specs/whois/whois-ip-lookup.json +1110 -0
  103. package/specs/zip-code/bulk-zip-code-lookup.json +318 -0
  104. package/specs/zip-code/zip-code-api.json +299 -0
  105. package/specs/zip-code/zip-code-distance-match.json +311 -0
  106. package/specs/zip-code/zip-code-distance.json +307 -0
  107. package/specs/zip-code/zip-codes-by-city.json +279 -0
  108. package/specs/zip-code/zip-codes-by-region.json +278 -0
  109. package/specs/zip-code/zip-codes-radius-search.json +349 -0
@@ -0,0 +1,940 @@
1
+ {
2
+ "openapi": "3.1.1",
3
+ "info": {
4
+ "title": "Marine Weather API - Ocean & Coastal Weather Data",
5
+ "version": "1.0.0",
6
+ "description": "Retrieve marine and ocean weather data for coastal and offshore locations by GPS coordinates, city name/address, or IP address. Returns wave height, wave direction, wave period, wind-wave and swell statistics, sea surface temperature, sea level height, and ocean current speed/direction. Omit `startDate`/`endDate` to get current conditions, or pass both to get a forecast up to 16 days ahead at `daily`, `hourly`, or `minutely` precision via the `precision` parameter. For locations with no nearby ocean data (inland cities, landlocked coordinates), the endpoint still returns a `200` response with every marine field set to `null` instead of an error.",
7
+ "contact": {
8
+ "name": "APIFreaks Support",
9
+ "url": "https://apifreaks.com/contact",
10
+ "email": "support@apifreaks.com"
11
+ }
12
+ },
13
+ "servers": [
14
+ {
15
+ "url": "https://api.apifreaks.com/v1.0/weather",
16
+ "description": "Marine Weather API Server"
17
+ }
18
+ ],
19
+ "paths": {
20
+ "/marine": {
21
+ "get": {
22
+ "tags": ["Weather APIs"],
23
+ "summary": "Dive into detailed marine weather forecasts for coastal and offshore locations",
24
+ "description": "Provides current or forecast marine conditions including wave height, wave direction, wave period, swell info, sea surface temperature, sea level height, and ocean currents. Accepts a location by GPS coordinates, city name/address, or IP address, and returns forecast data at daily, hourly, or minutely precision for up to 16 days ahead.",
25
+ "operationId": "getMarineWeather",
26
+ "parameters": [
27
+ {
28
+ "name": "format",
29
+ "in": "query",
30
+ "required": false,
31
+ "description": "Format of the response. Possible values: json.",
32
+ "schema": {
33
+ "type": "string",
34
+ "enum": ["json"],
35
+ "default": "json"
36
+ }
37
+ },
38
+ {
39
+ "name": "startDate",
40
+ "in": "query",
41
+ "required": false,
42
+ "description": "Starting date for marine forecast data in YYYY-MM-DD format. Must be today or a future date, and must be supplied together with endDate — providing only one of the two returns a 400 error. The difference between endDate and startDate must not exceed 16 days.",
43
+ "schema": {
44
+ "type": "string",
45
+ "format": "date"
46
+ }
47
+ },
48
+ {
49
+ "name": "endDate",
50
+ "in": "query",
51
+ "required": false,
52
+ "description": "End date for marine forecast data in YYYY-MM-DD format. Must be today or a future date, and must be supplied together with startDate — providing only one of the two returns a 400 error. The difference between endDate and startDate must not exceed 16 days.",
53
+ "schema": {
54
+ "type": "string",
55
+ "format": "date"
56
+ }
57
+ },
58
+ {
59
+ "name": "location",
60
+ "in": "query",
61
+ "required": false,
62
+ "description": "City name, place name, or full address.",
63
+ "schema": {
64
+ "type": "string"
65
+ }
66
+ },
67
+ {
68
+ "name": "lat",
69
+ "in": "query",
70
+ "required": false,
71
+ "description": "Latitude of the location.",
72
+ "schema": {
73
+ "type": "number"
74
+ }
75
+ },
76
+ {
77
+ "name": "long",
78
+ "in": "query",
79
+ "required": false,
80
+ "description": "Longitude of the location.",
81
+ "schema": {
82
+ "type": "number"
83
+ }
84
+ },
85
+ {
86
+ "name": "ip",
87
+ "in": "query",
88
+ "required": false,
89
+ "description": "IPv4, IPv6, or hostname for location inference. Defaults to the caller's IP address when location, lat/long, and ip are all omitted.",
90
+ "schema": {
91
+ "type": "string"
92
+ }
93
+ },
94
+ {
95
+ "name": "precision",
96
+ "in": "query",
97
+ "required": false,
98
+ "description": "Precision of the marine forecast data. Only one of daily, hourly, or minutely is returned per request, matching this value. Default is daily.",
99
+ "schema": {
100
+ "type": "string",
101
+ "enum": ["daily", "hourly", "minutely"],
102
+ "default": "daily"
103
+ }
104
+ },
105
+ {
106
+ "name": "timezone",
107
+ "in": "query",
108
+ "required": false,
109
+ "description": "IANA timezone identifier used to localize the results (e.g. America/New_York). Returns a 400 error if not a recognized timezone.",
110
+ "schema": {
111
+ "type": "string"
112
+ }
113
+ }
114
+ ],
115
+ "responses": {
116
+ "200": {
117
+ "description": "Successful response — current marine conditions or a date-keyed forecast",
118
+ "content": {
119
+ "application/json": {
120
+ "schema": {
121
+ "$ref": "#/components/schemas/MarineResponse"
122
+ },
123
+ "examples": {
124
+ "currentConditions": {
125
+ "summary": "Current conditions (no date range)",
126
+ "value": {
127
+ "location": {
128
+ "latitude": "51.50000",
129
+ "longitude": "2.00000",
130
+ "country_name": "United Kingdom",
131
+ "state_prov": "",
132
+ "city": "",
133
+ "locality": "",
134
+ "elevation": "",
135
+ "timezone": "Etc/GMT",
136
+ "timezone_abbreviation": "GMT"
137
+ },
138
+ "current": {
139
+ "timestamp": "2026-07-24T11:30",
140
+ "wave_height": 0.52,
141
+ "wave_direction": 12,
142
+ "wave_period": 5.75,
143
+ "wind_wave_peak_period": 0.95,
144
+ "wind_wave_height": 0,
145
+ "wind_wave_direction": 220,
146
+ "wind_wave_period": 0,
147
+ "swell_wave_height": 0.52,
148
+ "swell_wave_direction": 13,
149
+ "swell_wave_period": 5.05,
150
+ "swell_wave_peak_period": 6.3,
151
+ "sea_level_height_msl": -1.04,
152
+ "sea_surface_temperature": 20.5,
153
+ "ocean_current_velocity": 0.4,
154
+ "ocean_current_direction": 117
155
+ }
156
+ }
157
+ },
158
+ "inlandLocationNullData": {
159
+ "summary": "Inland location — all marine fields null",
160
+ "value": {
161
+ "location": {
162
+ "location_string": "Denver, Colorado",
163
+ "country_name": "United States",
164
+ "state_prov": "Colorado",
165
+ "city": "Denver",
166
+ "locality": "",
167
+ "latitude": "39.73924",
168
+ "longitude": "-104.98486",
169
+ "elevation": "1609",
170
+ "timezone": "America/Denver",
171
+ "timezone_abbreviation": "GMT-6"
172
+ },
173
+ "current": {
174
+ "timestamp": "2026-07-24T05:30",
175
+ "wave_height": null,
176
+ "wave_direction": null,
177
+ "wave_period": null,
178
+ "wind_wave_peak_period": null,
179
+ "wind_wave_height": null,
180
+ "wind_wave_direction": null,
181
+ "wind_wave_period": null,
182
+ "swell_wave_height": null,
183
+ "swell_wave_direction": null,
184
+ "swell_wave_period": null,
185
+ "sea_level_height_msl": null,
186
+ "sea_surface_temperature": null,
187
+ "ocean_current_velocity": null,
188
+ "ocean_current_direction": null
189
+ }
190
+ }
191
+ },
192
+ "dailyForecast": {
193
+ "summary": "Daily forecast (startDate/endDate set)",
194
+ "value": {
195
+ "location": {
196
+ "latitude": "51.50000",
197
+ "longitude": "2.00000",
198
+ "country_name": "United Kingdom",
199
+ "state_prov": "",
200
+ "city": "",
201
+ "locality": "",
202
+ "elevation": "",
203
+ "timezone": "Etc/GMT",
204
+ "timezone_abbreviation": "GMT"
205
+ },
206
+ "forecast": {
207
+ "2026-07-25": {
208
+ "daily": {
209
+ "timestamp": "2026-07-25",
210
+ "wave_height_max": 0.84,
211
+ "wave_direction_dominant": 278,
212
+ "wave_period_max": 4.05,
213
+ "wind_wave_height_max": 0.78,
214
+ "wind_wave_direction_dominant": 231,
215
+ "wind_wave_period_max": 3.3,
216
+ "wind_wave_peak_period_max": 4.3,
217
+ "swell_wave_height_max": 0.56,
218
+ "swell_wave_direction_dominant": 4,
219
+ "swell_wave_period_max": 4.85,
220
+ "swell_wave_peak_period_max": 6.3
221
+ }
222
+ },
223
+ "2026-07-26": {
224
+ "daily": {
225
+ "timestamp": "2026-07-26",
226
+ "wave_height_max": 1.02,
227
+ "wave_direction_dominant": 238,
228
+ "wave_period_max": 4.65,
229
+ "wind_wave_height_max": 0.8,
230
+ "wind_wave_direction_dominant": 269,
231
+ "wind_wave_period_max": 3.3,
232
+ "wind_wave_peak_period_max": 5.2,
233
+ "swell_wave_height_max": 0.86,
234
+ "swell_wave_direction_dominant": 218,
235
+ "swell_wave_period_max": 4.7,
236
+ "swell_wave_peak_period_max": 6.3
237
+ }
238
+ }
239
+ }
240
+ }
241
+ }
242
+ }
243
+ }
244
+ }
245
+ },
246
+ "400": {
247
+ "description": "Bad Request — invalid or incomplete parameters",
248
+ "content": {
249
+ "application/json": {
250
+ "schema": {
251
+ "$ref": "#/components/schemas/ErrorResponse"
252
+ },
253
+ "examples": {
254
+ "invalidCoordinates": {
255
+ "summary": "Invalid latitude/longitude",
256
+ "value": {
257
+ "timestamp": "2026-07-24T11:35:05.439Z",
258
+ "status": 400,
259
+ "message": "Invalid latitude or longitude values. Latitude must be between -90 and 90, and longitude must be between -180 and 180",
260
+ "error": "invalid-params",
261
+ "path": "/v1.0/weather/marine"
262
+ }
263
+ },
264
+ "invalidIp": {
265
+ "summary": "Invalid IP address",
266
+ "value": {
267
+ "timestamp": "2026-07-24T11:35:18.421Z",
268
+ "status": 400,
269
+ "message": "Invalid IP address",
270
+ "error": "invalid-params",
271
+ "path": "/v1.0/weather/marine"
272
+ }
273
+ },
274
+ "invalidPrecision": {
275
+ "summary": "Invalid precision value",
276
+ "value": {
277
+ "timestamp": "2026-07-24T11:35:19.621Z",
278
+ "status": 400,
279
+ "message": "Invalid precision",
280
+ "error": "invalid-params",
281
+ "path": "/v1.0/weather/marine"
282
+ }
283
+ },
284
+ "invalidTimezone": {
285
+ "summary": "Invalid timezone",
286
+ "value": {
287
+ "timestamp": "2026-07-24T11:35:20.399Z",
288
+ "status": 400,
289
+ "message": "Invalid timezone",
290
+ "error": "error",
291
+ "path": "/v1.0/weather/marine"
292
+ }
293
+ },
294
+ "dateRangeExceeded": {
295
+ "summary": "Forecast range exceeds 16 days",
296
+ "value": {
297
+ "timestamp": "2026-07-24T11:35:05.950Z",
298
+ "status": 400,
299
+ "message": "Forecast date range must be within 2026-07-24 to 2026-08-08",
300
+ "error": "params-exception-error",
301
+ "path": "/v1.0/weather/marine"
302
+ }
303
+ },
304
+ "incompleteDateRange": {
305
+ "summary": "Only one of startDate/endDate supplied",
306
+ "value": {
307
+ "error": "Invalid Param Exception",
308
+ "message": "please pass correct parameters",
309
+ "path": "/v1.0/weather/marine",
310
+ "status": 400,
311
+ "timestamp": "2026-07-24T11:35:30.525Z"
312
+ }
313
+ }
314
+ }
315
+ }
316
+ }
317
+ },
318
+ "404": {
319
+ "description": "Not Found — location could not be resolved",
320
+ "content": {
321
+ "application/json": {
322
+ "schema": {
323
+ "$ref": "#/components/schemas/ErrorResponse"
324
+ },
325
+ "examples": {
326
+ "locationNotFound": {
327
+ "summary": "Location not found",
328
+ "value": {
329
+ "timestamp": "2026-07-24T11:35:17.921Z",
330
+ "status": 404,
331
+ "message": "Location not found",
332
+ "error": "error",
333
+ "path": "/v1.0/weather/marine"
334
+ }
335
+ }
336
+ }
337
+ }
338
+ }
339
+ }
340
+ }
341
+ }
342
+ }
343
+ },
344
+ "components": {
345
+ "securitySchemes": {
346
+ "ApiKeyAuthHeader": {
347
+ "type": "apiKey",
348
+ "in": "header",
349
+ "name": "X-apiKey",
350
+ "description": "Pass your API key via the X-apiKey request header."
351
+ },
352
+ "ApiKeyAuthQuery": {
353
+ "type": "apiKey",
354
+ "in": "query",
355
+ "name": "apiKey",
356
+ "description": "Pass your API key via the apiKey query parameter."
357
+ }
358
+ },
359
+ "schemas": {
360
+ "MarineResponse": {
361
+ "type": "object",
362
+ "description": "Marine weather response. current and forecast are mutually exclusive: current is returned when startDate/endDate are omitted, forecast is returned when both are supplied. location is always present.",
363
+ "required": ["location"],
364
+ "properties": {
365
+ "location": {
366
+ "$ref": "#/components/schemas/WeatherLocation"
367
+ },
368
+ "current": {
369
+ "$ref": "#/components/schemas/CurrentMarine",
370
+ "description": "Current marine conditions. Present only when startDate/endDate are not supplied."
371
+ },
372
+ "forecast": {
373
+ "$ref": "#/components/schemas/MarineForecastData",
374
+ "description": "Date-keyed forecast data. Present only when startDate and endDate are both supplied."
375
+ }
376
+ }
377
+ },
378
+ "LocationByCoordinates": {
379
+ "type": "object",
380
+ "description": "Location data when the target is specified by GPS coordinates (lat/long).",
381
+ "required": [
382
+ "latitude",
383
+ "longitude",
384
+ "country_name",
385
+ "state_prov",
386
+ "city",
387
+ "timezone",
388
+ "timezone_abbreviation"
389
+ ],
390
+ "properties": {
391
+ "latitude": {
392
+ "type": "string",
393
+ "description": "Geographic latitude coordinate in decimal degrees, ranging from -90 (South Pole) to +90 (North Pole). Returned as a string, not a number."
394
+ },
395
+ "longitude": {
396
+ "type": "string",
397
+ "description": "Geographic longitude coordinate in decimal degrees, ranging from -180 (West) to +180 (East). Returned as a string, not a number."
398
+ },
399
+ "country_name": {
400
+ "type": "string",
401
+ "description": "Full name of the country corresponding to the provided coordinates."
402
+ },
403
+ "state_prov": {
404
+ "type": "string",
405
+ "description": "State, province, or primary administrative division name for the location. Can be an empty string."
406
+ },
407
+ "city": {
408
+ "type": "string",
409
+ "description": "City or municipal area name associated with the coordinate location. Can be an empty string."
410
+ },
411
+ "locality": {
412
+ "type": "string",
413
+ "description": "Specific locality, neighborhood, district, or village name within the broader area. Can be an empty string."
414
+ },
415
+ "elevation": {
416
+ "type": "string",
417
+ "description": "Height above mean sea level in meters for the specified coordinates. Returned as a string, not a number, and can be an empty string when unavailable."
418
+ },
419
+ "timezone": {
420
+ "type": "string",
421
+ "description": "IANA timezone database identifier for the location (e.g., America/New_York, Europe/London)."
422
+ },
423
+ "timezone_abbreviation": {
424
+ "type": "string",
425
+ "description": "Abbreviated timezone representation based on current offset (e.g., EST, GMT, PST)."
426
+ }
427
+ }
428
+ },
429
+ "LocationByIP": {
430
+ "type": "object",
431
+ "description": "Location data when the target is inferred from an IP address.",
432
+ "required": [
433
+ "continent_code",
434
+ "continent_name",
435
+ "country_code2",
436
+ "country_code3",
437
+ "country_name",
438
+ "country_name_official",
439
+ "state_prov",
440
+ "city",
441
+ "latitude",
442
+ "longitude",
443
+ "timezone",
444
+ "timezone_abbreviation"
445
+ ],
446
+ "properties": {
447
+ "continent_code": {
448
+ "type": "string",
449
+ "description": "Two-letter continent code (e.g., NA for North America, EU for Europe, AS for Asia)."
450
+ },
451
+ "continent_name": {
452
+ "type": "string",
453
+ "description": "Full name of the continent where the IP address is registered."
454
+ },
455
+ "country_code2": {
456
+ "type": "string",
457
+ "description": "ISO 3166-1 alpha-2 two-letter country code (e.g., US, GB, FR)."
458
+ },
459
+ "country_code3": {
460
+ "type": "string",
461
+ "description": "ISO 3166-1 alpha-3 three-letter country code (e.g., USA, GBR, FRA)."
462
+ },
463
+ "country_name": {
464
+ "type": "string",
465
+ "description": "Common name of the country associated with the IP address."
466
+ },
467
+ "country_name_official": {
468
+ "type": "string",
469
+ "description": "Official long-form country name as recognized internationally (e.g., United States of America)."
470
+ },
471
+ "is_eu": {
472
+ "type": "boolean",
473
+ "description": "Boolean flag indicating whether the country is a member state of the European Union."
474
+ },
475
+ "state_prov": {
476
+ "type": "string",
477
+ "description": "State, province, or primary administrative division associated with the IP location."
478
+ },
479
+ "state_code": {
480
+ "type": "string",
481
+ "description": "ISO 3166-2 subdivision code for the state or province (e.g., CA for California)."
482
+ },
483
+ "district": {
484
+ "type": "string",
485
+ "description": "District, county, or secondary administrative division within the region. Can be an empty string."
486
+ },
487
+ "city": {
488
+ "type": "string",
489
+ "description": "City or urban area name where the IP address is geographically registered."
490
+ },
491
+ "zipcode": {
492
+ "type": "string",
493
+ "description": "Postal code or ZIP code for the approximate location of the IP address. Can be an empty string."
494
+ },
495
+ "latitude": {
496
+ "type": "string",
497
+ "description": "Geographic latitude in decimal degrees for the IP geolocation, ranging from -90 to +90. Returned as a string, not a number."
498
+ },
499
+ "longitude": {
500
+ "type": "string",
501
+ "description": "Geographic longitude in decimal degrees for the IP geolocation, ranging from -180 to +180. Returned as a string, not a number."
502
+ },
503
+ "locality": {
504
+ "type": "string",
505
+ "description": "Specific locality, neighborhood, or small area designation within the city. Can be an empty string."
506
+ },
507
+ "elevation": {
508
+ "type": "string",
509
+ "description": "Elevation above mean sea level in meters for the IP geolocation. Returned as a string, not a number, and can be an empty string when unavailable."
510
+ },
511
+ "timezone": {
512
+ "type": "string",
513
+ "description": "IANA timezone database identifier for the IP location (e.g., America/Chicago, Asia/Tokyo)."
514
+ },
515
+ "timezone_abbreviation": {
516
+ "type": "string",
517
+ "description": "Current timezone abbreviation based on local offset (e.g., CST, JST, UTC)."
518
+ }
519
+ }
520
+ },
521
+ "LocationByAddress": {
522
+ "type": "object",
523
+ "description": "Location data when the target is specified by a city name or address string.",
524
+ "required": [
525
+ "location_string",
526
+ "country_name",
527
+ "state_prov",
528
+ "city",
529
+ "latitude",
530
+ "longitude",
531
+ "timezone",
532
+ "timezone_abbreviation"
533
+ ],
534
+ "properties": {
535
+ "location_string": {
536
+ "type": "string",
537
+ "description": "Original location query string as submitted, including full address or place name."
538
+ },
539
+ "country_name": {
540
+ "type": "string",
541
+ "description": "Resolved country name derived from the geocoded location query."
542
+ },
543
+ "state_prov": {
544
+ "type": "string",
545
+ "description": "State, province, or primary administrative division identified from the location."
546
+ },
547
+ "city": {
548
+ "type": "string",
549
+ "description": "City or municipal area name extracted from the geocoded location."
550
+ },
551
+ "locality": {
552
+ "type": "string",
553
+ "description": "Specific locality, neighborhood, suburb, or village within the geocoded area. Can be an empty string."
554
+ },
555
+ "latitude": {
556
+ "type": "string",
557
+ "description": "Geocoded latitude coordinate in decimal degrees, ranging from -90 to +90. Returned as a string, not a number."
558
+ },
559
+ "longitude": {
560
+ "type": "string",
561
+ "description": "Geocoded longitude coordinate in decimal degrees, ranging from -180 to +180. Returned as a string, not a number."
562
+ },
563
+ "elevation": {
564
+ "type": "string",
565
+ "description": "Elevation above mean sea level in meters at the geocoded coordinates. Returned as a string, not a number."
566
+ },
567
+ "timezone": {
568
+ "type": "string",
569
+ "description": "IANA timezone database identifier for the geocoded location (e.g., America/Los_Angeles)."
570
+ },
571
+ "timezone_abbreviation": {
572
+ "type": "string",
573
+ "description": "Current timezone abbreviation for the location based on local offset (e.g., PDT, CET)."
574
+ }
575
+ }
576
+ },
577
+ "CurrentMarine": {
578
+ "type": "object",
579
+ "description": "Current marine weather conditions including wave, swell, sea level, and current data. For locations with no nearby ocean data (inland/landlocked), every field below timestamp is returned as null instead of an error.",
580
+ "required": [
581
+ "timestamp",
582
+ "wave_height",
583
+ "wave_direction",
584
+ "wave_period",
585
+ "wind_wave_height",
586
+ "wind_wave_direction",
587
+ "wind_wave_period",
588
+ "wind_wave_peak_period",
589
+ "swell_wave_height",
590
+ "swell_wave_direction",
591
+ "swell_wave_period",
592
+ "swell_wave_peak_period",
593
+ "sea_level_height_msl",
594
+ "sea_surface_temperature",
595
+ "ocean_current_velocity",
596
+ "ocean_current_direction"
597
+ ],
598
+ "properties": {
599
+ "timestamp": {
600
+ "type": "string",
601
+ "format": "date-time",
602
+ "description": "ISO 8601 formatted timestamp of the current observation."
603
+ },
604
+ "wave_height": {
605
+ "type": ["number", "null"],
606
+ "description": "Significant height of combined sea waves in meters. Null where no ocean data is available for this location."
607
+ },
608
+ "wave_direction": {
609
+ "type": ["number", "null"],
610
+ "description": "Direction from which the combined waves are coming, in degrees. Null where no ocean data is available for this location."
611
+ },
612
+ "wave_period": {
613
+ "type": ["number", "null"],
614
+ "description": "Average period of combined sea waves in seconds. Null where no ocean data is available for this location."
615
+ },
616
+ "wind_wave_height": {
617
+ "type": ["number", "null"],
618
+ "description": "Height of locally generated wind waves in meters. Null where no ocean data is available for this location."
619
+ },
620
+ "wind_wave_direction": {
621
+ "type": ["number", "null"],
622
+ "description": "Direction from which the wind waves are coming, in degrees. Null where no ocean data is available for this location."
623
+ },
624
+ "wind_wave_period": {
625
+ "type": ["number", "null"],
626
+ "description": "Average period of locally generated wind waves in seconds. Null where no ocean data is available for this location."
627
+ },
628
+ "wind_wave_peak_period": {
629
+ "type": ["number", "null"],
630
+ "description": "Peak period of locally generated wind waves in seconds. Frequently null even at locations with other wave data present."
631
+ },
632
+ "swell_wave_height": {
633
+ "type": ["number", "null"],
634
+ "description": "Height of swell waves in meters. Null where no ocean data is available for this location."
635
+ },
636
+ "swell_wave_direction": {
637
+ "type": ["number", "null"],
638
+ "description": "Direction from which the swell waves are coming, in degrees. Null where no ocean data is available for this location."
639
+ },
640
+ "swell_wave_period": {
641
+ "type": ["number", "null"],
642
+ "description": "Average period of swell waves in seconds. Null where no ocean data is available for this location."
643
+ },
644
+ "swell_wave_peak_period": {
645
+ "type": ["number", "null"],
646
+ "description": "Peak period of swell waves in seconds. Frequently null even at locations with other wave data present."
647
+ },
648
+ "sea_level_height_msl": {
649
+ "type": ["number", "null"],
650
+ "description": "Sea level height relative to mean sea level in meters. Null where no ocean data is available for this location."
651
+ },
652
+ "sea_surface_temperature": {
653
+ "type": ["number", "null"],
654
+ "description": "Temperature of the ocean surface in degrees Celsius. Null where no ocean data is available for this location."
655
+ },
656
+ "ocean_current_velocity": {
657
+ "type": ["number", "null"],
658
+ "description": "Speed of the ocean current in km/h. Null where no ocean data is available for this location."
659
+ },
660
+ "ocean_current_direction": {
661
+ "type": ["number", "null"],
662
+ "description": "Direction of the ocean current, in degrees. Null where no ocean data is available for this location."
663
+ }
664
+ }
665
+ },
666
+ "MarineDaily": {
667
+ "type": "object",
668
+ "description": "Daily marine forecast summary with wave, wind-wave, and swell statistics for one day.",
669
+ "required": [
670
+ "timestamp",
671
+ "wave_height_max",
672
+ "wave_direction_dominant",
673
+ "wave_period_max",
674
+ "wind_wave_height_max",
675
+ "wind_wave_direction_dominant",
676
+ "wind_wave_period_max",
677
+ "wind_wave_peak_period_max",
678
+ "swell_wave_height_max",
679
+ "swell_wave_direction_dominant",
680
+ "swell_wave_period_max",
681
+ "swell_wave_peak_period_max"
682
+ ],
683
+ "properties": {
684
+ "timestamp": {
685
+ "type": "string",
686
+ "format": "date",
687
+ "description": "Date of this forecast entry in YYYY-MM-DD format."
688
+ },
689
+ "wave_height_max": {
690
+ "type": ["number", "null"],
691
+ "description": "Maximum significant wave height for the day, in meters."
692
+ },
693
+ "wave_direction_dominant": {
694
+ "type": ["integer", "null"],
695
+ "description": "Dominant direction of waves for the day, in degrees."
696
+ },
697
+ "wave_period_max": {
698
+ "type": ["number", "null"],
699
+ "description": "Maximum wave period for the day, in seconds."
700
+ },
701
+ "wind_wave_height_max": {
702
+ "type": ["number", "null"],
703
+ "description": "Maximum wind-driven wave height for the day, in meters."
704
+ },
705
+ "wind_wave_direction_dominant": {
706
+ "type": ["integer", "null"],
707
+ "description": "Dominant wind-wave direction for the day, in degrees."
708
+ },
709
+ "wind_wave_period_max": {
710
+ "type": ["number", "null"],
711
+ "description": "Maximum wind-wave period for the day, in seconds."
712
+ },
713
+ "wind_wave_peak_period_max": {
714
+ "type": ["number", "null"],
715
+ "description": "Maximum peak period of wind-driven waves for the day, in seconds. Frequently null."
716
+ },
717
+ "swell_wave_height_max": {
718
+ "type": ["number", "null"],
719
+ "description": "Maximum swell wave height for the day, in meters."
720
+ },
721
+ "swell_wave_direction_dominant": {
722
+ "type": ["integer", "null"],
723
+ "description": "Dominant swell wave direction for the day, in degrees."
724
+ },
725
+ "swell_wave_period_max": {
726
+ "type": ["number", "null"],
727
+ "description": "Maximum swell wave period for the day, in seconds."
728
+ },
729
+ "swell_wave_peak_period_max": {
730
+ "type": ["number", "null"],
731
+ "description": "Maximum peak period of swell waves for the day, in seconds. Frequently null."
732
+ }
733
+ }
734
+ },
735
+ "MarineHourly": {
736
+ "type": "object",
737
+ "description": "Hourly marine weather reading with wave, swell, and sea surface data for a single hour.",
738
+ "required": [
739
+ "timestamp",
740
+ "wave_height",
741
+ "wave_direction",
742
+ "wave_period",
743
+ "wind_wave_height",
744
+ "wind_wave_peak_period",
745
+ "wind_wave_direction",
746
+ "wind_wave_period",
747
+ "swell_wave_height",
748
+ "swell_wave_direction",
749
+ "swell_wave_period",
750
+ "swell_wave_peak_period",
751
+ "sea_surface_temperature",
752
+ "sea_level_height_msl",
753
+ "ocean_current_velocity",
754
+ "ocean_current_direction"
755
+ ],
756
+ "properties": {
757
+ "timestamp": {
758
+ "type": "string",
759
+ "format": "date-time",
760
+ "description": "ISO 8601 formatted timestamp of this hourly entry."
761
+ },
762
+ "wave_height": {
763
+ "type": ["number", "null"],
764
+ "description": "Significant wave height at the given hour, in meters."
765
+ },
766
+ "wave_direction": {
767
+ "type": ["integer", "null"],
768
+ "description": "Wave direction at the given hour, in degrees."
769
+ },
770
+ "wave_period": {
771
+ "type": ["number", "null"],
772
+ "description": "Wave period at the given hour, in seconds."
773
+ },
774
+ "wind_wave_height": {
775
+ "type": ["number", "null"],
776
+ "description": "Wind-driven wave height at the given hour, in meters."
777
+ },
778
+ "wind_wave_peak_period": {
779
+ "type": ["number", "null"],
780
+ "description": "Peak period of wind-driven waves at the given hour, in seconds."
781
+ },
782
+ "wind_wave_direction": {
783
+ "type": ["integer", "null"],
784
+ "description": "Wind-wave direction at the given hour, in degrees."
785
+ },
786
+ "wind_wave_period": {
787
+ "type": ["number", "null"],
788
+ "description": "Wind-wave period at the given hour, in seconds."
789
+ },
790
+ "swell_wave_height": {
791
+ "type": ["number", "null"],
792
+ "description": "Swell wave height at the given hour, in meters."
793
+ },
794
+ "swell_wave_direction": {
795
+ "type": ["integer", "null"],
796
+ "description": "Swell wave direction at the given hour, in degrees."
797
+ },
798
+ "swell_wave_period": {
799
+ "type": ["number", "null"],
800
+ "description": "Swell wave period at the given hour, in seconds."
801
+ },
802
+ "swell_wave_peak_period": {
803
+ "type": ["number", "null"],
804
+ "description": "Peak period of swell waves at the given hour, in seconds."
805
+ },
806
+ "sea_surface_temperature": {
807
+ "type": ["number", "null"],
808
+ "description": "Sea surface temperature at the given hour, in degrees Celsius."
809
+ },
810
+ "sea_level_height_msl": {
811
+ "type": ["number", "null"],
812
+ "description": "Sea level height relative to mean sea level at the given hour, in meters."
813
+ },
814
+ "ocean_current_velocity": {
815
+ "type": ["number", "null"],
816
+ "description": "Speed of ocean current at the given hour, in km/h."
817
+ },
818
+ "ocean_current_direction": {
819
+ "type": ["integer", "null"],
820
+ "description": "Direction of ocean current at the given hour, in degrees."
821
+ }
822
+ }
823
+ },
824
+ "MarineMinutely": {
825
+ "type": "object",
826
+ "description": "Minute-by-minute marine data point for ocean current and sea level measurements.",
827
+ "required": [
828
+ "timestamp",
829
+ "ocean_current_velocity",
830
+ "ocean_current_direction",
831
+ "sea_level_height_msl"
832
+ ],
833
+ "properties": {
834
+ "timestamp": {
835
+ "type": "string",
836
+ "format": "date-time",
837
+ "description": "ISO 8601 formatted timestamp of this minute-level entry."
838
+ },
839
+ "ocean_current_velocity": {
840
+ "type": ["number", "null"],
841
+ "description": "Speed of ocean current at this minute, in km/h."
842
+ },
843
+ "ocean_current_direction": {
844
+ "type": ["integer", "null"],
845
+ "description": "Direction of ocean current at this minute, in degrees."
846
+ },
847
+ "sea_level_height_msl": {
848
+ "type": ["number", "null"],
849
+ "description": "Sea level height relative to mean sea level at this minute, in meters."
850
+ }
851
+ }
852
+ },
853
+ "ErrorResponse": {
854
+ "type": "object",
855
+ "description": "Standard error envelope returned by the API on failed requests.",
856
+ "required": ["message"],
857
+ "properties": {
858
+ "error": {
859
+ "type": "string",
860
+ "description": "Short error category or exception type."
861
+ },
862
+ "message": {
863
+ "type": "string",
864
+ "description": "Human-readable error message describing the failure."
865
+ },
866
+ "path": {
867
+ "type": "string",
868
+ "description": "API endpoint path that produced the error."
869
+ },
870
+ "status": {
871
+ "type": "integer",
872
+ "description": "HTTP status code returned with the error."
873
+ },
874
+ "timestamp": {
875
+ "type": "string",
876
+ "format": "date-time",
877
+ "description": "Timestamp when the error occurred (ISO 8601)."
878
+ }
879
+ }
880
+ },
881
+ "WeatherLocation": {
882
+ "type": "object",
883
+ "description": "Location information. Shape depends on how the location was resolved (coordinates, IP, or address/city name).",
884
+ "oneOf": [
885
+ {
886
+ "description": "Location data when the target is specified by GPS coordinates (lat/long).",
887
+ "$ref": "#/components/schemas/LocationByCoordinates"
888
+ },
889
+ {
890
+ "description": "Location data when the target is inferred from an IP address.",
891
+ "$ref": "#/components/schemas/LocationByIP"
892
+ },
893
+ {
894
+ "description": "Location data when the target is specified by a city name or address string.",
895
+ "$ref": "#/components/schemas/LocationByAddress"
896
+ }
897
+ ]
898
+ },
899
+ "MarineForecastData": {
900
+ "type": "object",
901
+ "description": "Forecast data keyed by date (YYYY-MM-DD). Each key is a forecast date and its value is a MarineForecastDay.",
902
+ "additionalProperties": {
903
+ "$ref": "#/components/schemas/MarineForecastDay"
904
+ }
905
+ },
906
+ "MarineForecastDay": {
907
+ "type": "object",
908
+ "description": "Marine forecast for a single day. Exactly one of daily, hourly, or minutely is present, matching whichever precision value was requested (default daily) — the other two are omitted, not just empty.",
909
+ "properties": {
910
+ "daily": {
911
+ "$ref": "#/components/schemas/MarineDaily",
912
+ "description": "Daily marine forecast summary. Present when precision=daily (the default)."
913
+ },
914
+ "hourly": {
915
+ "type": "array",
916
+ "description": "Array of hourly marine readings for the day. Present when precision=hourly.",
917
+ "items": {
918
+ "$ref": "#/components/schemas/MarineHourly"
919
+ }
920
+ },
921
+ "minutely": {
922
+ "type": "array",
923
+ "description": "Array of minute-by-minute marine data points for the day. Present when precision=minutely.",
924
+ "items": {
925
+ "$ref": "#/components/schemas/MarineMinutely"
926
+ }
927
+ }
928
+ }
929
+ }
930
+ }
931
+ },
932
+ "security": [
933
+ {
934
+ "ApiKeyAuthHeader": []
935
+ },
936
+ {
937
+ "ApiKeyAuthQuery": []
938
+ }
939
+ ]
940
+ }