{"openapi":"3.1.0","info":{"title":"GraphCanon API","version":"1.0.0","description":"Open, read-only JSON API for GraphCanon - The knowledge graph for AI development. No authentication required."},"servers":[{"url":"https://www.graphcanon.com/api/graphcanon"}],"paths":{"/tools":{"get":{"summary":"List / filter tools","parameters":[{"name":"q","in":"query","schema":{"type":"string"},"description":"Full-text query."},{"name":"category","in":"query","schema":{"type":"string"},"description":"Filter by category slug."},{"name":"tag","in":"query","schema":{"type":"string"},"description":"Filter by tag slug."},{"name":"language","in":"query","schema":{"type":"string"},"description":"Filter by primary language."},{"name":"sort","in":"query","schema":{"type":"string","enum":["stars","recent","name"]}},{"name":"limit","in":"query","schema":{"type":"integer","default":20,"maximum":100}},{"name":"offset","in":"query","schema":{"type":"integer","default":0}}],"responses":{"200":{"description":"A page of tools.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ToolSummary"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}}}}},"/tools/{slug}":{"get":{"summary":"Get a tool by slug","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The tool.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ToolDetail"}}}}}},"404":{"description":"Not found."}}}},"/categories":{"get":{"summary":"List categories","responses":{"200":{"description":"All categories.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Category"}}}}}}}}}},"/categories/{slug}":{"get":{"summary":"Get a category and its tools","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The category with its tools."},"404":{"description":"Not found."}}}},"/search":{"get":{"summary":"Search tools","parameters":[{"name":"q","in":"query","schema":{"type":"string"},"description":"Full-text query."},{"name":"category","in":"query","schema":{"type":"string"},"description":"Filter by category slug."},{"name":"tag","in":"query","schema":{"type":"string"},"description":"Filter by tag slug."},{"name":"language","in":"query","schema":{"type":"string"},"description":"Filter by primary language."},{"name":"sort","in":"query","schema":{"type":"string","enum":["stars","recent","name"]}},{"name":"limit","in":"query","schema":{"type":"integer","default":20,"maximum":100}},{"name":"offset","in":"query","schema":{"type":"integer","default":0}}]}},"/graph":{"get":{"summary":"Get a tool's graph neighbourhood","parameters":[{"name":"tool","in":"query","required":true,"schema":{"type":"string"},"description":"Tool slug."}],"responses":{"200":{"description":"Node, categories, tags, explicit edges, and shared-category neighbours."},"404":{"description":"Not found."}}}}},"components":{"schemas":{"ToolSummary":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"tagline":{"type":"string","nullable":true},"github_url":{"type":"string","format":"uri"},"owner":{"type":"string"},"repo":{"type":"string"},"owner_avatar_url":{"type":"string","format":"uri","nullable":true},"primary_language":{"type":"string","nullable":true},"stars":{"type":"integer"},"forks":{"type":"integer"},"topics":{"type":"array","items":{"type":"string"}},"url":{"type":"string","format":"uri"},"markdown_url":{"type":"string","format":"uri"},"api_url":{"type":"string","format":"uri"},"graph_url":{"type":"string","format":"uri"}}},"ToolDetail":{"allOf":[{"$ref":"#/components/schemas/ToolSummary"},{"type":"object","properties":{"description":{"type":"string","nullable":true},"homepage_url":{"type":"string","format":"uri","nullable":true},"license":{"type":"string","nullable":true},"open_issues":{"type":"integer"},"watchers":{"type":"integer"},"ai_summary":{"type":"string","nullable":true},"readme_excerpt":{"type":"string","nullable":true},"categories":{"type":"array","items":{"$ref":"#/components/schemas/Category"}},"tags":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"}}}}}}]},"Category":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"tool_count":{"type":"integer"},"url":{"type":"string","format":"uri"},"markdown_url":{"type":"string","format":"uri"},"api_url":{"type":"string","format":"uri"}}},"Pagination":{"type":"object","properties":{"total":{"type":"integer"},"limit":{"type":"integer"},"offset":{"type":"integer"},"next_offset":{"type":"integer","nullable":true}}}}}}