{"components":{"schemas":{"Entity":{"properties":{"entity_type_id":{"format":"uuid","type":"string"},"id":{"format":"uuid","type":"string"},"inserted_at":{"type":"string"},"jurisdiction_id":{"format":"uuid","type":"string"},"name":{"type":"string"},"updated_at":{"type":"string"}},"required":["id","name","entity_type_id","jurisdiction_id","inserted_at","updated_at"],"type":"object"},"EntityType":{"properties":{"id":{"format":"uuid","type":"string"},"inserted_at":{"type":"string"},"name":{"type":"string"},"updated_at":{"type":"string"}},"required":["id","name","inserted_at","updated_at"],"type":"object"},"Jurisdiction":{"properties":{"code":{"description":"Short code, e.g. `NV`, `CA`, `US`.","type":"string"},"id":{"format":"uuid","type":"string"},"inserted_at":{"type":"string"},"name":{"type":"string"},"updated_at":{"type":"string"}},"required":["id","name","code","inserted_at","updated_at"],"type":"object"},"Person":{"properties":{"email":{"format":"email","type":"string"},"id":{"format":"uuid","type":"string"},"inserted_at":{"type":"string"},"name":{"type":"string"},"oidc_subject":{"description":"OIDC `sub` claim once the row is linked.","type":["string","null"]},"roles":{"description":"Role names; the set OPA evaluates against.","items":{"type":"string"},"type":"array"},"updated_at":{"type":"string"}},"required":["id","name","email","roles","inserted_at","updated_at"],"type":"object"},"ValidateRequest":{"properties":{"contents":{"description":"Raw markdown body, including any YAML frontmatter.","type":"string"},"markdown_only":{"description":"Lint with `navigator_markdown_only_rules` instead of the default Navigator-notation set.","type":"boolean"},"path":{"description":"Pretend filename so rules that key off the path (e.g. F103 PascalCase) have something to read. Defaults to `Notation.md`.","type":"string"}},"required":["contents"],"type":"object"},"ValidateResponse":{"properties":{"clean":{"type":"boolean"},"path":{"type":"string"},"violations":{"items":{"$ref":"#/components/schemas/ValidationViolation"},"type":"array"}},"required":["path","clean","violations"],"type":"object"},"ValidationViolation":{"properties":{"code":{"description":"Rule code, e.g. `S101`, `F101`.","type":"string"},"line":{"format":"int32","type":"integer"},"message":{"type":"string"}},"required":["code","line","message"],"type":"object"}},"securitySchemes":{"bearerAuth":{"bearerFormat":"JWT","description":"Documented for completeness only: no `/api/*` operation in this document requires authentication. Admin surfaces (`/admin/*`) use an OIDC session cookie issued by the browser flow at `/auth/login` (Keycloak in KIND, Google Identity in production). The MCP endpoint (`/mcp`, JSON-RPC) accepts a Google OAuth access token as `Authorization: Bearer ya29.…`; in production the token is validated against Google's `tokeninfo` endpoint and the resulting principal is fed to the OPA policy decision point. Both surfaces are out of scope for this document.","scheme":"bearer","type":"http"}}},"info":{"contact":{"name":"Neon Law","url":"https://www.neonlaw.com/contact"},"description":"Read-only JSON listings for the Navigator domain tables, plus a stateless markdown notation validator. All `/api/*` endpoints are anonymous: no API key, no session cookie, no bearer token required. The MCP endpoint at `/mcp` (JSON-RPC, Google OAuth bearer) is documented separately.","title":"Navigator API","version":"0.1.0"},"openapi":"3.1.0","paths":{"/api/entities":{"get":{"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Entity"},"type":"array"}}},"description":"Entity list"}},"security":[],"summary":"List all entities"}},"/api/entities/{id}":{"get":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Entity"}}},"description":"Entity"},"404":{"description":"Not found"}},"security":[],"summary":"Get one entity by id"}},"/api/entity-types":{"get":{"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/EntityType"},"type":"array"}}},"description":"EntityType list"}},"security":[],"summary":"List all entity types"}},"/api/jurisdictions":{"get":{"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Jurisdiction"},"type":"array"}}},"description":"Jurisdiction list"}},"security":[],"summary":"List all jurisdictions"}},"/api/notations/validate":{"post":{"description":"Runs the Navigator rule engine over the supplied markdown and returns the violations. Stateless: no row is inserted, no template registered. Mirrors `cli validate` rule-set selection: the default uses `navigator_default_rules` (M-family markdown + F-family frontmatter + S101 line length); set `markdown_only: true` to drop the F-family and enable `S102` line packing.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateResponse"}}},"description":"Lint report"}},"security":[],"summary":"Lint a markdown notation without saving it"}},"/api/people":{"get":{"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Person"},"type":"array"}}},"description":"Person list"}},"security":[],"summary":"List all people"}},"/api/people/{id}":{"get":{"parameters":[{"in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Person"}}},"description":"Person"},"404":{"description":"Not found"}},"security":[],"summary":"Get one person by id"}}},"servers":[{"description":"Production","url":"https://www.neonlaw.com"}]}