REST API · MCP server · OAuth
Domains, DNS, servers, monitors, incidents and status pages through one API. Every endpoint documented, every answer recorded from the real thing.
New here? Try it on a free Sandbox with sample data — nothing you do there touches anything real. Startcurl "https://api.infranest.io/api/organizations/42/status" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
$headers = @{
Authorization = "Bearer $env:INFRANEST_TOKEN"
Accept = "application/json"
}
Invoke-RestMethod -Method Get -Uri "https://api.infranest.io/api/organizations/42/status" -Headers $headers
import os
import requests
response = requests.get(
"https://api.infranest.io/api/organizations/42/status",
headers={
"Authorization": f"Bearer {os.environ['INFRANEST_TOKEN']}",
"Accept": "application/json",
},
)
response.raise_for_status()
print(response.json())
{
"generated_at": "2026-01-15T12:00:00Z",
"tag": null,
"summary": {
"monitors": {
"total": 13,
"up": 10,
"down": 1,
"degraded": 1,
"paused": 1,
"unknown": 0
},
"servers": {
"total": 14,
"running": 12,
"agent_not_reporting": 0,
"breaching": 0
},
"open_incidents": 1,
"active_maintenance": 0
},
"monitors": [
{
"id": 3,
"name": "API health",
"type": "http",
"status": "up",
"enabled": true,
"silenced": false,
"last_checked_at": "2026-01-15T11:58:00Z",
"uptime_24h": 0
},
{
"id": 2,
"name": "App — northwind-app.dev",
"type": "http",
"status": "up",
"enabled": true,
"silenced": false,
"last_checked_at": "2026-01-15T11:58:00Z",
"uptime_24h": 0
}
],
"servers": [
{
"id": 13,
"name": "analytics-01",
"status": "stopped",
"monitoring_enabled": false,
"agent_reporting": null,
"breaching_alerts": 0
},
{
"id": 3,
"name": "api-01",
"status": "running",
"monitoring_enabled": true,
"agent_reporting": true,
"breaching_alerts": 0
}
],
"incidents": [
{
"id": 1,
"title": "Checkout returning 503",
"status": "investigating",
"impact": "major",
"started_at": "2026-01-15T11:20:00Z",
"acknowledged_at": null,
"monitoring_check_id": 4,
"server_id": null
}
],
"maintenance": []
}
A token for your scripts, CI and tools, scoped to exactly what they need and bound to one organization.
curl -s -X POST "https://api.infranest.io/api/organizations/$ORG/dns-zones/$ZONE/dns-records?dry_run=1" \
-H "Authorization: Bearer $INFRANEST_TOKEN" -H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{"type": "A", "name": "quickstart", "value": "192.0.2.50", "ttl": 3600}'
$record = @{ type = 'A'; name = 'quickstart'; value = '192.0.2.50'; ttl = 3600 } | ConvertTo-Json
Invoke-RestMethod -Method Post -Uri "https://api.infranest.io/api/organizations/$env:ORG/dns-zones/$env:ZONE/dns-records?dry_run=1" `
-Headers $headers -ContentType 'application/json' -Body $record
zone = 1 # the ID of sandbox-….example
record = {"type": "A", "name": "quickstart", "value": "192.0.2.50", "ttl": 3600}
dry = requests.post(f"{API}/organizations/{org}/dns-zones/{zone}/dns-records", params={"dry_run": 1}, headers=HEADERS, json=record)
print(dry.json())
From the quickstart: try a change as a dry run. The API answers with the change it would make, and makes none.
AI agent ready
Connect Claude or ChatGPT in one click, or point Cursor and VS Code at the MCP server. The assistant reads what you can read, and changes nothing.
llms.txt — every page, one line eachllms-full.txt — the whole site in one fileapi.infranest.io/mcp — 21 read-only toolsYou ask: Find every DNS record pointing at web-01 and show me a dry run of moving them to web-02.
Finds web-01 and web-02 and their IDs.
Finds every record in every zone that names web-01’s address.
The dry run: each record with its new value, the ones left out and why, and the monitors that follow. Changes nothing.
Let people connect your product to their InfraNest account with one click: no token to copy, and they can remove it any time.
Your app sends them to authorize, with PKCE.
One organization, and only the scopes you asked for.
An access token for an hour, and a refresh token that rotates.