Developers
Status API
Query current status, incidents and scheduled maintenance from your own
tools, dashboards and monitoring. Read only, JSON, versioned under
/api/v1.
You need an API key to call the endpoints. Sign in with the email you subscribed with to request one (you can hold up to 5).
Sign in to request a keyAuthentication
Send your key as a bearer token on every request; the
X-Api-Key
header works as an alternative. Keys look like
mnst_...
and are shown once at creation.
Authorization: Bearer YOUR_API_KEY
# or
X-Api-Key: YOUR_API_KEY
Quick start
Test your key in ten seconds:
curl -s -H "Authorization: Bearer YOUR_API_KEY" https://iperium-status.managednet.systems/api/v1/status
A 200 with JSON means you are in. A 401 means the key is missing, mistyped or revoked.
/api/v1/status
The full picture: overall status, every visible category and
component with its current status and 90-day uptime percentage. A
category nests locations
(state, data centre or POP), each with its
components;
a category with no locations carries its components directly. Add
?strip=1
for the per-day uptime cells behind the strips.
curl -s -H "Authorization: Bearer YOUR_API_KEY" \
https://iperium-status.managednet.systems/api/v1/status
<?php
$ch = curl_init('https://iperium-status.managednet.systems/api/v1/status');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Accept: application/json',
],
]);
$body = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);
if ($code !== 200) {
exit("API answered HTTP {$code}\n");
}
$status = json_decode($body, true);
echo $status['overall']['label'], "\n";
foreach ($status['groups'] as $group) {
foreach ($group['components'] as $component) {
printf(
"%-30s %-20s %s%%\n",
$component['name'],
$component['status']['label'],
$component['uptime_90d_percent'] ?? 'n/a',
);
}
}
const res = await fetch("https://iperium-status.managednet.systems/api/v1/status", {
headers: { "Authorization": "Bearer YOUR_API_KEY" },
});
if (!res.ok) throw new Error(`API answered HTTP ${res.status}`);
const status = await res.json();
console.log(status.overall.label);
Example response
{
"overall": { "value": "operational", "label": "Operational" },
"generated_at": "2026-07-12T06:00:00+00:00",
"groups": [
{
"name": "Broadband (NBN)",
"slug": "broadband-nbn",
"description": null,
"status": { "value": "operational", "label": "Operational" },
"locations": [
{
"name": "Queensland",
"slug": "broadband-nbn-queensland",
"status": { "value": "operational", "label": "Operational" },
"components": [
{
"name": "4NER Nerang POI",
"slug": "broadband-nbn-queensland-4ner-nerang-poi",
"description": null,
"status": { "value": "operational", "label": "Operational" },
"uptime_90d_percent": 99.98
}
]
}
]
},
{
"name": "Core Network",
"slug": "core-network",
"description": null,
"status": { "value": "operational", "label": "Operational" },
"components": [
{
"name": "Core Network",
"slug": "core-network-core-network",
"description": null,
"status": { "value": "operational", "label": "Operational" },
"uptime_90d_percent": 100
}
]
}
]
}
/api/v1/incidents
Active (published, unresolved) incidents with their update timelines.
Add ?window=90
to also include incidents resolved in the last 90 days. Fetch one
incident with
/api/v1/incidents/{id}.
curl -s -H "Authorization: Bearer YOUR_API_KEY" \
"https://iperium-status.managednet.systems/api/v1/incidents?window=90"
<?php
$ch = curl_init('https://iperium-status.managednet.systems/api/v1/incidents?window=90');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Accept: application/json',
],
]);
$incidents = json_decode(curl_exec($ch), true)['data'] ?? [];
curl_close($ch);
foreach ($incidents as $incident) {
printf(
"[%s] %s (%s) started %s\n",
strtoupper($incident['impact']['value']),
$incident['title'],
$incident['status']['label'],
$incident['started_at'],
);
}
const res = await fetch("https://iperium-status.managednet.systems/api/v1/incidents?window=90", {
headers: { "Authorization": "Bearer YOUR_API_KEY" },
});
const { data } = await res.json();
for (const incident of data) {
console.log(`${incident.impact.label}: ${incident.title}`);
}
Example response
{
"data": [
{
"id": 42,
"title": "Fibre cut in the Brisbane CBD",
"impact": { "value": "major", "label": "Major" },
"status": { "value": "monitoring", "label": "Monitoring" },
"started_at": "2026-07-12T01:12:00+00:00",
"resolved_at": null,
"affected_components": [
{
"name": "NBN Broadband",
"slug": "broadband-nbn-nbn-broadband",
"group": "Broadband (NBN)",
"status": { "value": "partial_outage", "label": "Partial Outage" }
}
],
"affected_groups": [
{
"name": "Core Network",
"slug": "core-network",
"parent": null,
"status": { "value": "degraded_performance", "label": "Degraded Performance" }
}
],
"updates": [
{
"status": { "value": "monitoring", "label": "Monitoring" },
"body": "Splicing complete; services are restoring.",
"published_at": "2026-07-12T03:40:00+00:00"
}
]
}
]
}
/api/v1/maintenance
Scheduled and in-progress maintenance windows (recently ended windows
linger for two hours). Emergency work carries
"is_emergency": true.
curl -s -H "Authorization: Bearer YOUR_API_KEY" \
https://iperium-status.managednet.systems/api/v1/maintenance
<?php
$ch = curl_init('https://iperium-status.managednet.systems/api/v1/maintenance');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Accept: application/json',
],
]);
$windows = json_decode(curl_exec($ch), true)['data'] ?? [];
curl_close($ch);
foreach ($windows as $window) {
printf(
"%s: %s -> %s%s\n",
$window['title'],
$window['scheduled_start'],
$window['scheduled_end'],
$window['is_emergency'] ? ' (EMERGENCY)' : '',
);
}
const res = await fetch("https://iperium-status.managednet.systems/api/v1/maintenance", {
headers: { "Authorization": "Bearer YOUR_API_KEY" },
});
const { data } = await res.json();
for (const window of data) {
console.log(`${window.title}: ${window.scheduled_start}`);
}
Example response
{
"data": [
{
"id": 7,
"title": "Core router upgrade SYD01",
"body": "Firmware upgrade on the SYD01 core. Brief BGP reconvergence expected.",
"status": { "value": "scheduled", "label": "Scheduled" },
"is_emergency": false,
"scheduled_start": "2026-07-15T14:00:00+00:00",
"scheduled_end": "2026-07-15T16:00:00+00:00",
"actual_start": null,
"actual_end": null,
"affected_components": [
{
"name": "Core Network",
"slug": "core-network-core-network",
"group": "Core Network"
}
],
"affected_groups": []
}
]
}
Rate limits
Each key may make 10 requests per minute. Poll the status endpoint at most every 30 to 60 seconds; it also carries a short CDN cache, so faster polling buys nothing.
| Header | Meaning |
|---|---|
| X-RateLimit-Limit | Requests allowed per minute (10). |
| X-RateLimit-Remaining | Requests left in the current minute. |
| Retry-After | On a 429: seconds to wait before retrying. |
Errors
Errors are JSON with a single message field.
| Status | Why | What to do |
|---|---|---|
| 401 | Missing, invalid or revoked key; or the subscription is inactive. | Check the header and the key in your account page. |
| 404 | The incident id does not exist or is not published. | Use ids from /incidents. |
| 429 | Rate limit exceeded. | Wait Retry-After seconds; slow the poller. |
{ "message": "Invalid or missing API key." }
Conventions
- All timestamps are ISO 8601 in UTC (convert locally for display).
- Statuses and impacts carry a stable
valuefor machines and a humanlabel. - Collections are wrapped in
data; /status is a bare object. - The API is read only; new fields may be added without notice, so ignore unknown keys.