{"openapi":"3.1.0","info":{"title":"RJ Knowledge Graph API","version":"3.2.0","description":"Edge-native knowledge graph + multi-tier agent memory system. Persistent memory with namespaces, Graph-RAG Q&A, semantic search — running on Cloudflare. MCP endpoint at POST /mcp.","contact":{"name":"RJ Business Solutions","email":"support@rjbusinesssolutions.org","url":"https://rjbusinesssolutions.org"}},"servers":[{"url":"https://rj-knowledge-graph.pages.dev"}],"security":[{"ApiKey":[]},{}],"components":{"securitySchemes":{"ApiKey":{"type":"apiKey","in":"header","name":"x-api-key","description":"Optional — omit for demo tier (1K calls/mo shared). Get a free key at POST /api/billing/keys."}}},"paths":{"/api/memory/remember":{"post":{"operationId":"rememberMemory","summary":"Store a memory","description":"Stores a memory, auto-links graph entities, embeds via Cloudflare Workers AI for vector recall. Use namespace for agent-private lanes.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","description":"The memory content"},"context":{"type":"string","description":"Situation/task context"},"tier":{"type":"string","enum":["short_term","episodic","semantic","procedural"],"default":"episodic"},"importance":{"type":"number","description":"0-1 weight, default 0.5"},"agent_id":{"type":"string","description":"Your agent identifier"},"namespace":{"type":"string","description":"\"shared\" (default) or private lane e.g. \"agent:sales-bot\""}},"required":["content"]}}}},"responses":{"200":{"description":"Memory stored","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"memory_id":{"type":"number"},"linked_entities":{"type":"number"},"embedding":{"type":"string"}}}}}}}}},"/api/memory/recall":{"post":{"operationId":"recallMemories","summary":"Recall relevant memories","description":"Hybrid retrieval: vector similarity + lexical + recency + importance. Searches your namespace plus the shared lane.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string","description":"What to remember about"},"tier":{"type":"string"},"top_k":{"type":"number","description":"default 10, max 50"},"agent_id":{"type":"string"},"namespace":{"type":"string"}},"required":["query"]}}}},"responses":{"200":{"description":"Scored memories","content":{"application/json":{"schema":{"type":"object","properties":{"mode":{"type":"string","description":"vector-hybrid | lexical"},"results":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number"},"score":{"type":"number"},"content":{"type":"string"},"namespace":{"type":"string"},"tier":{"type":"string"}}}}}}}}}}}},"/api/ask":{"post":{"operationId":"askGraph","summary":"Graph-RAG question answering","description":"Answers a natural-language question using graph entities, relationships, document chunks, and memories.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"question":{"type":"string"}},"required":["question"]}}}},"responses":{"200":{"description":"Answer with sources","content":{"application/json":{"schema":{"type":"object","properties":{"answer":{"type":"string"},"mode":{"type":"string"},"sources":{"type":"array","items":{"type":"string"}}}}}}}}}},"/api/ingest":{"post":{"operationId":"ingestDocument","summary":"Ingest a document into the knowledge graph","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"path":{"type":"string","description":"Virtual path e.g. notes/meeting.md"},"content":{"type":"string","description":"Full text"}},"required":["path","content"]}}}},"responses":{"200":{"description":"Extraction stats","content":{"application/json":{"schema":{"type":"object","properties":{"entities":{"type":"number"},"relationships":{"type":"number"},"chunks":{"type":"number"}}}}}}}}},"/api/search":{"get":{"operationId":"searchGraph","summary":"Keyword search over entities + chunks","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Entities and ranked chunks"}}}},"/api/search/semantic":{"get":{"operationId":"semanticSearch","summary":"Vector semantic search (Workers AI embeddings)","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Cosine-ranked results"}}}},"/api/graph":{"get":{"operationId":"getGraph","summary":"Graph nodes + links (PageRank-ranked)","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":100}}],"responses":{"200":{"description":"nodes[] and links[]"}}}},"/api/graph/path":{"get":{"operationId":"findPath","summary":"Shortest path between two entities","parameters":[{"name":"from","in":"query","required":true,"schema":{"type":"integer"}},{"name":"to","in":"query","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Path node list + hop count"}}}},"/api/agents":{"get":{"operationId":"listAgents","summary":"Agent registry + namespace stats","responses":{"200":{"description":"agents[] and namespaces[]"}}}},"/api/billing/keys":{"post":{"operationId":"createApiKey","summary":"Create an API key (self-serve)","security":[{}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"owner_name":{"type":"string"},"owner_email":{"type":"string"},"tier":{"type":"string","enum":["free","pro","enterprise"],"default":"free"}},"required":["owner_name"]}}}},"responses":{"200":{"description":"Key issued (shown once)","content":{"application/json":{"schema":{"type":"object","properties":{"api_key":{"type":"string"},"tier":{"type":"string"},"monthly_limit":{"type":"number"}}}}}}}}},"/api/billing/usage":{"get":{"operationId":"getUsage","summary":"Current-month usage + limits","responses":{"200":{"description":"used / limit / by_endpoint"}}}},"/api/system/status":{"get":{"operationId":"systemStatus","summary":"Capabilities + embedding backend + versions","security":[{}],"responses":{"200":{"description":"status object"}}}}}}