Access real-time tropical cyclone data programmatically with our comprehensive API.
https://dev.tropicalinfo.com/api
Most endpoints are publicly accessible. Premium features require an API key:
Authorization: Bearer YOUR_API_KEY
All responses are in JSON format with the following structure:
{
"success": true,
"data": { ... },
"timestamp": "2025-07-10T12:00:00Z"
}
/api/storms
Returns all currently active tropical systems.
{
"success": true,
"storms": [
{
"storm_id": "AL092025",
"storm_name": "Ian",
"classification": "Hurricane",
"category": 4,
"lat": 26.5,
"lon": -82.0,
"max_winds": 150,
"movement": "NNE at 9 mph",
"pressure": 937,
"basin": "atlantic",
"updated_at": "2025-07-10T18:00:00Z"
}
],
"count": 1
}
/api/storm/{storm_id}
Returns detailed information about a specific storm.
storm_id
- Storm identifier (e.g., AL092025){
"success": true,
"storm": {
"storm_id": "AL092025",
"storm_name": "Ian",
"classification": "Hurricane",
"category": 4,
"location": {
"lat": 26.5,
"lon": -82.0,
"lat_dir": "N",
"lon_dir": "W"
},
"intensity": {
"max_winds": 150,
"gusts": 185,
"pressure": 937
},
"movement": {
"direction": "NNE",
"speed": 9,
"heading": 22
},
"wind_radii": {
"34": {"NE": 175, "SE": 150, "SW": 125, "NW": 150},
"50": {"NE": 80, "SE": 80, "SW": 60, "NW": 70},
"64": {"NE": 45, "SE": 45, "SW": 35, "NW": 40}
},
"forecast": [ ... ]
}
}
/api/storm/{storm_id}/history
Returns historical track and intensity data for a storm.
hours
- Number of hours of history (default: 72, max: 168)/api/location/impact
Calculate potential impacts for a specific location from active storms.
lat
- Latitude (required)lon
- Longitude (required)name
- Location name (optional)GET /api/location/impact?lat=25.7617&lon=-80.1918&name=Miami
{
"success": true,
"location": {
"name": "Miami",
"lat": 25.7617,
"lon": -80.1918
},
"impacts": [
{
"storm_id": "AL092025",
"storm_name": "Ian",
"distance_miles": 125,
"bearing": "WSW",
"threat_level": "high",
"wind_probability": {
"34kt": 85,
"50kt": 60,
"64kt": 35
},
"closest_approach": {
"time": "2025-07-11T06:00:00Z",
"distance_miles": 75
},
"expected_conditions": {
"max_wind": 65,
"rain_inches": "6-10",
"storm_surge": "3-5 ft"
}
}
]
}
/api/location/search
Search for location coordinates by name.
q
- Search query (required)limit
- Maximum results (default: 5)/api/storm/{storm_id}/products
Returns available NHC products for a storm.
tcp
- Public Advisorytcm
- Marine Advisorytcd
- Forecast Discussiontcu
- Tropical Cyclone Updatepws
- Wind Speed Probabilities{
"success": true,
"products": {
"tcp": {
"advisory_number": "15A",
"issued_time": "2025-07-10T21:00:00Z",
"headline": "HURRICANE IAN ADVISORY NUMBER 15A",
"content": "..."
},
"tcd": { ... },
"tcm": { ... }
}
}
/api/educational/{category}
Returns educational content by category.
basics
- Hurricane basicsproducts
- Understanding NHC productsmeteorology
- Weather conceptssafety
- Safety and preparednessall
- All categories/api/educational/search?q={query}
Search educational content.
/api/breaking-news
Returns active breaking news and alerts.
{
"success": true,
"news": [
{
"id": 1,
"title": "Hurricane Warning Issued",
"message": "Hurricane warning issued for Florida Keys",
"severity": "danger",
"created_at": "2025-07-10T15:30:00Z"
}
]
}
Tier | Requests/Hour | Requests/Day | Burst Rate |
---|---|---|---|
Free (No API Key) | 60 | 500 | 1/second |
Basic | 300 | 5,000 | 5/second |
Advanced | 1,000 | 20,000 | 10/second |
Professional | 5,000 | 100,000 | 50/second |
The following headers are included in all API responses:
X-RateLimit-Limit
- Request limit per hourX-RateLimit-Remaining
- Requests remaining this hourX-RateLimit-Reset
- Unix timestamp when limits resetStatus Code | Description | Example |
---|---|---|
200 |
Success | Request completed successfully |
400 |
Bad Request | Missing required parameters |
401 |
Unauthorized | Invalid or missing API key |
403 |
Forbidden | Access denied to premium feature |
404 |
Not Found | Storm or resource not found |
429 |
Too Many Requests | Rate limit exceeded |
500 |
Internal Server Error | Server error, try again later |
import requests
# Get active storms
response = requests.get('https://dev.tropicalinfo.com/api/storms')
data = response.json()
for storm in data['storms']:
print(f"{storm['storm_name']} - {storm['max_winds']} mph")
# Get location impact
params = {
'lat': 25.7617,
'lon': -80.1918,
'name': 'Miami'
}
response = requests.get('https://dev.tropicalinfo.com/api/location/impact', params=params)
impact = response.json()
// Get active storms
fetch('https://dev.tropicalinfo.com/api/storms')
.then(response => response.json())
.then(data => {
data.storms.forEach(storm => {
console.log(`${storm.storm_name} - ${storm.max_winds} mph`);
});
});
// Get location impact
const params = new URLSearchParams({
lat: 25.7617,
lon: -80.1918,
name: 'Miami'
});
fetch(`https://dev.tropicalinfo.com/api/location/impact?${params}`)
.then(response => response.json())
.then(impact => console.log(impact));
# Get active storms
curl https://dev.tropicalinfo.com/api/storms
# Get storm details
curl https://dev.tropicalinfo.com/api/storm/AL092025
# Get location impact
curl "https://dev.tropicalinfo.com/api/location/impact?lat=25.7617&lon=-80.1918&name=Miami"
# With API key
curl -H "Authorization: Bearer YOUR_API_KEY" \
https://dev.tropicalinfo.com/api/storm/AL092025/models