{"openapi":"3.1.0","info":{"title":"Verathos","version":"0.1.0"},"paths":{"/api/auth/register":{"post":{"summary":"Register","description":"Forward registration to proxy. Returns { email, api_key }.","operationId":"register_api_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/login":{"post":{"summary":"Login","description":"Validate credentials against proxy. Returns { email, user_id } — no key generated.","operationId":"login_api_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/create-key":{"post":{"summary":"Create Key","description":"Validate credentials and create a new API key. Returns { email, api_key }.","operationId":"create_key_api_auth_create_key_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/me":{"get":{"summary":"Me","description":"Validate a stored API key and return user info.\n\nExpects Authorization: Bearer <api_key> or X-User-Api-Key header.","operationId":"me_api_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/deposits/address":{"get":{"summary":"Deposit Address","description":"Return per-user TAO + Base deposit addresses.","operationId":"deposit_address_api_deposits_address_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/deposits/withdraw":{"post":{"summary":"Withdraw","description":"Request a TAO withdrawal to the user's deposit address.","operationId":"withdraw_api_deposits_withdraw_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/deposits/balance":{"get":{"summary":"Balance","description":"Return current credit balance for the authenticated user.","operationId":"balance_api_deposits_balance_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/models/presets":{"get":{"tags":["models"],"summary":"List Presets","operationId":"list_presets_api_models_presets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelPresetsResponse"}}}}}}},"/api/models/load":{"post":{"tags":["models"],"summary":"Load Model","operationId":"load_model_api_models_load_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoadModelRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/models/status":{"get":{"tags":["models"],"summary":"Model Status","operationId":"model_status_api_models_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelStatusResponse"}}}}}}},"/api/models/unload":{"post":{"tags":["models"],"summary":"Unload Model","operationId":"unload_model_api_models_unload_post","responses":{"204":{"description":"Successful Response"}}}},"/api/models/chain-info":{"get":{"tags":["models"],"summary":"Chain Info","description":"Return on-chain deployment details (chain or proxy mode).","operationId":"chain_info_api_models_chain_info_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChainInfoResponse"}}}}}}},"/api/models/refresh":{"post":{"tags":["models"],"summary":"Refresh Miners","description":"Re-run miner discovery (chain mode only).","operationId":"refresh_miners_api_models_refresh_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelPresetsResponse"}}}}}}},"/api/chat/{conversation_id}":{"post":{"tags":["chat"],"summary":"Chat Stream","description":"Send a message and receive a streaming SSE response.\n\nAnonymous users: rate-limited, use sponsored key.\nLogged-in users: use their own API key, no webapp-level rate limit.","operationId":"chat_stream_api_chat__conversation_id__post","parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","title":"Conversation Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/conversations/":{"get":{"tags":["conversations"],"summary":"List Conversations","operationId":"list_conversations_api_conversations__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ConversationSummary"},"type":"array","title":"Response List Conversations Api Conversations  Get"}}}}}},"post":{"tags":["conversations"],"summary":"Create Conversation","operationId":"create_conversation_api_conversations__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateConversationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/conversations/{conversation_id}":{"get":{"tags":["conversations"],"summary":"Get Conversation","operationId":"get_conversation_api_conversations__conversation_id__get","parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","title":"Conversation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["conversations"],"summary":"Update Conversation","operationId":"update_conversation_api_conversations__conversation_id__patch","parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","title":"Conversation Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateConversationRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["conversations"],"summary":"Delete Conversation","operationId":"delete_conversation_api_conversations__conversation_id__delete","parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","title":"Conversation Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/conversations/claim":{"post":{"tags":["conversations"],"summary":"Claim Conversations","description":"Move anonymous session conversations to a logged-in user. Call after login.","operationId":"claim_conversations_api_conversations_claim_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/dashboard":{"get":{"tags":["dashboard"],"summary":"Get Dashboard","description":"Return network dashboard data from the proxy's /v1/network/stats.\n\nThe proxy is the single source of truth — it maintains miners, validators,\nmodels, and usage stats. No direct chain queries from the webapp.\nResponse is cached for 60 seconds.","operationId":"get_dashboard_api_dashboard_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/dashboard/timeseries":{"get":{"tags":["dashboard"],"summary":"Get Usage Timeseries","description":"Forward usage timeseries request to the proxy.","operationId":"get_usage_timeseries_api_dashboard_timeseries_get","parameters":[{"name":"range","in":"query","required":false,"schema":{"type":"string","default":"24h","title":"Range"}},{"name":"model_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/docs/list":{"get":{"tags":["docs"],"summary":"List Docs","description":"Return ordered list of available documentation pages.","operationId":"list_docs_api_docs_list_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocListResponse"}}}}}}},"/api/docs/{slug}":{"get":{"tags":["docs"],"summary":"Get Doc","description":"Return the markdown content of a documentation page.","operationId":"get_doc_api_docs__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocContentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/health":{"get":{"summary":"Health","operationId":"health_api_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/install.sh":{"get":{"summary":"Install Script","operationId":"install_script_install_sh_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/{full_path}":{"get":{"summary":"Serve Spa","operationId":"serve_spa__full_path__get","parameters":[{"name":"full_path","in":"path","required":true,"schema":{"type":"string","title":"Full Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"ChainInfoResponse":{"properties":{"network_name":{"type":"string","title":"Network Name"},"chain_id":{"type":"integer","title":"Chain Id"},"rpc_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rpc Url"},"netuid":{"type":"integer","title":"Netuid"},"model_registry_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Registry Address"},"miner_registry_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Miner Registry Address"}},"type":"object","required":["network_name","chain_id","netuid"],"title":"ChainInfoResponse","description":"On-chain deployment info for display in the UI."},"ChatRequest":{"properties":{"content":{"type":"string","maxLength":100000,"minLength":1,"title":"Content"},"temperature":{"type":"number","maximum":2.0,"minimum":0.0,"title":"Temperature","default":0.0},"max_tokens":{"type":"integer","maximum":32768.0,"minimum":1.0,"title":"Max Tokens","default":4096},"system_prompt":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"System Prompt"},"enable_thinking":{"type":"boolean","title":"Enable Thinking","default":true},"enable_tools":{"type":"boolean","title":"Enable Tools","default":true},"include_proof":{"type":"boolean","title":"Include Proof","default":true},"top_p":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Top P"},"top_k":{"anyOf":[{"type":"integer","maximum":1000.0,"minimum":-1.0},{"type":"null"}],"title":"Top K"},"min_p":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Min P"}},"type":"object","required":["content"],"title":"ChatRequest"},"ConversationResponse":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"model_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Name"},"system_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"System Prompt"},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"},"messages":{"items":{"$ref":"#/components/schemas/MessageResponse"},"type":"array","title":"Messages","default":[]}},"type":"object","required":["id","title","created_at","updated_at"],"title":"ConversationResponse"},"ConversationSummary":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"model_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Name"},"updated_at":{"type":"string","title":"Updated At"},"message_count":{"type":"integer","title":"Message Count","default":0}},"type":"object","required":["id","title","updated_at"],"title":"ConversationSummary"},"CreateConversationRequest":{"properties":{"title":{"type":"string","maxLength":200,"title":"Title","default":"New Chat"},"system_prompt":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}],"title":"System Prompt"}},"type":"object","title":"CreateConversationRequest"},"DocContentResponse":{"properties":{"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"group":{"type":"string","title":"Group"},"content":{"type":"string","title":"Content"}},"type":"object","required":["slug","title","group","content"],"title":"DocContentResponse"},"DocEntry":{"properties":{"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"group":{"type":"string","title":"Group"},"coming_soon":{"type":"boolean","title":"Coming Soon","default":false}},"type":"object","required":["slug","title","group"],"title":"DocEntry"},"DocListResponse":{"properties":{"docs":{"items":{"$ref":"#/components/schemas/DocEntry"},"type":"array","title":"Docs"}},"type":"object","required":["docs"],"title":"DocListResponse"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"LoadModelRequest":{"properties":{"preset_id":{"type":"string","title":"Preset Id"},"quantization":{"type":"string","title":"Quantization"},"tee_preferred":{"type":"boolean","title":"Tee Preferred","default":false}},"type":"object","required":["preset_id","quantization"],"title":"LoadModelRequest"},"LoginRequest":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"LoginRequest"},"MessageResponse":{"properties":{"id":{"type":"string","title":"Id"},"role":{"type":"string","title":"Role"},"content":{"type":"string","title":"Content"},"thinking":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thinking"},"proof":{"anyOf":[{"$ref":"#/components/schemas/ProofDetailsResponse"},{"type":"null"}]},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["id","role","content","created_at"],"title":"MessageResponse"},"ModelPresetResponse":{"properties":{"id":{"type":"string","title":"Id"},"label":{"type":"string","title":"Label"},"model_name":{"type":"string","title":"Model Name"},"quant_options":{"items":{"$ref":"#/components/schemas/QuantOptionResponse"},"type":"array","title":"Quant Options"},"category":{"type":"string","title":"Category"},"has_tee":{"type":"boolean","title":"Has Tee","default":false},"tee_only":{"type":"boolean","title":"Tee Only","default":false}},"type":"object","required":["id","label","model_name","quant_options","category"],"title":"ModelPresetResponse"},"ModelPresetsResponse":{"properties":{"presets":{"additionalProperties":{"items":{"$ref":"#/components/schemas/ModelPresetResponse"},"type":"array"},"type":"object","title":"Presets"}},"type":"object","required":["presets"],"title":"ModelPresetsResponse"},"ModelStatusResponse":{"properties":{"loaded":{"type":"boolean","title":"Loaded"},"mode":{"type":"string","title":"Mode","default":"local"},"preset_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preset Id"},"model_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Name"},"num_layers":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Num Layers"},"quant_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Quant Label"},"is_moe":{"type":"boolean","title":"Is Moe","default":false},"moe_info":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Moe Info"},"k_layers":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"K Layers"},"detection_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Detection Pct"},"vram_gb":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Vram Gb"},"max_model_len":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Model Len"},"miner_endpoint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Miner Endpoint"},"miner_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Miner Address"},"weight_merkle_root":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Weight Merkle Root"},"miner_online":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Miner Online"},"proof_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Proof Mode"},"tools_supported":{"type":"boolean","title":"Tools Supported","default":false}},"type":"object","required":["loaded"],"title":"ModelStatusResponse"},"ProofDetailsResponse":{"properties":{"model_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Name"},"passed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Passed"},"message":{"type":"string","title":"Message","default":""},"proof_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Proof Mode"},"inference_ms":{"type":"number","title":"Inference Ms","default":0.0},"ttft_ms":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Ttft Ms"},"prove_ms":{"type":"number","title":"Prove Ms","default":0.0},"verify_ms":{"type":"number","title":"Verify Ms","default":0.0},"overhead_pct":{"type":"number","title":"Overhead Pct","default":0.0},"tokens_per_sec":{"type":"number","title":"Tokens Per Sec","default":0.0},"num_output_tokens":{"type":"integer","title":"Num Output Tokens","default":0},"challenged_layers":{"items":{"type":"integer"},"type":"array","title":"Challenged Layers","default":[]},"total_layers":{"type":"integer","title":"Total Layers","default":0},"proof_size_kb":{"type":"number","title":"Proof Size Kb","default":0.0},"beacon_valid":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Beacon Valid"},"detection_prob_single":{"type":"number","title":"Detection Prob Single","default":0.0},"detection_prob_10":{"type":"number","title":"Detection Prob 10","default":0.0},"detection_prob_100":{"type":"number","title":"Detection Prob 100","default":0.0},"sampling_verification_bps":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sampling Verification Bps"},"sampling_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Sampling Active"},"sampling_positions":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Sampling Positions"},"do_sample":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Do Sample"},"temperature":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Temperature"},"is_moe":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Moe"},"moe_info":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Moe Info"},"embedding_proof":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Embedding Proof"},"transition_chain_verified":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Transition Chain Verified"},"tee_attestation_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tee Attestation Status"},"tee_platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tee Platform"},"tee_enclave_pubkey":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tee Enclave Pubkey"},"tee_attestation_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tee Attestation Hash"},"tee_model_weight_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tee Model Weight Hash"}},"additionalProperties":true,"type":"object","title":"ProofDetailsResponse"},"QuantOptionResponse":{"properties":{"quant":{"type":"string","title":"Quant"},"max_model_len":{"type":"integer","title":"Max Model Len"}},"type":"object","required":["quant","max_model_len"],"title":"QuantOptionResponse"},"RegisterRequest":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"RegisterRequest"},"UpdateConversationRequest":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"system_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"System Prompt"}},"type":"object","title":"UpdateConversationRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}