{"ok":true,"schema_version":1,"data":{"agent_readiness":{"blocker_level":"missing-data","blockers":[{"code":"unclear-auth","field":"auth","message":"Callable services exist, but auth requirements are not fully machine-readable.","next_action":"Declare auth_required/auth_schemes or capture auth metadata from the service schema.","severity":"missing-data"},{"code":"missing-docs","field":"docs_url","message":"No public documentation link is recorded.","next_action":"Add an official docs URL or document that no public docs exist.","severity":"missing-data"}],"missing_fields":["auth","docs_url"],"status":"callable"},"categories":["baseline-augmented","baseline-curated","identity-reviewed","llm-inference","marketplace","official-source-repo","official-website","tee"],"completeness_score":93,"contract_version":"2026-07-03.2","example_count":0,"examples":[],"generated_at":"2026-07-27T10:51:25.049Z","integration_readiness":93,"name":"gm","netuid":28,"readiness":{"components":{"active_lifecycle":true,"auth_clarity":false,"callable_now":true,"documented":true,"has_callable_api":true,"has_candidate_api":true,"has_public_docs":false,"has_source_repo":true,"profile_complete":true},"readiness_tier":"buildable","readiness_version":2,"score":93,"readiness_verified":true},"schema_version":1,"service_count":8,"services":[{"auth":{"scheme":"bearer","scopes_note":"The subnet's own OpenAPI schema declares a single global bearer-token security requirement covering all four Gateway API operations. Enforced in practice: live-verified HTTP 401 unauthenticated on this endpoint (2026-07-21)."},"auth_required":true,"auth_schemes":[],"authority":"community","base_url":"https://api.saygm.com/v1/chat/completions","capability":"gm chat completions (write, auth-gated)","description":"POST /chat/completions on the gm Gateway API (schema servers base https://api.saygm.com/v1) -- OpenAI-compatible chat-completions inference endpoint, one of the four operations documented in the subnet's own OpenAPI schema, all under the schema's global bearer security requirement. Live-verified 2026-07-21 (~23:35 UTC): HTTP 401 unauthenticated with a JSON invalid-authentication error body. Registered auth_required:true with probe.enabled:false per the linked issue's guidance; the probe pipeline only supports GET/HEAD, so a POST operation is never probed.","eligibility":{"callable":false,"reasons":["not-bittensor-base-layer","status-unknown","auth-required"],"live_status":"unknown"},"fixture_status":{"artifact_path":null,"captured_at":null,"reason":"fixture capture skips credentialed services","status":"auth-required"},"health":{"status":"unknown","classification":null,"latency_ms":null,"last_ok":null,"last_checked":null,"stale":false,"observed_by":"unavailable"},"kind":"subnet-api","provider":"gm","schema_artifact":null,"schema_source":null,"schema_status":null,"schema_url":null,"snippets":{"curl":"curl -sS 'https://api.saygm.com/v1/chat/completions' \\\n  -H 'Authorization: Bearer YOUR_API_KEY'","python":"import requests\n\nresp = requests.get(\"https://api.saygm.com/v1/chat/completions\", headers={\"Authorization\": \"Bearer YOUR_API_KEY\"})\nresp.raise_for_status()\nprint(resp.json())","typescript":"const resp = await fetch(\"https://api.saygm.com/v1/chat/completions\", {\n  headers: { \"Authorization\": \"Bearer YOUR_API_KEY\" },\n});\nif (!resp.ok) throw new Error(`HTTP ${resp.status}`);\nconst data = await resp.json();"},"surface_id":"sn-28-gm-chat-completions"},{"auth":null,"auth_required":false,"auth_schemes":[],"authority":"community","base_url":"https://raw.githubusercontent.com/taostat/gm-miner/refs/heads/main/image/envoy.yaml","capability":"gm miner Envoy data-plane configuration","description":"Public no-auth machine-readable Envoy configuration for the SN28 gm miner data plane, committed in the official taostat/gm-miner repository (its README identifies the repo as the gm Bittensor subnet, netuid 28 mainnet, and links the registered saygm.com website). It is the canonical definition of the gm miner data plane: the provider routing table (Anthropic/OpenAI/Gemini/Chutes plus a benchmark route keyed on the x-gm-provider header), the inbound node-key auth Lua filter, HTTP local rate-limiting and load-shedding, the Prometheus metrics listener, and the RA-TLS attestation ingress listener. No secrets are present (keys and the node secret are rendered from container env at start).","eligibility":{"callable":true,"reasons":["not-bittensor-base-layer"],"live_status":"ok"},"fixture_status":{"artifact_path":null,"captured_at":null,"reason":"non-json response","status":"capture-failed"},"health":{"status":"ok","classification":"live","latency_ms":164,"last_ok":"2026-07-27T23:00:18.289Z","last_checked":"2026-07-27T23:00:18.289Z","stale":false,"observed_by":"live-cron-prober"},"kind":"data-artifact","provider":"gm","schema_artifact":null,"schema_source":null,"schema_status":null,"schema_url":null,"snippets":{"curl":"curl -sS 'https://raw.githubusercontent.com/taostat/gm-miner/refs/heads/main/image/envoy.yaml'","python":"import requests\n\nresp = requests.get(\"https://raw.githubusercontent.com/taostat/gm-miner/refs/heads/main/image/envoy.yaml\")\nresp.raise_for_status()\nprint(resp.json())","typescript":"const resp = await fetch(\"https://raw.githubusercontent.com/taostat/gm-miner/refs/heads/main/image/envoy.yaml\");\nif (!resp.ok) throw new Error(`HTTP ${resp.status}`);\nconst data = await resp.json();"},"surface_id":"sn-28-gm-envoy-config"},{"auth":{"scheme":"bearer","scopes_note":"The subnet's own OpenAPI schema declares a single global bearer-token security requirement covering all four Gateway API operations. Enforced in practice: live-verified HTTP 401 unauthenticated on this endpoint (2026-07-21)."},"auth_required":true,"auth_schemes":[],"authority":"community","base_url":"https://api.saygm.com/v1beta/models/%7BmodelAndAction%7D","capability":"gm Gemini-compatible model actions (write, auth-gated)","description":"POST /v1beta/models/{modelAndAction} -- Gemini-compatible generateContent / streamGenerateContent endpoint (modelAndAction e.g. gemini-2.5-pro:generateContent), the fourth operation in the subnet's own OpenAPI schema. Per the operation's own description it ignores the schema's global servers entry (https://api.saygm.com/v1): the real base is https://api.saygm.com with no /v1 prefix. Live-verified 2026-07-21 (~23:35 UTC): HTTP 401 UNAUTHENTICATED JSON error at the correct un-prefixed URL, while the naively /v1-prefixed URL returns 404 -- confirming the un-prefixed base is the live one. Path parameter registered with percent-encoded braces per the registry URL format. Registered auth_required:true with probe.enabled:false; the probe pipeline only supports GET/HEAD, so a POST operation is never probed.","eligibility":{"callable":false,"reasons":["not-bittensor-base-layer","status-unknown","auth-required"],"live_status":"unknown"},"fixture_status":{"artifact_path":null,"captured_at":null,"reason":"fixture capture skips credentialed services","status":"auth-required"},"health":{"status":"unknown","classification":null,"latency_ms":null,"last_ok":null,"last_checked":null,"stale":false,"observed_by":"unavailable"},"kind":"subnet-api","provider":"gm","schema_artifact":null,"schema_source":null,"schema_status":null,"schema_url":null,"snippets":{"curl":"curl -sS 'https://api.saygm.com/v1beta/models/%7BmodelAndAction%7D' \\\n  -H 'Authorization: Bearer YOUR_API_KEY'","python":"import requests\n\nresp = requests.get(\"https://api.saygm.com/v1beta/models/%7BmodelAndAction%7D\", headers={\"Authorization\": \"Bearer YOUR_API_KEY\"})\nresp.raise_for_status()\nprint(resp.json())","typescript":"const resp = await fetch(\"https://api.saygm.com/v1beta/models/%7BmodelAndAction%7D\", {\n  headers: { \"Authorization\": \"Bearer YOUR_API_KEY\" },\n});\nif (!resp.ok) throw new Error(`HTTP ${resp.status}`);\nconst data = await resp.json();"},"surface_id":"sn-28-gm-gemini-model-actions"},{"auth":{"location":"header","name":"Authorization","scheme":"bearer","value_format":"Bearer <token>"},"auth_required":true,"auth_schemes":["http"],"authority":"community","base_url":"https://saygm.com/healthz","capability":"gm gateway health","description":"Public no-auth GET /healthz on saygm.com returning gateway liveness (observed plain-text response: ok). Served on the same host as the registered OpenAPI spec and website surface.","eligibility":{"callable":true,"reasons":["not-bittensor-base-layer"],"live_status":"ok"},"fixture_status":{"artifact_path":null,"captured_at":null,"reason":"fixture capture skips credentialed services","status":"auth-required"},"health":{"status":"ok","classification":"live","latency_ms":166,"last_ok":"2026-07-27T23:00:18.289Z","last_checked":"2026-07-27T23:00:18.289Z","stale":false,"observed_by":"live-cron-prober"},"kind":"subnet-api","provider":"gm","schema_artifact":"/metagraph/schemas/sn-28-gm-openapi.json","schema_source":{"artifact":"/metagraph/schemas/sn-28-gm-openapi.json","hash":"a4c11d714e97682e266fa37fd52f676fdc53c493c5cbc13f4690efdac44c7b32","match":"same-origin-openapi","observed_at":"2026-07-27T10:51:25.372Z","status":"captured","surface_id":"sn-28-gm-openapi","url":"https://saygm.com/openapi.json"},"schema_status":"machine-readable","schema_url":"https://saygm.com/openapi.json","snippets":{"curl":"curl -sS 'https://saygm.com/healthz' \\\n  -H 'Authorization: Bearer <token>'","python":"import requests\n\nresp = requests.get(\"https://saygm.com/healthz\", headers={\"Authorization\": \"Bearer <token>\"})\nresp.raise_for_status()\nprint(resp.json())","typescript":"const resp = await fetch(\"https://saygm.com/healthz\", {\n  headers: { \"Authorization\": \"Bearer <token>\" },\n});\nif (!resp.ok) throw new Error(`HTTP ${resp.status}`);\nconst data = await resp.json();"},"surface_id":"sn-28-gm-health"},{"auth":{"scheme":"bearer","scopes_note":"The subnet's own OpenAPI schema declares a single global bearer-token security requirement covering all four Gateway API operations. Enforced in practice: live-verified HTTP 401 unauthenticated on this endpoint (2026-07-21)."},"auth_required":true,"auth_schemes":[],"authority":"community","base_url":"https://api.saygm.com/v1/messages","capability":"gm messages (write, auth-gated)","description":"POST /messages on the gm Gateway API (schema servers base https://api.saygm.com/v1) -- Anthropic Messages-API-compatible inference endpoint documented in the subnet's own OpenAPI schema under the same global bearer security requirement as the sibling /chat/completions operation. Live-verified 2026-07-21 (~23:35 UTC): HTTP 401 unauthenticated with a JSON authentication-error body (the linked issue listed this sibling as not individually spot-verified; this registration verified it directly). Registered auth_required:true with probe.enabled:false; the probe pipeline only supports GET/HEAD, so a POST operation is never probed.","eligibility":{"callable":false,"reasons":["not-bittensor-base-layer","status-unknown","auth-required"],"live_status":"unknown"},"fixture_status":{"artifact_path":null,"captured_at":null,"reason":"fixture capture skips credentialed services","status":"auth-required"},"health":{"status":"unknown","classification":null,"latency_ms":null,"last_ok":null,"last_checked":null,"stale":false,"observed_by":"unavailable"},"kind":"subnet-api","provider":"gm","schema_artifact":null,"schema_source":null,"schema_status":null,"schema_url":null,"snippets":{"curl":"curl -sS 'https://api.saygm.com/v1/messages' \\\n  -H 'Authorization: Bearer YOUR_API_KEY'","python":"import requests\n\nresp = requests.get(\"https://api.saygm.com/v1/messages\", headers={\"Authorization\": \"Bearer YOUR_API_KEY\"})\nresp.raise_for_status()\nprint(resp.json())","typescript":"const resp = await fetch(\"https://api.saygm.com/v1/messages\", {\n  headers: { \"Authorization\": \"Bearer YOUR_API_KEY\" },\n});\nif (!resp.ok) throw new Error(`HTTP ${resp.status}`);\nconst data = await resp.json();"},"surface_id":"sn-28-gm-messages"},{"auth":{"location":"header","name":"Authorization","scheme":"bearer","value_format":"Bearer <token>"},"auth_required":true,"auth_schemes":["http"],"authority":"community","base_url":"https://saygm.com/openapi.json","capability":"gm Gateway API OpenAPI spec","description":null,"eligibility":{"callable":false,"reasons":["not-bittensor-base-layer"],"live_status":"unknown"},"fixture":{"artifact_path":"/metagraph/fixtures/sn-28-gm-openapi.json","captured_at":"2026-07-27T10:51:25.372Z","request":{"method":"GET","url":"https://saygm.com/openapi.json"},"response":{"content_type":"application/json; charset=UTF-8","status":200}},"fixture_status":{"artifact_path":"/metagraph/fixtures/sn-28-gm-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":"gm","schema_artifact":"/metagraph/schemas/sn-28-gm-openapi.json","schema_source":{"artifact":"/metagraph/schemas/sn-28-gm-openapi.json","hash":"a4c11d714e97682e266fa37fd52f676fdc53c493c5cbc13f4690efdac44c7b32","match":"surface-id","observed_at":"2026-07-27T10:51:25.372Z","status":"captured","surface_id":"sn-28-gm-openapi","url":"https://saygm.com/openapi.json"},"schema_status":"machine-readable","schema_url":"https://saygm.com/openapi.json","snippets":{"curl":"curl -sS 'https://saygm.com/openapi.json' \\\n  -H 'Authorization: Bearer <token>'","python":"import requests\n\nresp = requests.get(\"https://saygm.com/openapi.json\", headers={\"Authorization\": \"Bearer <token>\"})\nresp.raise_for_status()\nprint(resp.json())","typescript":"const resp = await fetch(\"https://saygm.com/openapi.json\", {\n  headers: { \"Authorization\": \"Bearer <token>\" },\n});\nif (!resp.ok) throw new Error(`HTTP ${resp.status}`);\nconst data = await resp.json();"},"surface_id":"sn-28-gm-openapi"},{"auth":{"scheme":"bearer","scopes_note":"The subnet's own OpenAPI schema declares a single global bearer-token security requirement covering all four Gateway API operations. Enforced in practice: live-verified HTTP 401 unauthenticated on this endpoint (2026-07-21)."},"auth_required":true,"auth_schemes":[],"authority":"community","base_url":"https://api.saygm.com/v1/responses","capability":"gm responses (write, auth-gated)","description":"POST /responses on the gm Gateway API (schema servers base https://api.saygm.com/v1) -- OpenAI Responses-API-compatible inference endpoint documented in the subnet's own OpenAPI schema under the same global bearer security requirement as the sibling /chat/completions operation. Live-verified 2026-07-21 (~23:35 UTC): HTTP 401 unauthenticated with a JSON invalid-authentication error body (the linked issue listed this sibling as not individually spot-verified; this registration verified it directly). Registered auth_required:true with probe.enabled:false; the probe pipeline only supports GET/HEAD, so a POST operation is never probed.","eligibility":{"callable":false,"reasons":["not-bittensor-base-layer","status-unknown","auth-required"],"live_status":"unknown"},"fixture_status":{"artifact_path":null,"captured_at":null,"reason":"fixture capture skips credentialed services","status":"auth-required"},"health":{"status":"unknown","classification":null,"latency_ms":null,"last_ok":null,"last_checked":null,"stale":false,"observed_by":"unavailable"},"kind":"subnet-api","provider":"gm","schema_artifact":null,"schema_source":null,"schema_status":null,"schema_url":null,"snippets":{"curl":"curl -sS 'https://api.saygm.com/v1/responses' \\\n  -H 'Authorization: Bearer YOUR_API_KEY'","python":"import requests\n\nresp = requests.get(\"https://api.saygm.com/v1/responses\", headers={\"Authorization\": \"Bearer YOUR_API_KEY\"})\nresp.raise_for_status()\nprint(resp.json())","typescript":"const resp = await fetch(\"https://api.saygm.com/v1/responses\", {\n  headers: { \"Authorization\": \"Bearer YOUR_API_KEY\" },\n});\nif (!resp.ok) throw new Error(`HTTP ${resp.status}`);\nconst data = await resp.json();"},"surface_id":"sn-28-gm-responses"},{"auth":null,"auth_required":false,"auth_schemes":[],"authority":"community","base_url":"https://api.saygm.com/v1/models","capability":"gm model catalog API","description":null,"eligibility":{"callable":true,"reasons":["not-bittensor-base-layer"],"live_status":"ok"},"fixture":{"artifact_path":"/metagraph/fixtures/sn-28-gm-subnet-api.json","captured_at":"2026-07-27T10:51:25.372Z","request":{"method":"GET","url":"https://api.saygm.com/v1/models"},"response":{"content_type":"application/json","status":200}},"fixture_status":{"artifact_path":"/metagraph/fixtures/sn-28-gm-subnet-api.json","captured_at":"2026-07-27T10:51:25.372Z","reason":null,"status":"available"},"health":{"status":"ok","classification":"live","latency_ms":680,"last_ok":"2026-07-27T23:00:18.289Z","last_checked":"2026-07-27T23:00:18.289Z","stale":false,"observed_by":"live-cron-prober"},"kind":"subnet-api","provider":"gm","schema_artifact":null,"schema_source":null,"schema_status":null,"schema_url":null,"snippets":{"curl":"curl -sS 'https://api.saygm.com/v1/models'","python":"import requests\n\nresp = requests.get(\"https://api.saygm.com/v1/models\")\nresp.raise_for_status()\nprint(resp.json())","typescript":"const resp = await fetch(\"https://api.saygm.com/v1/models\");\nif (!resp.ok) throw new Error(`HTTP ${resp.status}`);\nconst data = await resp.json();"},"surface_id":"sn-28-gm-subnet-api"}],"slug":"gm","subnet_type":"application","operational_observed_at":"2026-07-27T23:00:18.289Z","health_source":"live-cron-prober"},"meta":{"artifact_path":"/metagraph/agent-catalog/28.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-27T23:00:18.289Z"}}