Logo
Status Page

Status Page Documentation

Common troubleshooting topics: Creating a status page, setting up a monitor, incident management, etc.

Charts and Status Data API

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?

Share this article: