API Code Examples

Ready-to-use examples for common API operations.

JavaScript/Node.js

Basic Setup

const API_KEY = process.env.UPSTAT_API_KEY;
const BASE_URL = 'https://api.upstat.io/v1';

async function apiRequest(endpoint, options = {}) {
  const response = await fetch(`${BASE_URL}${endpoint}`, {
    ...options,
    headers: {
      'Authorization': `Bearer ${API_KEY}`,
      'Content-Type': 'application/json',
      ...options.headers
    }
  });

  if (!response.ok) {
    throw new Error(`API Error: ${response.statusText}`);
  }

  return response.json();
}

Create a Monitor

async function createMonitor() {
  const monitor = await apiRequest('/monitors', {
    method: 'POST',
    body: JSON.stringify({
      name: 'Production API',
      url: 'https://api.example.com/health',
      type: 'http',
      interval: 60,
      regions: ['us-east-1', 'eu-west-1'],
      alertAfter: 2
    })
  });

  console.log('Monitor created:', monitor.data.uuid);
}

Create an Incident

async function createIncident(title, severity = 'P3') {
  const incident = await apiRequest('/incidents', {
    method: 'POST',
    body: JSON.stringify({
      title,
      severity,
      description: 'Automated incident creation',
      status: 'open'
    })
  });

  return incident.data;
}

![Placeholder: Code Example Running in Terminal]

Python

Basic Setup

import os
import requests
from typing import Dict, Any

API_KEY = os.environ.get('UPSTAT_API_KEY')
BASE_URL = 'https://api.upstat.io/v1'

def api_request(endpoint: str, method: str = 'GET', 
                data: Dict[str, Any] = None) -> Dict:
    headers = {
        'Authorization': f'Bearer {API_KEY}',
        'Content-Type': 'application/json'
    }
    
    response = requests.request(
        method=method,
        url=f'{BASE_URL}{endpoint}',
        headers=headers,
        json=data
    )
    
    response.raise_for_status()
    return response.json()

List All Monitors

def list_monitors():
    monitors = api_request('/monitors')
    
    for monitor in monitors['data']:
        status = '✅' if monitor['status'] == 'up' else '❌'
        print(f"{status} {monitor['name']} - {monitor['url']}")

Update Incident Status

def resolve_incident(incident_uuid: str, resolution: str):
    return api_request(
        f'/incidents/{incident_uuid}',
        method='PUT',
        data={
            'status': 'resolved',
            'resolution': resolution
        }
    )

Ruby

Basic Client

require 'net/http'
require 'json'
require 'uri'

class UpstatClient
  BASE_URL = 'https://api.upstat.io/v1'
  
  def initialize(api_key)
    @api_key = api_key
  end
  
  def request(endpoint, method = :get, data = nil)
    uri = URI("#{BASE_URL}#{endpoint}")
    
    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = true
    
    request = case method
    when :post then Net::HTTP::Post.new(uri)
    when :put then Net::HTTP::Put.new(uri)
    when :delete then Net::HTTP::Delete.new(uri)
    else Net::HTTP::Get.new(uri)
    end
    
    request['Authorization'] = "Bearer #{@api_key}"
    request['Content-Type'] = 'application/json'
    request.body = data.to_json if data
    
    response = http.request(request)
    JSON.parse(response.body)
  end
end

Create Status Page Update

client = UpstatClient.new(ENV['UPSTAT_API_KEY'])

# Update component status
update = client.request(
  '/status-pages/abc123/components/xyz789',
  :put,
  {
    status: 'partial_outage',
    message: 'Investigating database performance issues'
  }
)

puts "Status updated: #{update['status']}"

Go

HTTP Client

package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "net/http"
    "os"
)

type Client struct {
    APIKey  string
    BaseURL string
}

func NewClient() *Client {
    return &Client{
        APIKey:  os.Getenv("UPSTAT_API_KEY"),
        BaseURL: "https://api.upstat.io/v1",
    }
}

func (c *Client) Request(method, endpoint string, 
                        payload interface{}) (map[string]interface{}, error) {
    var body []byte
    var err error
    
    if payload != nil {
        body, err = json.Marshal(payload)
        if err != nil {
            return nil, err
        }
    }
    
    req, err := http.NewRequest(method, c.BaseURL+endpoint, 
                               bytes.NewBuffer(body))
    if err != nil {
        return nil, err
    }
    
    req.Header.Set("Authorization", "Bearer "+c.APIKey)
    req.Header.Set("Content-Type", "application/json")
    
    resp, err := http.DefaultClient.Do(req)
    if err != nil {
        return nil, err
    }
    defer resp.Body.Close()
    
    var result map[string]interface{}
    json.NewDecoder(resp.Body).Decode(&result)
    return result, nil
}

Monitor Health Check

func checkMonitorHealth(client *Client, monitorUUID string) {
    result, err := client.Request("GET", 
                                 fmt.Sprintf("/monitors/%s", monitorUUID), 
                                 nil)
    if err != nil {
        log.Fatal(err)
    }
    
    monitor := result["data"].(map[string]interface{})
    fmt.Printf("Monitor: %s\n", monitor["name"])
    fmt.Printf("Status: %s\n", monitor["status"])
    fmt.Printf("Response Time: %vms\n", monitor["responseTime"])
}

![Placeholder: Multiple Code Examples in Different Languages]

Webhooks Handler

Express.js Webhook Receiver

const express = require('express');
const crypto = require('crypto');

const app = express();
app.use(express.json());

const WEBHOOK_SECRET = process.env.UPSTAT_WEBHOOK_SECRET;

// Verify webhook signature
function verifySignature(payload, signature) {
  const hash = crypto
    .createHmac('sha256', WEBHOOK_SECRET)
    .update(JSON.stringify(payload))
    .digest('hex');
    
  return `sha256=${hash}` === signature;
}

// Handle incoming webhooks
app.post('/webhooks/upstat', (req, res) => {
  const signature = req.headers['x-upstat-signature'];
  
  if (!verifySignature(req.body, signature)) {
    return res.status(401).send('Invalid signature');
  }
  
  const { event, data } = req.body;
  
  switch (event) {
    case 'incident.created':
      console.log(`New incident: ${data.title}`);
      // Trigger your incident response workflow
      break;
      
    case 'monitor.down':
      console.log(`Monitor down: ${data.name}`);
      // Alert your team
      break;
      
    case 'monitor.recovered':
      console.log(`Monitor recovered: ${data.name}`);
      // Update status page
      break;
  }
  
  res.status(200).send('OK');
});

Common Patterns

Pagination Helper

async function getAllMonitors() {
  const monitors = [];
  let page = 1;
  let hasMore = true;
  
  while (hasMore) {
    const response = await apiRequest(`/monitors?page=${page}&limit=100`);
    monitors.push(...response.data);
    
    hasMore = response.pagination.page < response.pagination.pages;
    page++;
  }
  
  return monitors;
}

Error Handling

async function safeApiCall(fn) {
  try {
    return await fn();
  } catch (error) {
    if (error.response?.status === 429) {
      // Rate limited - wait and retry
      const retryAfter = error.response.headers['retry-after'] || 60;
      console.log(`Rate limited. Retrying in ${retryAfter}s...`);
      await new Promise(resolve => setTimeout(resolve, retryAfter * 1000));
      return safeApiCall(fn);
    }
    
    throw error;
  }
}

Learn more