DEV Community

Alex Spinov
Alex Spinov

Posted on

Grafana Has a Free API — Here's How to Build Custom Dashboards Programmatically

Why Grafana's API?

Grafana is the go-to open-source platform for monitoring and observability. But most developers only use the UI. The Grafana HTTP API lets you automate everything: create dashboards, manage alerts, provision data sources — all programmatically.

Grafana Cloud free tier: 10K metrics, 50GB logs, 50GB traces. More than enough to get started.

Getting Started

1. Get Your API Key

Grafana Cloud (free): Sign up at grafana.com, go to Configuration → API Keys → Add API key.

Self-hosted: Same path in your Grafana instance.

export GRAFANA_URL="https://your-instance.grafana.net"
export GRAFANA_API_KEY="your-api-key"
Enter fullscreen mode Exit fullscreen mode

2. List All Dashboards

curl -s -H "Authorization: Bearer $GRAFANA_API_KEY" \
  "$GRAFANA_URL/api/search?type=dash-db" | jq '.[].title'
Enter fullscreen mode Exit fullscreen mode

3. Create a Dashboard via API

import requests

GRAFANA_URL = "https://your-instance.grafana.net"
HEADERS = {"Authorization": "Bearer YOUR_API_KEY", "Content-Type": "application/json"}

dashboard = {
    "dashboard": {
        "title": "API Metrics Dashboard",
        "panels": [
            {
                "title": "Request Rate",
                "type": "timeseries",
                "gridPos": {"h": 8, "w": 12, "x": 0, "y": 0},
                "targets": [{
                    "expr": "rate(http_requests_total[5m])",
                    "legendFormat": "{{method}} {{path}}"
                }]
            },
            {
                "title": "Error Rate",
                "type": "stat",
                "gridPos": {"h": 8, "w": 12, "x": 12, "y": 0},
                "targets": [{
                    "expr": "rate(http_requests_total{status=~'5..'}[5m])"
                }]
            }
        ],
        "timezone": "browser"
    },
    "overwrite": False
}

resp = requests.post(f"{GRAFANA_URL}/api/dashboards/db", json=dashboard, headers=HEADERS)
print(f"Dashboard created: {resp.json()['url']}")
Enter fullscreen mode Exit fullscreen mode

4. Manage Alerts Programmatically

alert_rule = {
    "title": "High Error Rate",
    "condition": "C",
    "data": [{
        "refId": "A",
        "queryType": "",
        "model": {"expr": "rate(http_requests_total{status=~'5..'}[5m])", "refId": "A"}
    }],
    "for": "5m"
}

resp = requests.post(f"{GRAFANA_URL}/api/v1/provisioning/alert-rules", json=alert_rule, headers=HEADERS)
print(f"Alert created: {resp.status_code}")
Enter fullscreen mode Exit fullscreen mode

Node.js Example

const axios = require("axios");

const grafana = axios.create({
  baseURL: "https://your-instance.grafana.net",
  headers: { Authorization: "Bearer YOUR_API_KEY" }
});

// Get all dashboards
const { data } = await grafana.get("/api/search?type=dash-db");
console.log(`Found ${data.length} dashboards`);

// Get dashboard by UID
const dashboard = await grafana.get(`/api/dashboards/uid/${data[0].uid}`);
console.log(dashboard.data.dashboard.title);

// Create annotation (mark deployments, incidents)
await grafana.post("/api/annotations", {
  text: "Deployed v2.1.0",
  tags: ["deployment", "production"],
  time: Date.now()
});
Enter fullscreen mode Exit fullscreen mode

Common API Endpoints

Endpoint Method Description
/api/search GET Search dashboards
/api/dashboards/db POST Create/update dashboard
/api/datasources GET/POST Manage data sources
/api/annotations POST Add annotations
/api/alerts GET List alerts
/api/org/users GET List organization users

Use Cases

  1. CI/CD integration — auto-create dashboards per service deployment
  2. Multi-tenant monitoring — programmatically provision per-customer dashboards
  3. Incident response — auto-annotate dashboards during incidents
  4. Infrastructure as Code — version-control your dashboards alongside app code

Need to collect data for your Grafana dashboards? I build production-ready web scrapers and data pipelines. Check out my Apify actors or email me at spinov001@gmail.com for custom solutions.

How do you use Grafana's API? Share your setup in the comments!

Top comments (0)