# ISPDiscovery read-only API

Base URL: https://ispdiscovery.com
No authentication is required for these public cached records. Only GET and HEAD are accepted; other methods return HTTP 405. No visitor input triggers external ping, traceroute, scans or fetching arbitrary URLs.

## GET /observatory.php
JSON fields: schema_version, generated_at, served_at, cycle_done, source, refresh_seconds, freshness_seconds, nodes, incidents, physical_cable_status. Nodes include id, checked_at, status, families and has_trace. Timestamps are UTC Unix seconds. cycle_done refers to the current collector sweep, so false can coexist with a complete cached registry.

## GET /observatory.php?node=atlas:<id>
The node ID must be atlas: followed by a positive bounded numeric ID from the published atlas. Node detail includes family measurement IDs, source paths, packet loss, RTT, real traceroute hops and the latest 96 local observations. Source hostnames, coordinates and IP targets are public RIPE Atlas records.

## GET /assets/atlas-observatory-20261011-v2.json
Geographic snapshot with cables, points, counts, sources and snapshot dates. The network_layer distinguishes submarine, terrestrial and measurement records. Do not infer physical interconnection solely from proximity. Cache this approximately 25 MB uncompressed snapshot; compressed transfer is approximately 3 MB.

## Status interpretation
healthy: sufficient IP reachability; isolated source-path loss may still be displayed.
degraded: multi-source packet loss or partial IPv4/IPv6 reachability.
icmp_unreachable: repeated complete ICMP failure across sufficient independent sources.
insufficient/no_data/stale/awaiting_data: not sufficient current evidence; not an outage assertion.
Physical cable status is not_measured. Incident physical_cable_damage_confirmed is false.

## Freshness and limits
Source caches can be up to five minutes old. The server sweep is approximately every 15–25 minutes and respects external API backoff. Results over 1,500 seconds are labelled stale by the summary/UI. A cached node detail retains its original measured timestamps: consumers must check age themselves. Sample retention is seven days; incidents 30 days; visible node history is bounded to 96 observations.
Poll summaries no more frequently than once a minute; fetch node details when needed and cache geographic data. No write API or availability SLA is offered.

## Errors
400 invalid_node: invalid ID or non-string parameter.
405 read_only: method not supported.
503 awaiting_measurements or temporarily_unavailable: cached node data unavailable; use Retry-After when supplied.
Missing website routes return actual HTTP 404.

## Contact
hello@ispdiscovery.com
