StatusPage.me Help Center

Popular topics: creating a status page, connecting monitors, automatic incidents, custom domains, integrations and billing.

StatusPage.me Dec 9, 2025 API

Charts and Status Data API

The Charts API provides real-time chart data for your status page monitors, including response times, uptime history, and minute-level data for detailed visualizations.


Endpoints

Status Page Charts

GET https://statuspage.me/api/status/{slug}/charts

Returns aggregated chart data for all monitors on a status page.

Minute-Level Data

GET https://statuspage.me/api/status-page/{slug}/minute-data

Returns fine-grained minute-by-minute data for detailed charts.


Status Page Charts

Example Request

curl "https://statuspage.me/api/status/your-slug/charts"

Example Response

{
  "monitors": [
    {
      "id": 123,
      "name": "API Server",
      "state": "up",
      "avg_response_time_today": 142,
      "hourly_data": [
        {"hour": 0, "avg_response": 138, "uptime": 100},
        {"hour": 1, "avg_response": 145, "uptime": 100},
        {"hour": 2, "avg_response": 155, "uptime": 99.5}
      ],
      "minute_data": [
        {"minute": "2025-12-09T12:00:00Z", "response_time": 140, "status": "up"},
        {"minute": "2025-12-09T12:01:00Z", "response_time": 142, "status": "up"}
      ],
      "yesterday_hourly_data": [
        {"hour": 0, "avg_response": 135, "uptime": 100}
      ]
    }
  ],
  "overall": "operational",
  "globalDaily": [
    {"date": "2025-12-09", "uptime": 99.95},
    {"date": "2025-12-08", "uptime": 100}
  ],
  "timestamp": 1733749200
}

Response Fields

Monitor Object

FieldTypeDescription
idintegerMonitor ID
namestringMonitor display name
statestringCurrent state: up, down, degraded
avg_response_time_todayintegerAverage response time in ms
hourly_dataarrayHourly aggregated data
minute_dataarrayMinute-level data points
yesterday_hourly_dataarrayYesterday’s hourly data

Hourly Data Point

FieldTypeDescription
hourintegerHour of day (0-23)
avg_responseintegerAverage response time (ms)
uptimefloatUptime percentage for that hour

Minute Data Point

FieldTypeDescription
minutestringISO 8601 timestamp
response_timeintegerResponse time in ms
statusstringStatus at that minute

Minute-Level Data

For lazy-loading detailed charts without blocking initial page load.

Example Request

curl "https://statuspage.me/api/status-page/your-slug/minute-data"

Example Response

{
  "monitors": [
    {
      "id": 123,
      "minute_data": [
        {"minute": "2025-12-09T11:00:00Z", "response_time": 138, "status": "up"},
        {"minute": "2025-12-09T11:01:00Z", "response_time": 142, "status": "up"},
        {"minute": "2025-12-09T11:02:00Z", "response_time": 510, "status": "degraded"},
        {"minute": "2025-12-09T11:03:00Z", "response_time": 145, "status": "up"}
      ]
    }
  ]
}

Private Status Pages

For private (password-protected) status pages, include the auth_token:

curl "https://statuspage.me/api/status-page/your-slug/minute-data?auth_token=your-token"

Configure the auth token in your status page settings.


JavaScript Chart Example

Using Chart.js to visualize response times:

async function loadResponseTimeChart(slug) {
  const response = await fetch(`https://statuspage.me/api/status/${slug}/charts`);
  const data = await response.json();
  
  // Get first monitor's minute data
  const monitor = data.monitors[0];
  const labels = monitor.minute_data.map(d => new Date(d.minute).toLocaleTimeString());
  const values = monitor.minute_data.map(d => d.response_time);
  
  // Create Chart.js chart
  new Chart(document.getElementById('response-chart'), {
    type: 'line',
    data: {
      labels: labels,
      datasets: [{
        label: 'Response Time (ms)',
        data: values,
        borderColor: '#10b981',
        tension: 0.3
      }]
    },
    options: {
      responsive: true,
      scales: {
        y: { beginAtZero: true }
      }
    }
  });
}

loadResponseTimeChart('your-slug');

Auto-Reload Implementation

Build a self-updating dashboard:

class StatusDashboard {
  constructor(slug, refreshInterval = 30000) {
    this.slug = slug;
    this.refreshInterval = refreshInterval;
    this.init();
  }
  
  async init() {
    await this.update();
    setInterval(() => this.update(), this.refreshInterval);
  }
  
  async update() {
    try {
      const response = await fetch(
        `https://statuspage.me/api/status/${this.slug}/charts`
      );
      const data = await response.json();
      
      this.updateOverallStatus(data.overall);
      this.updateMonitors(data.monitors);
      this.updateTimestamp(data.timestamp);
    } catch (error) {
      console.error('Failed to update dashboard:', error);
    }
  }
  
  updateOverallStatus(status) {
    const badge = document.getElementById('overall-status');
    badge.className = `status-badge ${status}`;
    badge.textContent = status.replace('_', ' ');
  }
  
  updateMonitors(monitors) {
    monitors.forEach(monitor => {
      const el = document.getElementById(`monitor-${monitor.id}`);
      if (el) {
        el.querySelector('.state').textContent = monitor.state;
        el.querySelector('.response-time').textContent = 
          `${monitor.avg_response_time_today}ms`;
      }
    });
  }
  
  updateTimestamp(ts) {
    document.getElementById('last-updated').textContent = 
      `Updated: ${new Date(ts * 1000).toLocaleTimeString()}`;
  }
}

// Initialize dashboard
new StatusDashboard('your-slug', 30000);

Caching

  • Responses include Cache-Control: no-store for real-time data
  • Don’t cache these responses for long periods
  • Recommended polling: 15-60 seconds

Error Responses

StatusErrorCause
404status page not foundInvalid slug
403status page is blockedPage was blocked by admin
401auth requiredPrivate page without token

What’s Next?

Was this article helpful?