{"ok":true,"schema_version":1,"data":{"agent_readiness":{"blocker_level":"missing-data","blockers":[{"code":"missing-schema","field":"schemas","message":"At least one callable service exists, but no captured schema artifact is available.","next_action":"Capture an official OpenAPI/Swagger/JSON Schema source or document that no schema exists.","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":["docs_url","schemas"],"status":"callable"},"categories":["baseline-augmented","baseline-curated","identity-reviewed","official-source-repo","official-website"],"completeness_score":75,"contract_version":"2026-07-03.2","example_count":0,"examples":[],"generated_at":"2026-07-27T10:51:25.049Z","integration_readiness":83,"name":"ConnitoAI","netuid":102,"readiness":{"components":{"active_lifecycle":true,"auth_clarity":true,"callable_now":true,"documented":false,"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":83,"readiness_verified":true},"schema_version":1,"service_count":7,"services":[{"auth":null,"auth_required":false,"auth_schemes":[],"authority":"community","base_url":"https://cycle-api.connito.ai/blocks_until_next_phase","capability":"Connito phase countdown","description":"Public no-auth GET returning the training-cycle phase schedule (Distribute, Train, MinerCommit1/2, Submission block ranges). Documented in the subnet's own OpenAPI schema.","eligibility":{"callable":true,"reasons":["not-bittensor-base-layer","status-degraded"],"live_status":"ok"},"fixture":{"artifact_path":"/metagraph/fixtures/sn-102-connito-blocks-until-next-phase.json","captured_at":"2026-07-27T10:51:25.372Z","request":{"method":"GET","url":"https://cycle-api.connito.ai/blocks_until_next_phase"},"response":{"content_type":"application/json","status":200}},"fixture_status":{"artifact_path":"/metagraph/fixtures/sn-102-connito-blocks-until-next-phase.json","captured_at":"2026-07-27T10:51:25.372Z","reason":null,"status":"available"},"health":{"status":"ok","classification":"live","latency_ms":309,"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":"connito","schema_artifact":null,"schema_source":null,"schema_status":null,"schema_url":null,"snippets":{"curl":"curl -sS 'https://cycle-api.connito.ai/blocks_until_next_phase'","python":"import requests\n\nresp = requests.get(\"https://cycle-api.connito.ai/blocks_until_next_phase\")\nresp.raise_for_status()\nprint(resp.json())","typescript":"const resp = await fetch(\"https://cycle-api.connito.ai/blocks_until_next_phase\");\nif (!resp.ok) throw new Error(`HTTP ${resp.status}`);\nconst data = await resp.json();"},"surface_id":"sn-102-connito-blocks-until-next-phase"},{"auth":null,"auth_required":false,"auth_schemes":[],"authority":"community","base_url":"https://cycle-api.connito.ai/previous_phase_blocks","capability":"ConnitoAI previous phase block ranges","description":"Public no-auth GET /previous_phase_blocks on cycle-api.connito.ai returning the block-height range of each named phase (Distribute, Train, MinerCommit1/2, Submission, Validate, Merge, ValidatorCommit1/2) in the prior training cycle. Documented in the subnet's own OpenAPI schema (already-registered sn-102-connito-phase-openapi surface); same cycle-api.connito.ai host as the existing /get_phase surface. Cloudflare WAF in front of cycle-api.connito.ai may challenge simple automated probes from datacenter IPs; the endpoint is on the official phase-oracle host queried by miners and validators.","eligibility":{"callable":true,"reasons":["not-bittensor-base-layer","status-degraded"],"live_status":"ok"},"fixture":{"artifact_path":"/metagraph/fixtures/sn-102-connito-data-artifact.json","captured_at":"2026-07-27T10:51:25.372Z","request":{"method":"GET","url":"https://cycle-api.connito.ai/previous_phase_blocks"},"response":{"content_type":"application/json","status":200}},"fixture_status":{"artifact_path":"/metagraph/fixtures/sn-102-connito-data-artifact.json","captured_at":"2026-07-27T10:51:25.372Z","reason":null,"status":"available"},"health":{"status":"ok","classification":"live","latency_ms":307,"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":"connito","schema_artifact":null,"schema_source":null,"schema_status":null,"schema_url":null,"snippets":{"curl":"curl -sS 'https://cycle-api.connito.ai/previous_phase_blocks'","python":"import requests\n\nresp = requests.get(\"https://cycle-api.connito.ai/previous_phase_blocks\")\nresp.raise_for_status()\nprint(resp.json())","typescript":"const resp = await fetch(\"https://cycle-api.connito.ai/previous_phase_blocks\");\nif (!resp.ok) throw new Error(`HTTP ${resp.status}`);\nconst data = await resp.json();"},"surface_id":"sn-102-connito-data-artifact"},{"auth":null,"auth_required":false,"auth_schemes":[],"authority":"community","base_url":"https://cycle-api.connito.ai/get_init_peer_id","capability":"Connito init peer ID","description":"Public no-auth GET returning the current initial peer ID list for the training swarm. Documented in the subnet's own OpenAPI schema.","eligibility":{"callable":true,"reasons":["not-bittensor-base-layer","status-degraded"],"live_status":"ok"},"fixture":{"artifact_path":"/metagraph/fixtures/sn-102-connito-init-peer-id.json","captured_at":"2026-07-27T10:51:25.372Z","request":{"method":"GET","url":"https://cycle-api.connito.ai/get_init_peer_id"},"response":{"content_type":"application/json","status":200}},"fixture_status":{"artifact_path":"/metagraph/fixtures/sn-102-connito-init-peer-id.json","captured_at":"2026-07-27T10:51:25.372Z","reason":null,"status":"available"},"health":{"status":"ok","classification":"live","latency_ms":172,"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":"connito","schema_artifact":null,"schema_source":null,"schema_status":null,"schema_url":null,"snippets":{"curl":"curl -sS 'https://cycle-api.connito.ai/get_init_peer_id'","python":"import requests\n\nresp = requests.get(\"https://cycle-api.connito.ai/get_init_peer_id\")\nresp.raise_for_status()\nprint(resp.json())","typescript":"const resp = await fetch(\"https://cycle-api.connito.ai/get_init_peer_id\");\nif (!resp.ok) throw new Error(`HTTP ${resp.status}`);\nconst data = await resp.json();"},"surface_id":"sn-102-connito-init-peer-id"},{"auth":null,"auth_required":false,"auth_schemes":[],"authority":"community","base_url":"https://cycle-api.connito.ai/get_phase","capability":"ConnitoAI SN Owner phase API","description":"Public no-auth GET /get_phase on cycle-api.connito.ai returning the current training-cycle phase JSON (block height, phase_name, cycle_length, blocks_remaining_in_phase). Default owner_url in official Connito CycleCfg (config.py) and hard-pinned in miner-config.md; documented in the SN Owner Phase API reference. Cloudflare WAF in front of cycle-api.connito.ai may challenge simple automated probes from datacenter IPs; the endpoint is the official phase oracle queried by miners and validators.","eligibility":{"callable":true,"reasons":["not-bittensor-base-layer","status-degraded"],"live_status":"ok"},"fixture":{"artifact_path":"/metagraph/fixtures/sn-102-connito-phase-get-phase.json","captured_at":"2026-07-27T10:51:25.372Z","request":{"method":"GET","url":"https://cycle-api.connito.ai/get_phase"},"response":{"content_type":"application/json","status":200}},"fixture_status":{"artifact_path":"/metagraph/fixtures/sn-102-connito-phase-get-phase.json","captured_at":"2026-07-27T10:51:25.372Z","reason":null,"status":"available"},"health":{"status":"ok","classification":"live","latency_ms":221,"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":"connito","schema_artifact":null,"schema_source":null,"schema_status":null,"schema_url":null,"snippets":{"curl":"curl -sS 'https://cycle-api.connito.ai/get_phase'","python":"import requests\n\nresp = requests.get(\"https://cycle-api.connito.ai/get_phase\")\nresp.raise_for_status()\nprint(resp.json())","typescript":"const resp = await fetch(\"https://cycle-api.connito.ai/get_phase\");\nif (!resp.ok) throw new Error(`HTTP ${resp.status}`);\nconst data = await resp.json();"},"surface_id":"sn-102-connito-phase-get-phase"},{"auth":null,"auth_required":false,"auth_schemes":[],"authority":"community","base_url":"https://cycle-api.connito.ai/openapi.json","capability":"ConnitoAI SN Owner Phase API OpenAPI schema","description":"Machine-readable OpenAPI 3.x schema for the Connito SN102 SN Owner Phase Service (FastAPI title: Phase Service). Served at cycle-api.connito.ai; documents no-auth cycle-coordination routes such as GET /get_phase and GET /blocks_until_next_phase per the official SN Owner Phase API reference. Cloudflare WAF in front of cycle-api.connito.ai may challenge simple automated probes from datacenter IPs; miners and validators use this host as the locked owner_url in official configuration.","eligibility":{"callable":false,"reasons":["not-bittensor-base-layer","status-degraded"],"live_status":"unknown"},"fixture":{"artifact_path":"/metagraph/fixtures/sn-102-connito-phase-openapi.json","captured_at":"2026-07-27T10:51:25.372Z","request":{"method":"GET","url":"https://cycle-api.connito.ai/openapi.json"},"response":{"content_type":"application/json","status":200}},"fixture_status":{"artifact_path":"/metagraph/fixtures/sn-102-connito-phase-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":"connito","schema_artifact":null,"schema_source":{"artifact":null,"hash":null,"match":"surface-id","observed_at":null,"status":"not-found","surface_id":"sn-102-connito-phase-openapi","url":"https://cycle-api.connito.ai/openapi.json"},"schema_status":"machine-readable","schema_url":"https://cycle-api.connito.ai/openapi.json","snippets":{"curl":"curl -sS 'https://cycle-api.connito.ai/openapi.json'","python":"import requests\n\nresp = requests.get(\"https://cycle-api.connito.ai/openapi.json\")\nresp.raise_for_status()\nprint(resp.json())","typescript":"const resp = await fetch(\"https://cycle-api.connito.ai/openapi.json\");\nif (!resp.ok) throw new Error(`HTTP ${resp.status}`);\nconst data = await resp.json();"},"surface_id":"sn-102-connito-phase-openapi"},{"auth":null,"auth_required":false,"auth_schemes":[],"authority":"community","base_url":"https://cycle-api.connito.ai/","capability":"Connito phase service status","description":"Public no-auth GET / on cycle-api.connito.ai returning a service-status payload with the static training-cycle configuration (cycle_length, ordered phases array with name/length per phase). Documented in the subnet's own OpenAPI schema. Distinct from /get_phase (the current live phase) and /blocks_until_next_phase (a countdown) -- this is the static cycle-shape definition plus a liveness message. Cloudflare WAF in front of cycle-api.connito.ai may challenge simple automated probes from datacenter IPs; the endpoint is on the official phase-oracle host queried by miners and validators.","eligibility":{"callable":true,"reasons":["not-bittensor-base-layer","status-degraded"],"live_status":"ok"},"fixture":{"artifact_path":"/metagraph/fixtures/sn-102-connito-phase-status.json","captured_at":"2026-07-27T10:51:25.372Z","request":{"method":"GET","url":"https://cycle-api.connito.ai/"},"response":{"content_type":"application/json","status":200}},"fixture_status":{"artifact_path":"/metagraph/fixtures/sn-102-connito-phase-status.json","captured_at":"2026-07-27T10:51:25.372Z","reason":null,"status":"available"},"health":{"status":"ok","classification":"live","latency_ms":232,"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":"connito","schema_artifact":null,"schema_source":null,"schema_status":null,"schema_url":null,"snippets":{"curl":"curl -sS 'https://cycle-api.connito.ai/'","python":"import requests\n\nresp = requests.get(\"https://cycle-api.connito.ai/\")\nresp.raise_for_status()\nprint(resp.json())","typescript":"const resp = await fetch(\"https://cycle-api.connito.ai/\");\nif (!resp.ok) throw new Error(`HTTP ${resp.status}`);\nconst data = await resp.json();"},"surface_id":"sn-102-connito-phase-status"},{"auth":null,"auth_required":false,"auth_schemes":[],"authority":"community","base_url":"https://cycle-api.connito.ai/get_validator_whitelist","capability":"Connito validator whitelist","description":"Public no-auth GET returning the current list of whitelisted validator hotkeys. Documented in the subnet's own OpenAPI schema.","eligibility":{"callable":true,"reasons":["not-bittensor-base-layer","status-degraded"],"live_status":"ok"},"fixture":{"artifact_path":"/metagraph/fixtures/sn-102-connito-validator-whitelist.json","captured_at":"2026-07-27T10:51:25.372Z","request":{"method":"GET","url":"https://cycle-api.connito.ai/get_validator_whitelist"},"response":{"content_type":"application/json","status":200}},"fixture_status":{"artifact_path":"/metagraph/fixtures/sn-102-connito-validator-whitelist.json","captured_at":"2026-07-27T10:51:25.372Z","reason":null,"status":"available"},"health":{"status":"ok","classification":"live","latency_ms":189,"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":"connito","schema_artifact":null,"schema_source":null,"schema_status":null,"schema_url":null,"snippets":{"curl":"curl -sS 'https://cycle-api.connito.ai/get_validator_whitelist'","python":"import requests\n\nresp = requests.get(\"https://cycle-api.connito.ai/get_validator_whitelist\")\nresp.raise_for_status()\nprint(resp.json())","typescript":"const resp = await fetch(\"https://cycle-api.connito.ai/get_validator_whitelist\");\nif (!resp.ok) throw new Error(`HTTP ${resp.status}`);\nconst data = await resp.json();"},"surface_id":"sn-102-connito-validator-whitelist"}],"slug":"sn-102","subnet_type":"application","operational_observed_at":"2026-07-27T23:00:18.289Z","health_source":"live-cron-prober"},"meta":{"artifact_path":"/metagraph/agent-catalog/102.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"}}