{"ok":true,"schema_version":1,"data":{"agent_readiness":{"blocker_level":"missing-data","blockers":[{"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":["docs_url"],"status":"callable"},"categories":["baseline-augmented","baseline-curated","identity-reviewed","official-source-repo","official-website"],"completeness_score":93,"contract_version":"2026-07-03.2","example_count":0,"examples":[],"generated_at":"2026-07-27T10:51:25.049Z","integration_readiness":100,"name":"Affine","netuid":120,"readiness":{"components":{"active_lifecycle":true,"auth_clarity":true,"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":100,"readiness_verified":true},"schema_version":1,"service_count":10,"services":[{"auth":null,"auth_required":false,"auth_schemes":[],"authority":"community","base_url":"https://api.affine.io/api/v1/config","capability":"Affine validator scoring config","description":"Public no-auth GET /api/v1/config on api.affine.io returning the live scoring config (observed: validator_burn_percentage). Documented in the subnet's own OpenAPI schema.","eligibility":{"callable":true,"reasons":["not-bittensor-base-layer"],"live_status":"ok"},"fixture":{"artifact_path":"/metagraph/fixtures/sn-120-affine-config.json","captured_at":"2026-07-27T10:51:25.372Z","request":{"method":"GET","url":"https://api.affine.io/api/v1/config"},"response":{"content_type":"application/json","status":200}},"fixture_status":{"artifact_path":"/metagraph/fixtures/sn-120-affine-config.json","captured_at":"2026-07-27T10:51:25.372Z","reason":null,"status":"available"},"health":{"status":"ok","classification":"live","latency_ms":367,"last_ok":"2026-07-27T22:00:18.291Z","last_checked":"2026-07-27T22:00:18.291Z","stale":false,"observed_by":"live-cron-prober"},"kind":"data-artifact","provider":"affine","schema_artifact":null,"schema_source":null,"schema_status":null,"schema_url":null,"snippets":{"curl":"curl -sS 'https://api.affine.io/api/v1/config'","python":"import requests\n\nresp = requests.get(\"https://api.affine.io/api/v1/config\")\nresp.raise_for_status()\nprint(resp.json())","typescript":"const resp = await fetch(\"https://api.affine.io/api/v1/config\");\nif (!resp.ok) throw new Error(`HTTP ${resp.status}`);\nconst data = await resp.json();"},"surface_id":"sn-120-affine-config"},{"auth":null,"auth_required":false,"auth_schemes":[],"authority":"community","base_url":"https://api.affine.io/api/v1/config/%7Bkey%7D","capability":"Affine config parameter detail","description":"GET /api/v1/config/{key} on api.affine.io -- detail record for a single named config parameter (value, type, version, update metadata), the per-item sibling of the already-registered bulk /api/v1/config surface. Documented in the subnet's own OpenAPI 3.1 schema with no security declared. Live-verified 2026-07-22 using a parameter name obtained from the bulk config surface: HTTP 200 JSON with the full parameter record; an unknown parameter name returns a clean HTTP 404 not-found response. probe.enabled:false -- percent-encoded path template; no per-surface path-param injection in the probe pipeline.","eligibility":{"callable":false,"reasons":["not-bittensor-base-layer","status-unknown"],"live_status":"unknown"},"fixture_status":{"artifact_path":null,"captured_at":null,"reason":"fixture capture only samples enabled GET probes","status":"non-get"},"health":{"status":"unknown","classification":null,"latency_ms":null,"last_ok":null,"last_checked":null,"stale":false,"observed_by":"unavailable"},"kind":"subnet-api","provider":"affine","schema_artifact":"/metagraph/schemas/sn-120-affine-openapi.json","schema_source":{"artifact":"/metagraph/schemas/sn-120-affine-openapi.json","hash":"bacd35a211fffb28e34742bfa6ca3a28b3a7d46de67faa56edcc0929769cacb1","match":"same-origin-openapi","observed_at":"2026-07-27T10:51:25.372Z","status":"captured","surface_id":"sn-120-affine-openapi","url":"https://api.affine.io/openapi.json"},"schema_status":"machine-readable","schema_url":"https://api.affine.io/openapi.json","snippets":{"curl":"curl -sS 'https://api.affine.io/api/v1/config/%7Bkey%7D'","python":"import requests\n\nresp = requests.get(\"https://api.affine.io/api/v1/config/%7Bkey%7D\")\nresp.raise_for_status()\nprint(resp.json())","typescript":"const resp = await fetch(\"https://api.affine.io/api/v1/config/%7Bkey%7D\");\nif (!resp.ok) throw new Error(`HTTP ${resp.status}`);\nconst data = await resp.json();"},"surface_id":"sn-120-affine-config-param"},{"auth":null,"auth_required":false,"auth_schemes":[],"authority":"community","base_url":"https://api.affine.io/api/v1/rank/current","capability":"Affine current champion rank","description":"Public no-auth GET /api/v1/rank/current on api.affine.io returning the current champion window (model reference, revision, since-block) plus past champions with their emission share. Documented as GET /api/v1/rank/current in the subnet's own OpenAPI 3.1 schema (already-registered sn-120-affine-openapi surface); same api.affine.io host as the existing health surface. Observed live and populated at submission time.","eligibility":{"callable":true,"reasons":["not-bittensor-base-layer"],"live_status":"ok"},"fixture":{"artifact_path":"/metagraph/fixtures/sn-120-affine-data-artifact.json","captured_at":"2026-07-27T10:51:25.372Z","request":{"method":"GET","url":"https://api.affine.io/api/v1/rank/current"},"response":{"content_type":"application/json","status":200}},"fixture_status":{"artifact_path":"/metagraph/fixtures/sn-120-affine-data-artifact.json","captured_at":"2026-07-27T10:51:25.372Z","reason":null,"status":"available"},"health":{"status":"ok","classification":"live","latency_ms":392,"last_ok":"2026-07-27T22:00:18.291Z","last_checked":"2026-07-27T22:00:18.291Z","stale":false,"observed_by":"live-cron-prober"},"kind":"data-artifact","provider":"affine","schema_artifact":null,"schema_source":null,"schema_status":null,"schema_url":null,"snippets":{"curl":"curl -sS 'https://api.affine.io/api/v1/rank/current'","python":"import requests\n\nresp = requests.get(\"https://api.affine.io/api/v1/rank/current\")\nresp.raise_for_status()\nprint(resp.json())","typescript":"const resp = await fetch(\"https://api.affine.io/api/v1/rank/current\");\nif (!resp.ok) throw new Error(`HTTP ${resp.status}`);\nconst data = await resp.json();"},"surface_id":"sn-120-affine-data-artifact"},{"auth":null,"auth_required":false,"auth_schemes":[],"authority":"community","base_url":"https://api.affine.io/api/v1/health","capability":"Affine API health","description":"Public no-auth GET /api/v1/health on api.affine.io returning liveness JSON (observed: {\"status\":\"ok\",\"service\":\"affine-api\"}). Documented as GET /api/v1/health in the subnet OpenAPI spec; api.affine.io/api/v1 is the default API_URL in the official affine-cortex API client.","eligibility":{"callable":true,"reasons":["not-bittensor-base-layer"],"live_status":"ok"},"fixture":{"artifact_path":"/metagraph/fixtures/sn-120-affine-health.json","captured_at":"2026-07-27T10:51:25.372Z","request":{"method":"GET","url":"https://api.affine.io/api/v1/health"},"response":{"content_type":"application/json","status":200}},"fixture_status":{"artifact_path":"/metagraph/fixtures/sn-120-affine-health.json","captured_at":"2026-07-27T10:51:25.372Z","reason":null,"status":"available"},"health":{"status":"ok","classification":"live","latency_ms":343,"last_ok":"2026-07-27T22:00:18.291Z","last_checked":"2026-07-27T22:00:18.291Z","stale":false,"observed_by":"live-cron-prober"},"kind":"subnet-api","provider":"affine","schema_artifact":"/metagraph/schemas/sn-120-affine-openapi.json","schema_source":{"artifact":"/metagraph/schemas/sn-120-affine-openapi.json","hash":"bacd35a211fffb28e34742bfa6ca3a28b3a7d46de67faa56edcc0929769cacb1","match":"same-origin-openapi","observed_at":"2026-07-27T10:51:25.372Z","status":"captured","surface_id":"sn-120-affine-openapi","url":"https://api.affine.io/openapi.json"},"schema_status":"machine-readable","schema_url":"https://api.affine.io/openapi.json","snippets":{"curl":"curl -sS 'https://api.affine.io/api/v1/health'","python":"import requests\n\nresp = requests.get(\"https://api.affine.io/api/v1/health\")\nresp.raise_for_status()\nprint(resp.json())","typescript":"const resp = await fetch(\"https://api.affine.io/api/v1/health\");\nif (!resp.ok) throw new Error(`HTTP ${resp.status}`);\nconst data = await resp.json();"},"surface_id":"sn-120-affine-health"},{"auth":null,"auth_required":false,"auth_schemes":[],"authority":"community","base_url":"https://api.affine.io/api/v1/miners/hotkey/%7Bhotkey%7D","capability":"Affine miner detail by hotkey","description":"GET /api/v1/miners/hotkey/{hotkey} on api.affine.io -- the same per-miner detail record as the uid lookup, addressed by the miner's hotkey instead. Documented in the subnet's own OpenAPI 3.1 schema with no security declared. Live-verified 2026-07-22 using a real value obtained from the uid-0 lookup on the sibling surface: HTTP 200 JSON returning the identical miner record; an unknown value returns a clean HTTP 404 not-found response, not an auth rejection. probe.enabled:false -- percent-encoded path template; no per-surface path-param injection in the probe pipeline.","eligibility":{"callable":false,"reasons":["not-bittensor-base-layer","status-unknown"],"live_status":"unknown"},"fixture_status":{"artifact_path":null,"captured_at":null,"reason":"fixture capture only samples enabled GET probes","status":"non-get"},"health":{"status":"unknown","classification":null,"latency_ms":null,"last_ok":null,"last_checked":null,"stale":false,"observed_by":"unavailable"},"kind":"subnet-api","provider":"affine","schema_artifact":"/metagraph/schemas/sn-120-affine-openapi.json","schema_source":{"artifact":"/metagraph/schemas/sn-120-affine-openapi.json","hash":"bacd35a211fffb28e34742bfa6ca3a28b3a7d46de67faa56edcc0929769cacb1","match":"same-origin-openapi","observed_at":"2026-07-27T10:51:25.372Z","status":"captured","surface_id":"sn-120-affine-openapi","url":"https://api.affine.io/openapi.json"},"schema_status":"machine-readable","schema_url":"https://api.affine.io/openapi.json","snippets":{"curl":"curl -sS 'https://api.affine.io/api/v1/miners/hotkey/%7Bhotkey%7D'","python":"import requests\n\nresp = requests.get(\"https://api.affine.io/api/v1/miners/hotkey/%7Bhotkey%7D\")\nresp.raise_for_status()\nprint(resp.json())","typescript":"const resp = await fetch(\"https://api.affine.io/api/v1/miners/hotkey/%7Bhotkey%7D\");\nif (!resp.ok) throw new Error(`HTTP ${resp.status}`);\nconst data = await resp.json();"},"surface_id":"sn-120-affine-miner-by-hotkey"},{"auth":null,"auth_required":false,"auth_schemes":[],"authority":"community","base_url":"https://api.affine.io/api/v1/miners/uid/%7Buid%7D","capability":"Affine miner detail by uid","description":"GET /api/v1/miners/uid/{uid} on api.affine.io -- per-miner detail record (model reference, revision, validity, block numbers) for a registered uid; path-parameterized sibling of the already-registered list-style surfaces. Documented in the subnet's own OpenAPI 3.1 schema (the already-registered sn-120-affine-openapi surface) with no security declared. Live-verified 2026-07-22: uid 0 returns HTTP 200 JSON with the matching miner record; a non-integer path value returns a clean HTTP 422 validation error naming the uid path field. probe.enabled:false -- the URL is a percent-encoded path template and the probe pipeline has no per-surface path-param injection.","eligibility":{"callable":false,"reasons":["not-bittensor-base-layer","status-unknown"],"live_status":"unknown"},"fixture_status":{"artifact_path":null,"captured_at":null,"reason":"fixture capture only samples enabled GET probes","status":"non-get"},"health":{"status":"unknown","classification":null,"latency_ms":null,"last_ok":null,"last_checked":null,"stale":false,"observed_by":"unavailable"},"kind":"subnet-api","provider":"affine","schema_artifact":"/metagraph/schemas/sn-120-affine-openapi.json","schema_source":{"artifact":"/metagraph/schemas/sn-120-affine-openapi.json","hash":"bacd35a211fffb28e34742bfa6ca3a28b3a7d46de67faa56edcc0929769cacb1","match":"same-origin-openapi","observed_at":"2026-07-27T10:51:25.372Z","status":"captured","surface_id":"sn-120-affine-openapi","url":"https://api.affine.io/openapi.json"},"schema_status":"machine-readable","schema_url":"https://api.affine.io/openapi.json","snippets":{"curl":"curl -sS 'https://api.affine.io/api/v1/miners/uid/%7Buid%7D'","python":"import requests\n\nresp = requests.get(\"https://api.affine.io/api/v1/miners/uid/%7Buid%7D\")\nresp.raise_for_status()\nprint(resp.json())","typescript":"const resp = await fetch(\"https://api.affine.io/api/v1/miners/uid/%7Buid%7D\");\nif (!resp.ok) throw new Error(`HTTP ${resp.status}`);\nconst data = await resp.json();"},"surface_id":"sn-120-affine-miner-by-uid"},{"auth":null,"auth_required":false,"auth_schemes":[],"authority":"community","base_url":"https://api.affine.io/openapi.json","capability":"Affine API OpenAPI schema","description":"Machine-readable OpenAPI 3.1 schema for the Affine SN120 API (title: Affine API). Served publicly at api.affine.io; documents rank, miner, score, config, and health routes.","eligibility":{"callable":false,"reasons":["not-bittensor-base-layer"],"live_status":"unknown"},"fixture":{"artifact_path":"/metagraph/fixtures/sn-120-affine-openapi.json","captured_at":"2026-07-27T10:51:25.372Z","request":{"method":"GET","url":"https://api.affine.io/openapi.json"},"response":{"content_type":"application/json","status":200}},"fixture_status":{"artifact_path":"/metagraph/fixtures/sn-120-affine-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":"affine","schema_artifact":"/metagraph/schemas/sn-120-affine-openapi.json","schema_source":{"artifact":"/metagraph/schemas/sn-120-affine-openapi.json","hash":"bacd35a211fffb28e34742bfa6ca3a28b3a7d46de67faa56edcc0929769cacb1","match":"surface-id","observed_at":"2026-07-27T10:51:25.372Z","status":"captured","surface_id":"sn-120-affine-openapi","url":"https://api.affine.io/openapi.json"},"schema_status":"machine-readable","schema_url":"https://api.affine.io/openapi.json","snippets":{"curl":"curl -sS 'https://api.affine.io/openapi.json'","python":"import requests\n\nresp = requests.get(\"https://api.affine.io/openapi.json\")\nresp.raise_for_status()\nprint(resp.json())","typescript":"const resp = await fetch(\"https://api.affine.io/openapi.json\");\nif (!resp.ok) throw new Error(`HTTP ${resp.status}`);\nconst data = await resp.json();"},"surface_id":"sn-120-affine-openapi"},{"auth":null,"auth_required":false,"auth_schemes":[],"authority":"community","base_url":"https://api.affine.io/api/v1/scores/uid/%7Buid%7D","capability":"Affine score detail by uid","description":"GET /api/v1/scores/uid/{uid} on api.affine.io -- per-miner score detail (overall and average score, per-environment scores, sample count) for a registered uid; path-parameterized sibling of the already-registered scores/latest surface. Documented in the subnet's own OpenAPI 3.1 schema with no security declared. Live-verified 2026-07-22: uid 0 returns HTTP 200 JSON with the matching score record. probe.enabled:false -- percent-encoded path template; no per-surface path-param injection in the probe pipeline.","eligibility":{"callable":false,"reasons":["not-bittensor-base-layer","status-unknown"],"live_status":"unknown"},"fixture_status":{"artifact_path":null,"captured_at":null,"reason":"fixture capture only samples enabled GET probes","status":"non-get"},"health":{"status":"unknown","classification":null,"latency_ms":null,"last_ok":null,"last_checked":null,"stale":false,"observed_by":"unavailable"},"kind":"subnet-api","provider":"affine","schema_artifact":"/metagraph/schemas/sn-120-affine-openapi.json","schema_source":{"artifact":"/metagraph/schemas/sn-120-affine-openapi.json","hash":"bacd35a211fffb28e34742bfa6ca3a28b3a7d46de67faa56edcc0929769cacb1","match":"same-origin-openapi","observed_at":"2026-07-27T10:51:25.372Z","status":"captured","surface_id":"sn-120-affine-openapi","url":"https://api.affine.io/openapi.json"},"schema_status":"machine-readable","schema_url":"https://api.affine.io/openapi.json","snippets":{"curl":"curl -sS 'https://api.affine.io/api/v1/scores/uid/%7Buid%7D'","python":"import requests\n\nresp = requests.get(\"https://api.affine.io/api/v1/scores/uid/%7Buid%7D\")\nresp.raise_for_status()\nprint(resp.json())","typescript":"const resp = await fetch(\"https://api.affine.io/api/v1/scores/uid/%7Buid%7D\");\nif (!resp.ok) throw new Error(`HTTP ${resp.status}`);\nconst data = await resp.json();"},"surface_id":"sn-120-affine-score-by-uid"},{"auth":null,"auth_required":false,"auth_schemes":[],"authority":"community","base_url":"https://api.affine.io/api/v1/scores/latest","capability":"Affine latest scores","description":"Public no-auth GET returning the latest per-miner scores (block_number, miner_hotkey, uid, model_revision). Documented in the subnet's own OpenAPI schema.","eligibility":{"callable":true,"reasons":["not-bittensor-base-layer"],"live_status":"ok"},"fixture":{"artifact_path":"/metagraph/fixtures/sn-120-affine-scores-latest.json","captured_at":"2026-07-27T10:51:25.372Z","request":{"method":"GET","url":"https://api.affine.io/api/v1/scores/latest"},"response":{"content_type":"application/json","status":200}},"fixture_status":{"artifact_path":"/metagraph/fixtures/sn-120-affine-scores-latest.json","captured_at":"2026-07-27T10:51:25.372Z","reason":null,"status":"available"},"health":{"status":"ok","classification":"live","latency_ms":2365,"last_ok":"2026-07-27T22:00:18.291Z","last_checked":"2026-07-27T22:00:18.291Z","stale":false,"observed_by":"live-cron-prober"},"kind":"subnet-api","provider":"affine","schema_artifact":"/metagraph/schemas/sn-120-affine-openapi.json","schema_source":{"artifact":"/metagraph/schemas/sn-120-affine-openapi.json","hash":"bacd35a211fffb28e34742bfa6ca3a28b3a7d46de67faa56edcc0929769cacb1","match":"same-origin-openapi","observed_at":"2026-07-27T10:51:25.372Z","status":"captured","surface_id":"sn-120-affine-openapi","url":"https://api.affine.io/openapi.json"},"schema_status":"machine-readable","schema_url":"https://api.affine.io/openapi.json","snippets":{"curl":"curl -sS 'https://api.affine.io/api/v1/scores/latest'","python":"import requests\n\nresp = requests.get(\"https://api.affine.io/api/v1/scores/latest\")\nresp.raise_for_status()\nprint(resp.json())","typescript":"const resp = await fetch(\"https://api.affine.io/api/v1/scores/latest\");\nif (!resp.ok) throw new Error(`HTTP ${resp.status}`);\nconst data = await resp.json();"},"surface_id":"sn-120-affine-scores-latest"},{"auth":null,"auth_required":false,"auth_schemes":[],"authority":"community","base_url":"https://api.affine.io/api/v1/scores/weights/latest","capability":"Affine latest weights","description":"Public no-auth GET returning the latest computed weights per UID alongside the scoring config. Documented in the subnet's own OpenAPI schema.","eligibility":{"callable":true,"reasons":["not-bittensor-base-layer"],"live_status":"ok"},"fixture":{"artifact_path":"/metagraph/fixtures/sn-120-affine-scores-weights-latest.json","captured_at":"2026-07-27T10:51:25.372Z","request":{"method":"GET","url":"https://api.affine.io/api/v1/scores/weights/latest"},"response":{"content_type":"application/json","status":200}},"fixture_status":{"artifact_path":"/metagraph/fixtures/sn-120-affine-scores-weights-latest.json","captured_at":"2026-07-27T10:51:25.372Z","reason":null,"status":"available"},"health":{"status":"ok","classification":"live","latency_ms":1130,"last_ok":"2026-07-27T22:00:18.291Z","last_checked":"2026-07-27T22:00:18.291Z","stale":false,"observed_by":"live-cron-prober"},"kind":"subnet-api","provider":"affine","schema_artifact":"/metagraph/schemas/sn-120-affine-openapi.json","schema_source":{"artifact":"/metagraph/schemas/sn-120-affine-openapi.json","hash":"bacd35a211fffb28e34742bfa6ca3a28b3a7d46de67faa56edcc0929769cacb1","match":"same-origin-openapi","observed_at":"2026-07-27T10:51:25.372Z","status":"captured","surface_id":"sn-120-affine-openapi","url":"https://api.affine.io/openapi.json"},"schema_status":"machine-readable","schema_url":"https://api.affine.io/openapi.json","snippets":{"curl":"curl -sS 'https://api.affine.io/api/v1/scores/weights/latest'","python":"import requests\n\nresp = requests.get(\"https://api.affine.io/api/v1/scores/weights/latest\")\nresp.raise_for_status()\nprint(resp.json())","typescript":"const resp = await fetch(\"https://api.affine.io/api/v1/scores/weights/latest\");\nif (!resp.ok) throw new Error(`HTTP ${resp.status}`);\nconst data = await resp.json();"},"surface_id":"sn-120-affine-scores-weights-latest"}],"slug":"sn-120","subnet_type":"application","operational_observed_at":"2026-07-27T22:00:18.291Z","health_source":"live-cron-prober"},"meta":{"artifact_path":"/metagraph/agent-catalog/120.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:00:18.291Z"}}