TropicalInfo API Documentation

Access real-time tropical cyclone data programmatically with our comprehensive API.

Getting Started

Base URL
https://dev.tropicalinfo.com/api
Authentication

Most endpoints are publicly accessible. Premium features require an API key:

Authorization: Bearer YOUR_API_KEY
Response Format

All responses are in JSON format with the following structure:

{
  "success": true,
  "data": { ... },
  "timestamp": "2025-07-10T12:00:00Z"
}

Storm Data

List Active Storms
GET /api/storms

Returns all currently active tropical systems.

Example Response:
{
  "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
}
Get Storm Details
GET /api/storm/{storm_id}

Returns detailed information about a specific storm.

Parameters:
  • storm_id - Storm identifier (e.g., AL092025)
Example Response:
{
  "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": [ ... ]
  }
}
Storm History
GET /api/storm/{storm_id}/history

Returns historical track and intensity data for a storm.

Query Parameters:
  • hours - Number of hours of history (default: 72, max: 168)

Location Impact

Calculate Location Impact
GET /api/location/impact

Calculate potential impacts for a specific location from active storms.

Query Parameters:
  • lat - Latitude (required)
  • lon - Longitude (required)
  • name - Location name (optional)
Example Request:
GET /api/location/impact?lat=25.7617&lon=-80.1918&name=Miami
Example Response:
{
  "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"
      }
    }
  ]
}
Search Locations
GET /api/location/search

Search for location coordinates by name.

Query Parameters:
  • q - Search query (required)
  • limit - Maximum results (default: 5)

Products & Advisories

Get Storm Products
GET /api/storm/{storm_id}/products

Returns available NHC products for a storm.

Product Types:
  • tcp - Public Advisory
  • tcm - Marine Advisory
  • tcd - Forecast Discussion
  • tcu - Tropical Cyclone Update
  • pws - Wind Speed Probabilities
Example Response:
{
  "success": true,
  "products": {
    "tcp": {
      "advisory_number": "15A",
      "issued_time": "2025-07-10T21:00:00Z",
      "headline": "HURRICANE IAN ADVISORY NUMBER 15A",
      "content": "..."
    },
    "tcd": { ... },
    "tcm": { ... }
  }
}

Educational Resources

Get Educational Content
GET /api/educational/{category}

Returns educational content by category.

Categories:
  • basics - Hurricane basics
  • products - Understanding NHC products
  • meteorology - Weather concepts
  • safety - Safety and preparedness
  • all - All categories
Search Educational Resources
GET /api/educational/search?q={query}

Search educational content.

Premium Features

These endpoints require authentication with a valid API key.
Model Consensus Data
GET /api/storm/{storm_id}/models Advanced+

Returns track and intensity model data.

AI Storm Analysis
GET /api/storm/{storm_id}/ai-analysis Professional

AI-powered storm analysis and insights.

SHIPS Analysis
GET /api/storm/{storm_id}/ships Professional

Statistical Hurricane Intensity Prediction Scheme data.

Breaking News

Get Breaking News
GET /api/breaking-news

Returns active breaking news and alerts.

Example Response:
{
  "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"
    }
  ]
}

Rate Limits

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
Rate Limit Headers

The following headers are included in all API responses:

  • X-RateLimit-Limit - Request limit per hour
  • X-RateLimit-Remaining - Requests remaining this hour
  • X-RateLimit-Reset - Unix timestamp when limits reset

Error Codes

Status 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

Code Examples

Python
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()
JavaScript
// 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));
cURL
# 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