{
    "openapi": "3.1.1",
    "info": {
        "title": "Stealth public measurement feeds",
        "version": "1.0.0",
        "description": "Read-only public network measurements from Stealth NYC. No authentication or query parameters. Poll at most once per minute per feed. Schemas use JSON Schema 2020-12 and accept additive fields."
    },
    "jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
    "servers": [
        {
            "url": "https://stealth.net"
        }
    ],
    "security": [],
    "paths": {
        "/api/ai-latency": {
            "get": {
                "operationId": "ai_latency",
                "summary": "AI endpoint measurements",
                "description": "ICMP round trip time to public AI endpoints, with independent ICMP and TCP reachability checks.\n\nLatency fields and chart values are already in milliseconds and already subtract baseline_ms, currently 0.100 ms. Do not subtract it again. Adjusted values can be zero or negative. TCP provides status only in this feed.\n\npoints[i] is null or [mean_ms, successful_recording_count]. Its time is window.start + i × window.step. The mean is the five minute trailing bucket ending at that time; the first point can include the preceding five minutes. Use the returned window and generated_at. Statistics describe successful recordings in the five day snapshot window, not the chart averages.\n\nA stale cached AI response retains its original generated_at, window, history and statistics. server_time advances and probe states become stale. Do not describe those retained values as a current five day observation or current reachability.\n\nAuthentication is not required. Make an HTTPS GET to one of the two fixed feed URLs. No query parameters, target selections, date ranges or arbitrary queries are accepted.\n\nPoll each feed at most once per minute. Snapshots are shared briefly on the server; faster polling does not create a new measurement. After a failure, wait at least a minute and back off rather than retrying rapidly.\n\nMeasurement responses use Cache-Control: no-store. Keep source and observation timestamps with any separately stored result. Cross-origin browser access is not guaranteed; use a server-side or same-origin client.",
                "security": [],
                "parameters": [],
                "responses": {
                    "200": {
                        "description": "A live, empty or explicitly stale snapshot. HTTP 200 alone does not establish current reachability.",
                        "headers": {
                            "Cache-Control": {
                                "description": "No-store; the framework may also mark the response private. Server-side snapshots are shared briefly.",
                                "schema": {
                                    "type": "string"
                                }
                            },
                            "X-Robots-Tag": {
                                "description": "Raw measurement responses are noindex, nofollow. The public developer guide is indexable.",
                                "schema": {
                                    "type": "string"
                                }
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "allOf": [
                                        {
                                            "$ref": "https://stealth.net/api/measurements/schemas/ai-latency.json"
                                        },
                                        {
                                            "type": "object",
                                            "properties": {
                                                "state": {
                                                    "enum": [
                                                        "live",
                                                        "empty",
                                                        "stale"
                                                    ]
                                                }
                                            }
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Query parameters are not accepted.",
                        "headers": {
                            "Cache-Control": {
                                "description": "No-store; the framework may also mark the response private. Server-side snapshots are shared briefly.",
                                "schema": {
                                    "type": "string"
                                }
                            },
                            "X-Robots-Tag": {
                                "description": "Raw measurement responses are noindex, nofollow. The public developer guide is indexable.",
                                "schema": {
                                    "type": "string"
                                }
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "https://stealth.net/api/measurements/schemas/ai-latency.json#/$defs/Error"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "Monitoring unavailable. The body remains a snapshot, including configured endpoints when the catalog is available.",
                        "headers": {
                            "Cache-Control": {
                                "description": "No-store; the framework may also mark the response private. Server-side snapshots are shared briefly.",
                                "schema": {
                                    "type": "string"
                                }
                            },
                            "X-Robots-Tag": {
                                "description": "Raw measurement responses are noindex, nofollow. The public developer guide is indexable.",
                                "schema": {
                                    "type": "string"
                                }
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "allOf": [
                                        {
                                            "$ref": "https://stealth.net/api/measurements/schemas/ai-latency.json"
                                        },
                                        {
                                            "type": "object",
                                            "properties": {
                                                "state": {
                                                    "const": "unavailable"
                                                }
                                            }
                                        }
                                    ]
                                }
                            }
                        }
                    }
                },
                "externalDocs": {
                    "description": "Public measurement feed guide",
                    "url": "https://stealth.net/developers/measurements"
                }
            }
        },
        "/api/business-platforms": {
            "get": {
                "operationId": "business_platforms",
                "summary": "Business platform measurements",
                "description": "Separate ICMP RTT, TCP connection and TLS handshake measurements for the configured public business platform catalog.\n\nAll latency fields and chart values are raw milliseconds, converted from seconds once. No AI baseline adjustment applies. TCP duration includes DNS and connection establishment. TLS duration also includes the TLS handshake.\n\nEach metrics[protocol].points[i] is null or [mean_ms, successful_recording_count], aligned to buckets[i]. Bucket samples fall after start and at or before end. Partial first and last buckets stay inside the returned five day window. Median and p95 use underlying successful recordings for that endpoint and protocol.\n\nA stale Business response reframes buckets to the current five day window, preserves source_snapshot_at, drops crossing old buckets and clears median_ms/p95_ms. statistics_available is false, current_ms is null and configured probe states are unavailable. Retained latest_ms is a last successful observation, not proof of current reachability.\n\nAuthentication is not required. Make an HTTPS GET to one of the two fixed feed URLs. No query parameters, target selections, date ranges or arbitrary queries are accepted.\n\nPoll each feed at most once per minute. Snapshots are shared briefly on the server; faster polling does not create a new measurement. After a failure, wait at least a minute and back off rather than retrying rapidly.\n\nMeasurement responses use Cache-Control: no-store. Keep source and observation timestamps with any separately stored result. Cross-origin browser access is not guaranteed; use a server-side or same-origin client.",
                "security": [],
                "parameters": [],
                "responses": {
                    "200": {
                        "description": "A live, empty or explicitly stale snapshot. HTTP 200 alone does not establish current reachability.",
                        "headers": {
                            "Cache-Control": {
                                "description": "No-store; the framework may also mark the response private. Server-side snapshots are shared briefly.",
                                "schema": {
                                    "type": "string"
                                }
                            },
                            "X-Robots-Tag": {
                                "description": "Raw measurement responses are noindex, nofollow. The public developer guide is indexable.",
                                "schema": {
                                    "type": "string"
                                }
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "allOf": [
                                        {
                                            "$ref": "https://stealth.net/api/measurements/schemas/business-platforms.json"
                                        },
                                        {
                                            "type": "object",
                                            "properties": {
                                                "state": {
                                                    "enum": [
                                                        "live",
                                                        "empty",
                                                        "stale"
                                                    ]
                                                }
                                            }
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Query parameters are not accepted.",
                        "headers": {
                            "Cache-Control": {
                                "description": "No-store; the framework may also mark the response private. Server-side snapshots are shared briefly.",
                                "schema": {
                                    "type": "string"
                                }
                            },
                            "X-Robots-Tag": {
                                "description": "Raw measurement responses are noindex, nofollow. The public developer guide is indexable.",
                                "schema": {
                                    "type": "string"
                                }
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "https://stealth.net/api/measurements/schemas/business-platforms.json#/$defs/Error"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "Monitoring unavailable. The body remains a snapshot, including configured endpoints when the catalog is available.",
                        "headers": {
                            "Cache-Control": {
                                "description": "No-store; the framework may also mark the response private. Server-side snapshots are shared briefly.",
                                "schema": {
                                    "type": "string"
                                }
                            },
                            "X-Robots-Tag": {
                                "description": "Raw measurement responses are noindex, nofollow. The public developer guide is indexable.",
                                "schema": {
                                    "type": "string"
                                }
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "allOf": [
                                        {
                                            "$ref": "https://stealth.net/api/measurements/schemas/business-platforms.json"
                                        },
                                        {
                                            "type": "object",
                                            "properties": {
                                                "state": {
                                                    "const": "unavailable"
                                                }
                                            }
                                        }
                                    ]
                                }
                            }
                        }
                    }
                },
                "externalDocs": {
                    "description": "Public measurement feed guide",
                    "url": "https://stealth.net/developers/measurements"
                }
            }
        }
    }
}
