{"ok":true,"schema_version":1,"data":{"agent_readiness":{"blocker_level":"hard-blocked","blockers":[{"code":"inactive-lifecycle","field":"lifecycle","message":"The subnet is not marked active in the registry snapshot.","next_action":"Wait for an active mainnet subnet before recommending it for integrations.","severity":"hard"}],"missing_fields":[],"status":"callable"},"categories":["baseline-augmented","baseline-curated","decentralized-training","identity-drift","identity-reviewed","official-docs","official-source-repo"],"completeness_score":78,"contract_version":"2026-07-03.2","example_count":0,"examples":[],"generated_at":"2026-07-27T10:51:25.049Z","integration_readiness":97,"name":"Grail","netuid":81,"readiness":{"components":{"active_lifecycle":false,"auth_clarity":true,"callable_now":true,"documented":true,"has_callable_api":true,"has_candidate_api":false,"has_public_docs":true,"has_source_repo":true,"profile_complete":true},"readiness_tier":"buildable","readiness_version":2,"score":97,"readiness_verified":false},"schema_version":1,"service_count":3,"services":[{"auth":{"location":"header","name":"Authorization","scheme":"api-key","value_format":"<api-key>"},"auth_required":true,"auth_schemes":["apiKey","http"],"authority":"community","base_url":"https://grail-grafana.tplr.ai/public/openapi3.json","capability":"Grail Grafana HTTP API OpenAPI","description":"Public no-auth OpenAPI 3 schema (title \"Grafana HTTP API.\") served at grail-grafana.tplr.ai/public/openapi3.json — the same host already registered as this file's dashboard and subnet-api (health) surfaces. Same operator (one-covenant / tplr.ai) and identical publish convention already accepted for the sibling Templar (SN3) subnet's Grafana OpenAPI surface (grafana.tplr.ai/public/openapi3.json).","eligibility":{"callable":false,"reasons":["not-bittensor-base-layer"],"live_status":"unknown"},"fixture":{"artifact_path":"/metagraph/fixtures/sn-81-grail-grafana-openapi.json","captured_at":"2026-07-27T10:51:25.372Z","request":{"method":"GET","url":"https://grail-grafana.tplr.ai/public/openapi3.json"},"response":{"content_type":"application/json","status":200}},"fixture_status":{"artifact_path":"/metagraph/fixtures/sn-81-grail-grafana-openapi.json","captured_at":"2026-07-27T10:51:25.372Z","reason":null,"status":"available"},"health":{"status":"unknown","classification":null,"latency_ms":null,"last_ok":null,"last_checked":null,"stale":false,"observed_by":"unavailable"},"kind":"openapi","provider":"one-covenant","schema_artifact":"/metagraph/schemas/sn-81-grail-grafana-openapi.json","schema_source":{"artifact":"/metagraph/schemas/sn-81-grail-grafana-openapi.json","hash":"350c90980c6fe9dd6d0ce0922e8a46e6281c5f43def8884c7b2e1de84a1b922f","match":"surface-id","observed_at":"2026-07-27T10:51:25.372Z","status":"captured","surface_id":"sn-81-grail-grafana-openapi","url":"https://grail-grafana.tplr.ai/public/openapi3.json"},"schema_status":"machine-readable","schema_url":"https://grail-grafana.tplr.ai/public/openapi3.json","snippets":{"curl":"curl -sS 'https://grail-grafana.tplr.ai/public/openapi3.json' \\\n  -H 'Authorization: <api-key>'","python":"import requests\n\nresp = requests.get(\"https://grail-grafana.tplr.ai/public/openapi3.json\", headers={\"Authorization\": \"<api-key>\"})\nresp.raise_for_status()\nprint(resp.json())","typescript":"const resp = await fetch(\"https://grail-grafana.tplr.ai/public/openapi3.json\", {\n  headers: { \"Authorization\": \"<api-key>\" },\n});\nif (!resp.ok) throw new Error(`HTTP ${resp.status}`);\nconst data = await resp.json();"},"surface_id":"sn-81-grail-grafana-openapi"},{"auth":{"location":"header","name":"Authorization","scheme":"api-key","value_format":"<api-key>"},"auth_required":true,"auth_schemes":["apiKey","http"],"authority":"community","base_url":"https://grail-grafana.tplr.ai/api/health","capability":"Grail Grafana health","description":"Public no-auth GET /api/health on grail-grafana.tplr.ai returning application liveness JSON. Served on the Grail Grafana host registered as a dashboard surface and linked from the Grail source repository README.","eligibility":{"callable":false,"reasons":["not-bittensor-base-layer","status-unknown"],"live_status":"unknown"},"fixture":{"artifact_path":"/metagraph/fixtures/sn-81-grail-health.json","captured_at":"2026-07-27T10:51:25.372Z","request":{"method":"GET","url":"https://grail-grafana.tplr.ai/api/health"},"response":{"content_type":"application/json; charset=UTF-8","status":200}},"fixture_status":{"artifact_path":"/metagraph/fixtures/sn-81-grail-health.json","captured_at":"2026-07-27T10:51:25.372Z","reason":null,"status":"available"},"health":{"status":"unknown","classification":null,"latency_ms":null,"last_ok":null,"last_checked":null,"stale":false,"observed_by":"unavailable"},"kind":"subnet-api","provider":"one-covenant","schema_artifact":"/metagraph/schemas/sn-81-grail-grafana-openapi.json","schema_source":{"artifact":"/metagraph/schemas/sn-81-grail-grafana-openapi.json","hash":"350c90980c6fe9dd6d0ce0922e8a46e6281c5f43def8884c7b2e1de84a1b922f","match":"same-origin-openapi","observed_at":"2026-07-27T10:51:25.372Z","status":"captured","surface_id":"sn-81-grail-grafana-openapi","url":"https://grail-grafana.tplr.ai/public/openapi3.json"},"schema_status":"machine-readable","schema_url":"https://grail-grafana.tplr.ai/public/openapi3.json","snippets":{"curl":"curl -sS 'https://grail-grafana.tplr.ai/api/health' \\\n  -H 'Authorization: <api-key>'","python":"import requests\n\nresp = requests.get(\"https://grail-grafana.tplr.ai/api/health\", headers={\"Authorization\": \"<api-key>\"})\nresp.raise_for_status()\nprint(resp.json())","typescript":"const resp = await fetch(\"https://grail-grafana.tplr.ai/api/health\", {\n  headers: { \"Authorization\": \"<api-key>\" },\n});\nif (!resp.ok) throw new Error(`HTTP ${resp.status}`);\nconst data = await resp.json();"},"surface_id":"sn-81-grail-health"},{"auth":null,"auth_required":false,"auth_schemes":[],"authority":"community","base_url":"https://raw.githubusercontent.com/one-covenant/grail/main/compute.min.yaml","capability":"Grail minimum compute requirements","description":"Public no-auth YAML miner and validator minimum hardware specification published at the root of the official one-covenant/grail repository as compute.min.yaml. Documents SN81 Grail operator GPU, CPU, memory, and storage requirements for verifiable post-training rollouts across supported environments.","eligibility":{"callable":false,"reasons":["not-bittensor-base-layer","status-unknown"],"live_status":"unknown"},"fixture_status":{"artifact_path":null,"captured_at":null,"reason":"non-json response","status":"capture-failed"},"health":{"status":"unknown","classification":null,"latency_ms":null,"last_ok":null,"last_checked":null,"stale":false,"observed_by":"unavailable"},"kind":"data-artifact","provider":"one-covenant","schema_artifact":null,"schema_source":null,"schema_status":null,"schema_url":null,"snippets":{"curl":"curl -sS 'https://raw.githubusercontent.com/one-covenant/grail/main/compute.min.yaml'","python":"import requests\n\nresp = requests.get(\"https://raw.githubusercontent.com/one-covenant/grail/main/compute.min.yaml\")\nresp.raise_for_status()\nprint(resp.json())","typescript":"const resp = await fetch(\"https://raw.githubusercontent.com/one-covenant/grail/main/compute.min.yaml\");\nif (!resp.ok) throw new Error(`HTTP ${resp.status}`);\nconst data = await resp.json();"},"surface_id":"sn-81-grail-min-compute-spec"}],"slug":"sn-81","subnet_type":"application","operational_observed_at":"2026-07-27T22:30:18.289Z","health_source":"live-cron-prober","previously_known_as":["deprecated"]},"meta":{"artifact_path":"/metagraph/agent-catalog/81.json","cache":"standard","contract_version":"2026-07-03.2","generated_at":"2026-07-27T10:51:25.049Z","published_at":"2026-07-27T10:51:25.049Z","source":"live-cron-prober","operational_observed_at":"2026-07-27T22:30:18.289Z"}}