online / endpoints 62 / categories 10 / rate 60/min/ip /

GET /resolvable-discovery

GET /resolvable-discovery alias: /semantic-drift

Returns a discovery document whose URLs all resolve to real stubs on this same subdomain. Counterpart to the chaos /semantic-drift endpoint, where the shape passes validation but every claimed URL is dead.

schema Which schema shape to return. One of: openid-configuration, oauth-authorization-server, webfinger, jwks, host-meta, agent-card.
build a request:

expect: 200 OK with a well-formed discovery document. Every URL in the document resolves to a real stub on not.catastrophic.io. X-Chaos-Schema reflects the selection.

bash
curl -i 'https://not.catastrophic.io/resolvable-discovery?schema=openid-configuration'
import json, urllib.request
url = "https://not.catastrophic.io/resolvable-discovery?schema=openid-configuration"
resp = urllib.request.urlopen(url)
print("Drift:",  resp.headers["X-Chaos-Drift"])
print("Schema:", resp.headers["X-Chaos-Schema"])
data = json.loads(resp.read())
print(data.get("name"), data.get("url"))
const res = await fetch("https://not.catastrophic.io/resolvable-discovery?schema=openid-configuration");
console.log("Drift:",  res.headers.get("x-chaos-drift"));
console.log("Schema:", res.headers.get("x-chaos-schema"));
const data = await res.json();
console.log(data.name, data.url);
package main

import (
    "encoding/json"
    "fmt"
    "io"
    "net/http"
)

func main() {
    resp, _ := http.Get("https://not.catastrophic.io/resolvable-discovery?schema=openid-configuration")
    defer resp.Body.Close()
    raw, _ := io.ReadAll(resp.Body)

    fmt.Println("Drift:",  resp.Header.Get("X-Chaos-Drift"))
    fmt.Println("Schema:", resp.Header.Get("X-Chaos-Schema"))

    var data map[string]any
    json.Unmarshal(raw, &data)
    fmt.Println(data["name"], data["url"])
}
// Cargo.toml: reqwest    = { version = "0.12", features = ["blocking", "json"] }
//             serde_json = "1"
fn main() -> Result<(), Box> {
    let resp = reqwest::blocking::get("https://not.catastrophic.io/resolvable-discovery?schema=openid-configuration")?;
    println!("Drift: {:?}",  resp.headers().get("x-chaos-drift"));
    println!("Schema: {:?}", resp.headers().get("x-chaos-schema"));
    let data: serde_json::Value = resp.json()?;
    println!("{} {}", data["name"], data["url"]);
    Ok(())
}
// Requires Jackson: com.fasterxml.jackson.core:jackson-databind
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.net.URI;
import java.net.http.*;

public class SemanticDrift {
    public static void main(String[] args) throws Exception {
        var client = HttpClient.newHttpClient();
        var req = HttpRequest.newBuilder(URI.create("https://not.catastrophic.io/resolvable-discovery?schema=openid-configuration")).build();
        var resp = client.send(req, HttpResponse.BodyHandlers.ofString());
        System.out.println("Drift: "  + resp.headers().firstValue("X-Chaos-Drift").orElse(""));
        System.out.println("Schema: " + resp.headers().firstValue("X-Chaos-Schema").orElse(""));
        JsonNode data = new ObjectMapper().readTree(resp.body());
        System.out.println(data.path("name").asText() + " " + data.path("url").asText());
    }
}
using System.Text.Json;
using var client = new HttpClient();
var resp = await client.GetAsync("https://not.catastrophic.io/resolvable-discovery?schema=openid-configuration");
resp.Headers.TryGetValues("X-Chaos-Drift",  out var drift);
resp.Headers.TryGetValues("X-Chaos-Schema", out var schema);
Console.WriteLine($"Drift: {drift?.FirstOrDefault()}");
Console.WriteLine($"Schema: {schema?.FirstOrDefault()}");
var data = JsonDocument.Parse(await resp.Content.ReadAsStringAsync()).RootElement;
Console.WriteLine($"{data.GetProperty("name")} {data.GetProperty("url")}");
require "net/http"
require "json"
res = Net::HTTP.get_response(URI("https://not.catastrophic.io/resolvable-discovery?schema=openid-configuration"))
puts "Drift: #{res["X-Chaos-Drift"]}"
puts "Schema: #{res["X-Chaos-Schema"]}"
data = JSON.parse(res.body)
puts "#{data["name"]} #{data["url"]}"
$r = Invoke-WebRequest -Uri 'https://not.catastrophic.io/resolvable-discovery?schema=openid-configuration'
$r.Headers['X-Chaos-Schema']
$r.Headers['X-Chaos-Drift']
$r.Content | ConvertFrom-Json | Select-Object name, url, skills