{"openapi":"3.1.0","info":{"title":"TicketIQ 2.0","version":"0.1.0"},"paths":{"/api/login":{"post":{"summary":"Login","operationId":"login_api_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginBody"}}},"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/sso/providers":{"get":{"summary":"Sso Providers Public","description":"Enough to draw the buttons, and nothing else — no client ids, no URLs,\nno provisioning policy. An empty list means the login page shows no SSO at\nall, which is the honest rendering of an instance with none configured.\n\n`password_login` false when SSO is required of every account: the page\nthen hides the password form rather than offering a way in that refuses\neveryone but a break-glass owner. It says no more than the hidden form\nwould.","operationId":"sso_providers_public_api_auth_sso_providers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Sso Providers Public Api Auth Sso Providers Get"}}}}}}},"/api/auth/sso/{name}/start":{"get":{"summary":"Sso Start","operationId":"sso_start_api_auth_sso__name__start_get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"app","in":"query","required":false,"schema":{"type":"string","default":"","title":"App"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/sso/callback":{"get":{"summary":"Sso Callback","description":"Finish sign-in and land the person in the console.\n\nFailures redirect back to the login page with a short reason rather than\nrendering an API error, because the person here is a human in a browser who\nclicked a button, not an API client.","operationId":"sso_callback_api_auth_sso_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"type":"string","default":"","title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","default":"","title":"State"}},{"name":"error","in":"query","required":false,"schema":{"type":"string","default":"","title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/sso/exchange":{"post":{"summary":"Sso Exchange","description":"The app's end of an SSO sign-in: its one-time code for a bearer token,\nthe same session a password sign-in gets (kind \"login\"), audited as an\nSSO login. A code is spendable once and for two minutes; after that, or\nfor one never issued, 401 — and the brute-force budget counts it.","operationId":"sso_exchange_api_auth_sso_exchange_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SsoExchangeBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Sso Exchange Api Auth Sso Exchange Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/demo-requests":{"post":{"summary":"Create Demo Request","description":"A demo, pilot or design-partner request from the public landing page.\nNo sign-in; under the route cap like every other public door. A filled\nhoneypot is answered exactly like a real request and stored nowhere.","operationId":"create_demo_request_api_public_demo_requests_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemoRequestBody"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Demo Request Api Public Demo Requests Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/agent-finder/turn":{"post":{"summary":"Agent Finder Turn","description":"One step of the conversation: a follow-up on the latest answer (the\ngoverned model's, else the rules') and the next question, with its\nchoices and three example answers. Stores nothing: the page sends the\nwhole conversation each time and keeps it in the visitor's tab.","operationId":"agent_finder_turn_api_public_agent_finder_turn_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinderBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Agent Finder Turn Api Public Agent Finder Turn Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/agent-finder/blueprint":{"post":{"summary":"Agent Finder Blueprint","description":"The blueprint for the answers so far: the governed model's pick and\nwording over the catalogue's facts, else the rules' blueprint. Stores\nnothing; a demo request sent with it is where it is kept.","operationId":"agent_finder_blueprint_api_public_agent_finder_blueprint_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinderBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Agent Finder Blueprint Api Public Agent Finder Blueprint Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/agent-finder/config":{"get":{"summary":"Agent Finder Config","description":"What the blueprint card offers: \"Email me this blueprint\" only where\nthis instance sends mail (a relay, and outbound mail on); otherwise the\npage offers Copy and Download as Markdown instead.","operationId":"agent_finder_config_api_public_agent_finder_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/public/blueprint-email":{"post":{"summary":"Blueprint Email","description":"Mail the agent finder's blueprint to the visitor, once. Stored with\nthe demo requests (source \"blueprint\", the operator view's), audited by\nits id, and sales is told — like a demo request. 503 where this\ninstance sends no mail (the page offers Copy and Download instead); 429\npast the per-address and per-day caps (agentfinder.EMAIL_PER_*). A filled\nhoneypot is answered like success and stored nowhere.","operationId":"blueprint_email_api_public_blueprint_email_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlueprintEmailBody"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Blueprint Email Api Public Blueprint Email Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/events":{"post":{"summary":"Public Funnel Event","description":"One step of a visit, from funnel.js's beacon (text/plain JSON, so it\nneeds no preflight): validated against the contract (funnel.clean_event,\n422 naming the field) and added to the day's counts. Stores no address,\nuser agent or text — the request's address only keys the limiter, in\nmemory. On an instance without the operator view nothing is stored.","operationId":"public_funnel_event_api_public_events_post","responses":{"204":{"description":"Successful Response"}}}},"/api/public/consent":{"post":{"summary":"Public Consent Receipt","description":"A visitor's cookie choice, from consent-manager.js (text/plain JSON,\nso it needs no preflight): {id, categories, policy, gpc}, validated\nagainst the contract (consentcat.clean_receipt, 422 naming the field)\nand kept as an anonymous receipt: the random id the browser made, the\ncategories, the policy version, the GPC flag and the server's time. No\naddress or user agent is stored; the request's address only keys the\nlimiter, in memory. Audited as consent.recorded with what was chosen,\nnever the receipt id. An instance with no optional vendor has nothing to\nconsent to, and keeps nothing.","operationId":"public_consent_receipt_api_public_consent_post","responses":{"204":{"description":"Successful Response"}}}},"/api/public/liya/ask":{"post":{"summary":"Site Chat Ask","description":"A visitor's question, answered from the public documentation only\n(liyachat): quoted from the best page with no model call, or — with\nsettings.site_assistant_model on — by the governed model citing the\npages, else by the docs search. mode \"resources\" is the search alone (popular pages when the\nquestion is empty). Stores nothing; never reads console or customer\ndata.","operationId":"site_chat_ask_api_public_liya_ask_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteChatBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Site Chat Ask Api Public Liya Ask Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/announcement":{"get":{"summary":"Public Announcement","description":"The announcement bar's one line (announce.js): {id, text, url} from\nsettings.public_announcement, else the newest public What's new item;\n204 when there is none. Internal-only What's new items never show.","operationId":"public_announcement_api_public_announcement_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/public/liya/config":{"get":{"summary":"Site Chat Config","description":"The public pages' optional options: the widget's WhatsApp chat links\n(liyachat.widget_config), [] while none are set, and booking_url, the\ninstant-booking page (settings.public_booking_url) that /demo, the home\npage's and Ask Liya's \"Book a demo\" open, \"\" while unset. Checked again\nhere, so a value set past the startup check is never served.","operationId":"site_chat_config_api_public_liya_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/public/try/worlds":{"get":{"summary":"Try Worlds","description":"The sample systems a visitor can try Liya in, in the page's order:\neach with its headline, first task, suggestions and the request its\npolicy refuses (no model call).","operationId":"try_worlds_api_public_try_worlds_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Try Worlds Api Public Try Worlds Get"}}}}}}},"/api/public/try/turn":{"post":{"summary":"Try Turn","description":"One visitor message to Liya in a sample system. Stores nothing: the\nvisitor's changes travel as `state` and stay in their tab. A request\nthe policy refuses (tryit.policy_check) is answered before any model\ncall, and lands in the visitor's trail.","operationId":"try_turn_api_public_try_turn_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TryTurnBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Try Turn Api Public Try Turn Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/try/decide":{"post":{"summary":"Try Decide","description":"The visitor approves or rejects what Liya proposed.","operationId":"try_decide_api_public_try_decide_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TryDecideBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Try Decide Api Public Try Decide Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/try/org":{"post":{"summary":"Try Org","description":"The sample system as the visitor's changes left it (no model call).","operationId":"try_org_api_public_try_org_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TryStateBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Try Org Api Public Try Org Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/privacy-requests":{"post":{"summary":"Create Privacy Request","description":"A privacy-rights request from the public site. Stored with a due date\na month out, then the requester is mailed a link to confirm the address\nis theirs — or, with no outbound mail, stored unverified for an\nadministrator to confirm another way. A filled honeypot is answered like\nsuccess and stored nowhere.","operationId":"create_privacy_request_api_public_privacy_requests_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrivacyRequestBody"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Privacy Request Api Public Privacy Requests Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/telemetry/register":{"post":{"summary":"Telemetry Register","description":"A customer instance's install key for an instance id and the secret\nthat signs its heartbeats (superadmin.register). 404 off the vendor's\ninstance.","operationId":"telemetry_register_api_public_telemetry_register_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Telemetry Register Api Public Telemetry Register Post"}}}}}}},"/api/public/telemetry/heartbeat":{"post":{"summary":"Telemetry Heartbeat","description":"One signed, metadata-only heartbeat (superadmin.ingest). 404 off the\nvendor's instance.","operationId":"telemetry_heartbeat_api_public_telemetry_heartbeat_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Telemetry Heartbeat Api Public Telemetry Heartbeat Post"}}}}}}},"/api/public/billing/stripe":{"post":{"summary":"Billing Stripe Webhook","description":"Stripe's webhook (billing.handle_event): signed, applied once. 404 off\nthe vendor's instance, or with no webhook secret configured.","operationId":"billing_stripe_webhook_api_public_billing_stripe_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Billing Stripe Webhook Api Public Billing Stripe Post"}}}}}}},"/api/livez":{"get":{"summary":"Livez","description":"Process liveness — 200 while the event loop is running, with one\nexception: a process that lost the instance lock to another\n(_instance_lost). A restart is exactly what it needs — the restarted\nprocess refuses to start while the other holds the lock — and liveness is\nthe probe an orchestrator restarts on (readiness only de-routes).","operationId":"livez_api_livez_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Livez Api Livez Get"}}}}}}},"/api/health":{"get":{"summary":"Health","description":"Readiness: returns 503 when a hard dependency is down so orchestrators\n(Docker healthcheck, k8s, load balancers) actually route around it.\n\nUnauthenticated callers get only {status, db_ok, vector_ok} — a scanner\nshouldn't learn our version, disk capacity, internal mail port or LLM\nbackend. The verbose payload (and raw error strings, which can carry paths)\nis served only to an authenticated admin; the container healthcheck needs\njust the status code, which is identical either way.","operationId":"health_api_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Api Health Get"}}}}}}},"/api/branding":{"get":{"summary":"Get Branding","operationId":"get_branding_api_branding_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Get Branding Api Branding Get"}}}}}},"patch":{"summary":"Patch Branding","operationId":"patch_branding_api_branding_patch","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Patch Branding Api Branding Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent/search_files":{"post":{"summary":"Agent Search Files","description":"Hybrid File Index search over every attachment + internal archive member.","operationId":"agent_search_files_api_agent_search_files_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentQuery"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Agent Search Files Api Agent Search Files Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent/search_tickets":{"post":{"summary":"Agent Search Tickets","description":"Semantic search over live tickets (vector) with a keyword fallback.","operationId":"agent_search_tickets_api_agent_search_tickets_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentQuery"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Agent Search Tickets Api Agent Search Tickets Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent/ticket/{ticket_id}":{"get":{"summary":"Agent Get Ticket","operationId":"agent_get_ticket_api_agent_ticket__ticket_id__get","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","title":"Ticket Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Get Ticket Api Agent Ticket  Ticket Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent/copilot/{ticket_id}":{"get":{"summary":"Agent Copilot","description":"Liya pack — for a rep's own agent (Claude Desktop, etc.).","operationId":"agent_copilot_api_agent_copilot__ticket_id__get","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","title":"Ticket Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Copilot Api Agent Copilot  Ticket Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/intake":{"post":{"summary":"Intake","description":"Create a ticket from an external system (Teams/Slack/monitoring/Power\nAutomate). Returns the routed ticket plus deflection answers so a chatbot\ncan show 'here's what usually fixes this' immediately.\n\nEvery one of those callers retries, so a retry is made safe twice over\n(see idempotency): an Idempotency-Key header replays the first response,\nand an external_id this caller already opened a ticket for updates that\nticket and answers `created: false` instead of triaging it again.","operationId":"intake_api_intake_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntakeBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Intake Api Intake Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/teams/outgoing":{"post":{"summary":"Teams Outgoing","description":"Native Teams inbound: a user @mentions the bot; Teams POSTs here (HMAC\nsigned). We answer from the KB (deflection) or file a ticket, and reply in\nthe thread. No Azure Bot Framework registration required.","operationId":"teams_outgoing_api_teams_outgoing_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/answer":{"post":{"summary":"Answer","description":"Ticket DEFLECTION: given a natural-language question, return the closest\nknown resolutions from the knowledge base WITHOUT creating a ticket. This is\nthe self-service / chatbot path — answer first, file a ticket only if needed.","operationId":"answer_api_answer_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnswerBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Answer Api Answer Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/answers/{answer_id}/feedback":{"post":{"summary":"Answer Feedback","description":"Rate one answer from /api/answer with the single-use token it came\nwith — the asker's browser holds that, never the API key.\n\nTenant-bound twice: the token is signed over the answer's tenant, and\nthe answer must be one this instance's self-service still answers for\n(the deflection binding), so a token outliving a rebinding votes for\nnobody. The comment is kept redacted (the input guardrails, as the\nknowledge-gap log keeps questions); one vote per answer and voter, and\nthe fixes it showed are voted on as that voter — once each.\n\nThe token is checked first and spent last, with the vote: every refusal\n(labels, binding, tenant) and the comment's redaction come before it, so\nnone of them burns a token the person could still use.","operationId":"answer_feedback_api_answers__answer_id__feedback_post","parameters":[{"name":"answer_id","in":"path","required":true,"schema":{"type":"string","title":"Answer Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnswerFeedbackBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Answer Feedback Api Answers  Answer Id  Feedback Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent/memory/{ticket_id}":{"get":{"summary":"Agent Memory","description":"Working context for a ticket — what the co-pilot last concluded plus any\nrecent notes — so an external agent resumes instead of starting cold.\n\nEach entry says where it came from (`source`), how far to believe it\n(`trust`: system, heuristic, llm-guarded, human; '' unknown) and which\nagent wrote it for whom (`origin`), so an agent can weigh a co-pilot's\nguess and an operator's correction differently.","operationId":"agent_memory_api_agent_memory__ticket_id__get","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","title":"Ticket Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Memory Api Agent Memory  Ticket Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/a2a/{key}/agent.json":{"get":{"summary":"A2A Agent Card","description":"Public A2A discovery. 404 — not 403 — for an unpublished agent, so the\nendpoint does not confirm which internal agents exist.\n\nSigned (_signed_card) and cacheable (_cached_json). An unsigned card is\nserved no-cache instead, so a client picks up the signed one as soon as\nthe keyring can sign again rather than five minutes later.","operationId":"a2a_agent_card_api_a2a__key__agent_json_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/a2a/{key}/.well-known/agent-card.json":{"get":{"summary":"A2A Agent Card","description":"Public A2A discovery. 404 — not 403 — for an unpublished agent, so the\nendpoint does not confirm which internal agents exist.\n\nSigned (_signed_card) and cacheable (_cached_json). An unsigned card is\nserved no-cache instead, so a client picks up the signed one as soon as\nthe keyring can sign again rather than five minutes later.","operationId":"a2a_agent_card_api_a2a__key___well_known_agent_card_json_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/a2a/{key}":{"post":{"summary":"A2A Rpc","description":"A2A JSON-RPC onto the agent's governed path: message/send, and\ntasks/get, tasks/list and tasks/cancel over the tasks it made\n(ticketiq/a2atasks.py); with streaming on (settings.a2a_streaming),\nmessage/stream and tasks/resubscribe as SSE (ticketiq/a2astream.py).\n\nThe caller is an inbound client holding the `agents.invoke` scope — the\ncard advertises exactly that scheme. Only published agents answer: an\nagent nobody chose to expose is not reachable by guessing its name.\nGovernance is the same as every other entry point (kill switch, Cedar,\nguardrails, budget, metering, transcript); a governance refusal comes\nback as a task in state `rejected`, not as a transport error, because the\nrequest was understood and declined.","operationId":"a2a_rpc_api_a2a__key__post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response A2A Rpc Api A2A  Key  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/teams/source/{sid}":{"get":{"summary":"Teams Source","description":"The full text of a source a Teams answer cited (teamssource): opened\nfrom the citation pop-up by people who have no console account. Signed\nand expiring; anything else is a plain 404, never a hint which part\nfailed. The link must have been signed for the tenant the source was\nkept for (teamssource.opened), so one tenant's link never opens\nanother's source. When the citation knew where the item lives, the\npage leads with a link to the original (ticketiq.origin).","operationId":"teams_source_api_teams_source__sid__get","parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"string","title":"Sid"}},{"name":"e","in":"query","required":false,"schema":{"type":"string","default":"","title":"E"}},{"name":"s","in":"query","required":false,"schema":{"type":"string","default":"","title":"S"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/teams/card-icon/{name}.png":{"get":{"summary":"Teams Card Icon","description":"The agent's 48 px icon for the Adaptive Cards a Teams bot trigger\nsends: Teams web and desktop draw no data: URI image, and fetch a card's\nimages without our session, so it is public — for an enabled bot trigger\nonly, and only its own agent's icon, which its Teams app package already\ncarries. A ?v= fingerprint in the card's URL lets it be cached a day.","operationId":"teams_card_icon_api_teams_card_icon__name__png_get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/teams/bots/{name}/messages":{"post":{"summary":"Teams Bot Messages","description":"Runs IN the bot trigger's tenant, as a hook does (see _trigger_hook).","operationId":"teams_bot_messages_api_teams_bots__name__messages_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/google-chat/events/{name}":{"post":{"summary":"Google Chat Events","description":"Runs IN the trigger's tenant, as a Teams bot's messages do.","operationId":"google_chat_events_api_google_chat_events__name__post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/webchat/{name}/{rest}":{"options":{"summary":"Webchat Preflight","description":"CORS preflight: answered for a listed origin only. Any other origin\ngets no Access-Control-Allow-Origin, and its browser sends nothing.","operationId":"webchat_preflight_api_webchat__name___rest__options","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"rest","in":"path","required":true,"schema":{"type":"string","title":"Rest"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/webchat/{name}/config":{"get":{"summary":"Webchat Config","description":"What the widget shows before anyone types: the agent's label and the\nAI disclosure (EU AI Act Art. 50(1) — said before the first question,\nnot after it). Only to a listed page; nothing about who may use it.","operationId":"webchat_config_api_webchat__name__config_get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/webchat/{name}/frame":{"get":{"summary":"Webchat Frame","description":"The chat as a page of its own, for an iframe: framable by the listed\norigins only (CSP frame-ancestors, which the browser enforces on the\nembedding page), so it cannot be framed by a page that would dress it up\nas something else. A token, when the embedding site uses them, arrives\nin the fragment (#token=…), which no server or proxy log ever sees.","operationId":"webchat_frame_api_webchat__name__frame_get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/webchat/{name}/messages":{"post":{"summary":"Webchat Messages","description":"One message from the widget; the agent's answer in the response.\n\nOrigin, then the person, then the governed path — in the trigger's tenant,\nas a hook runs (cron.run_tenant).","operationId":"webchat_messages_api_webchat__name__messages_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebchatMessageBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/webchat/{name}/feedback":{"post":{"summary":"Webchat Feedback","description":"A thumbs up or down on one answer — the Teams bot's feedback, with its\nlearning signal: the fixes an answer cited rise or sink, and the answer\nrecord carries the vote. Only on an answer sent to this same person.","operationId":"webchat_feedback_api_webchat__name__feedback_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebchatFeedbackBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/email/inbound/{name}":{"post":{"summary":"Email Inbound","description":"One raw RFC 5322 message from a mail relay (SES, a raw-MIME forward,\na Postfix pipe), signed with the door's signing secret\n(X-TicketIQ-Signature / X-TicketIQ-Timestamp, as a trigger's hmac mode).\nThe answer goes out by mail, in thread; the response says what was done.\nOne 404 for no door, a closed one and one with no signing secret, so a\ncaller cannot learn which triggers have a mailbox.","operationId":"email_inbound_api_email_inbound__name__post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hook/{token}":{"post":{"summary":"Trigger Hook","description":"The inbound endpoint. The URL token addresses the trigger without\nnaming the agent. For a token_url trigger it is the whole credential —\nsome senders cannot add a header of their own — and for an hmac or\nbearer one a header must prove the caller as well.\n\nRuns the agent through the same governed path as everything else, and\nrecords the exchange as a transcript so an inbound conversation is\nreviewable exactly like one from the console.","operationId":"trigger_hook_api_hook__token__post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Trigger Hook Api Hook  Token  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/slack/events/{name}":{"post":{"summary":"Slack Events","description":"A Slack app's Event Subscriptions Request URL. Always 200 once the\nrequest is Slack's (a retry of a delivery already taken, a bot's own\nmessage, a channel off the allowlist all included): anything else and\nSlack retries it, and after enough failures switches the app's events\noff. 401 for a bad signature, 404 for no such Slack app.","operationId":"slack_events_api_slack_events__name__post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/clients/register":{"post":{"summary":"Self Register Client","description":"Dynamic client registration, gated by the CIMD allowlist.\n\nUnauthenticated on purpose — that is the point of self-registration — so\nthe allowlist is the only thing standing between this and an open door.\nIt is therefore checked FIRST, before the document is even fetched: an\norigin nobody permitted should not be able to make this instance issue an\noutbound request at all. (Under the all_domains trust policy, which an\nadministrator had to acknowledge, every https host is permitted, and the\nfetch may reach public internet addresses only — agentgw.cimd_public_only\n— so no LAN or loopback host is reachable whatever the egress settings.)","operationId":"self_register_client_api_clients_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SelfRegisterBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Self Register Client Api Clients Register Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/clients/register/{client_id}":{"get":{"summary":"Read Registration","description":"RFC 7592 §2.1: the registration as it stands, to its access token.","operationId":"read_registration_api_clients_register__client_id__get","parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Update Registration","description":"RFC 7592 §2.2: replace the registration's metadata.\n\nNever past what the client holds now: scopes narrow to the stored ones\nand resources are left alone, so an operator's narrowing outlives the\nregistrant's update (as it outlives a CIMD re-registration). Enabled is\nnever read — an operator's switch-off stays off — and the auth method\ncannot change (agentgw.clean_dcr_metadata).","operationId":"update_registration_api_clients_register__client_id__put","parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Registration","description":"RFC 7592 §2.3: the registrant withdraws its client. Its grants go\nwith it, as an operator's delete ends them, and the access token with\nthe client (agentgw.delete_client).","operationId":"delete_registration_api_clients_register__client_id__delete","parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/clients/well-known":{"get":{"summary":"List Well Known Clients","description":"ADP's ListWellKnownClients: the static catalogue of tools people\nconnect — description, homepage and docs links, recommended scopes, the\nvendor's redirect URIs for a remote tool — each with its setup snippet,\nthe token left as a placeholder.\n\nPublic, as ADP's is (no method permission, no Cedar action): a partner\nwiring a tool up, or a setup script, reads it before anyone has an\naccount here. So it answers from the module's constants alone — no store\nread, no registered client, no token, nothing one tenant could learn\nabout another — and is rate limited like the other anonymous routes.\nCacheable for five minutes: it changes only with a release.\n\nDeclared on public_router, which is included ahead of api_router, so this\nliteral path answers before /clients/{client_id} would read \"well-known\"\nas a client id (agentgw.RESERVED_CLIENT_IDS keeps it from ever being one).\n\nThe snippets name TICKETIQ_PUBLIC_BASE_URL, or a placeholder when it is\nunset — never the request's own Host, which the caller writes (see\n_origin_base). An anonymous answer a proxy may cache is the last place to\necho it: one crafted request would put somebody else's server into every\nconfig pasted from it for five minutes. The console reads the catalogue\nfrom the signed-in GET /api/clients instead, with its own address filled\nin.","operationId":"list_well_known_clients_api_clients_well_known_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Well Known Clients Api Clients Well Known Get"}}}}}}},"/api/otel/v1/traces":{"post":{"summary":"Otlp Traces","description":"OTLP/HTTP trace export (protobuf or JSON, optionally gzip), authenticated\nwith the agent's own credential — the agent is whoever the credential\nsays, never what a resource attribute claims. Answers in the OTLP shape:\npartial success counts rejected spans, and the feedback log says why.","operationId":"otlp_traces_api_otel_v1_traces_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/gateway/oauth/token":{"post":{"summary":"Gateway Oauth Token","description":"OAuth 2.0 client-credentials grant for agent credentials (RFC 6749\n§4.4). Accepts client_secret_basic or client_secret_post. Every credential\nfailure is the same `invalid_client`, so the endpoint cannot be used to\nlearn which agents exist.\n\nA credential that checks out is then held to the issuance gates — the\nagent's kill switch and Cedar's obtain_token — and refused with 403 and\nthe reason. Only a caller holding a valid secret ever sees that answer,\nso it discloses nothing the secret did not already.\n\nTwo ways in need no shared secret (agentgw's \"signed assertions\"):\nprivate_key_jwt — client_credentials with client_assertion_type\njwt-bearer and a client_assertion signed by a key registered on the\nagent (RFC 7523 §2.2) — and workload-identity federation: grant_type\njwt-bearer with an `assertion`, or token-exchange with a\n`subject_token`, from a trusted issuer mapped to the agent (RFC 7523\n§2.1, RFC 8693). A bad assertion is invalid_client, a bad federated\ntoken invalid_grant — each the same whichever check failed, with the\nreason on the audit row only.","operationId":"gateway_oauth_token_api_gateway_oauth_token_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/gateway/v1/chat/completions":{"post":{"summary":"Gateway Chat Completions","description":"OpenAI-compatible completions, governed.\n\nDeliberately speaks the provider's own wire format rather than a bespoke\none: an existing agent is onboarded by changing two lines of config, not by\nbeing rewritten. Everything that makes it governed — provider resolution,\nguardrails in both directions, budget enforcement, metering — happens\nbehind this endpoint and cannot be bypassed by the caller.\n\nThe request as OpenAI's clients send it: system (or developer), user,\nassistant and tool messages, each in its own role; `tools` and\n`tool_choice`, answered with message.tool_calls for the caller to run;\nthe provider's own finish_reason; and `stream`, as server-sent events\n(_gateway_sse) — 400 on a model the catalogue says cannot stream.","operationId":"gateway_chat_completions_api_gateway_v1_chat_completions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GatewayChatBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Gateway Chat Completions Api Gateway V1 Chat Completions Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/gateway/anthropic/v1/messages":{"post":{"summary":"Gateway Anthropic Messages","description":"Anthropic's Messages API, governed: what Claude Code and the Anthropic\nSDKs speak, pointed here by ANTHROPIC_BASE_URL=<instance>/api/gateway/\nanthropic and authenticated with the agent's gateway token (Authorization:\nBearer, which ANTHROPIC_AUTH_TOKEN sends, or x-api-key). The request is\ntranslated (anthropic_gw.to_chat) into the chat-completions request\n/gateway/v1 governs — every control, the gateway.call row and the\nrefusals alike are _gateway_answer's — and the answer back into a\nMessage, or Anthropic's server-sent events when `stream` is set. A\nrefusal is answered in Anthropic's error shape with the gateway's status\nand reason, so the client shows why.","operationId":"gateway_anthropic_messages_api_gateway_anthropic_v1_messages_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Gateway Anthropic Messages Api Gateway Anthropic V1 Messages Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/gateway/anthropic/v1/messages/count_tokens":{"post":{"summary":"Gateway Anthropic Count Tokens","description":"Anthropic's count_tokens, ESTIMATED (anthropic_gw.estimate_tokens):\nthe call runs on whatever model the agent's binding names, whose\ntokenizer is not this one's to run. The agent's token is checked as a\ncompletion's is; nothing is sent to a provider and nothing is billed.","operationId":"gateway_anthropic_count_tokens_api_gateway_anthropic_v1_messages_count_tokens_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Gateway Anthropic Count Tokens Api Gateway Anthropic V1 Messages Count Tokens Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/gateway/v1/models":{"get":{"summary":"Gateway Models","description":"OpenAI's model list, for the agent whose token asks: what it is BOUND\nto — the one model /gateway/v1 runs it on — and, for each provider its\nprofile grants in gateway_providers, the models it may name at that\nprovider's own URL (its allowed_models, else its default). Never the\ncatalogue at large: an SDK or a framework that picks a model from this\nlist must only find ones the call would actually run on. Each carries,\nbeside OpenAI's fields, where to send it and the catalogue's card for\nit (modelcat.view) — null for a model the catalogue does not know.","operationId":"gateway_models_api_gateway_v1_models_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Gateway Models Api Gateway V1 Models Get"}}}}}}},"/api/gateway/v1/models/{model_id}":{"get":{"summary":"Gateway Model","description":"One of gateway_models' entries by id (OpenAI's models.retrieve); 404\nfor any other, whether or not some other agent may use it.","operationId":"gateway_model_api_gateway_v1_models__model_id__get","parameters":[{"name":"model_id","in":"path","required":true,"schema":{"type":"string","title":"Model Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Gateway Model Api Gateway V1 Models  Model Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/gateway/v1/guardrails/screen":{"post":{"summary":"Gateway Guardrail Screen","description":"The guardrails as a service for a self-managed agent: ApplyGuardrail's\nshape, answered by the CALLING agent's own rules (guardrails.screen).\n\nAuthenticated by the agent's gateway credential and nothing else — the\nagent is who its token says, and a body naming any other agent is a 403,\nso no agent can screen against, or learn, another's binding. A contained\nagent is turned away as its completions are (_gateway_agent); the route\nis rate-limited per credential like every expensive one. A request that\ncannot be asked as put is a 400; a screen that broke is answered, never\nraised: that segment blocked, with `errors` naming the failure.\n\nEvery call writes one guardrail.screen row — agent, directions, the\ndecision, the rules applied and the latency, never the text: the row is\nhow an operator sees a self-managed agent's traffic at all, since none\nof it passes through the governed path. The rules' own block, mask and\nmonitor rows are written by apply() as for live traffic.","operationId":"gateway_guardrail_screen_api_gateway_v1_guardrails_screen_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Gateway Guardrail Screen Api Gateway V1 Guardrails Screen Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/gateway/v1/decide":{"post":{"summary":"Gateway Decide","description":"The policy decision point for a framework's own tools, retrieval,\nmemory writes and handoffs (decide.py): {decision: allow | deny |\npending_approval, redacted?, deciding_policy, reason, approval_id?,\ntrace_id}. Authenticated and contained as every gateway route is\n(_gateway_agent: 401 without the agent's token, 403 while its kill\nswitch holds it). A refusal is an answer, not an error — 200 with\ndecision deny — so a framework's hook reads one shape whatever it is\ntold; only a question that cannot be judged is a 4xx.\n\nEvery decision is audited as gateway.decide under the call's trace, the\ndeciding policy named, so a framework-local call is in the same record\nas one TicketIQ made — allowed, redacted, held or refused.","operationId":"gateway_decide_api_gateway_v1_decide_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GatewayDecideBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Gateway Decide Api Gateway V1 Decide Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/gateway/providers/{name}/v1/chat/completions":{"post":{"summary":"Gateway Provider Chat Completions","description":"OpenAI-compatible completions on ONE provider (ADP's per-provider\nproxy URL, LLMProviderService.url — every provider read carries it): a\nclient points its SDK's base_url at /api/gateway/providers/<name>/v1 and\nreaches that provider, governed exactly as /gateway/v1 is — the same\nagent token and kill switch, then Cedar's call_model on this Provider,\nguardrails both ways, the budget and metering (agent_completion, with\nthe target agentconf.resolve_for_provider resolved).\n\nThe provider is the agent's to call only when it is bound to it or its\nprofile lists it in gateway_providers (agentconf.gateway_reachable) —\n403 otherwise, asked before anything about the provider is looked up,\nso an agent token cannot map which names exist. Then 404 for no such\nprovider, 409 while it is switched off.\n\nThe model a caller names in `model` is honoured in two places only,\nand held to the provider's allowed_models there (422 when they do not\nlist it):\n* a passthrough provider, where the call runs on the caller's own\n  account, so which model it pays for is its own business — with no\n  allow-list, any model;\n* a provider the agent reaches only through gateway_providers, where\n  no binding chose a model and the operator's allow-list is the whole\n  of the decision — with no allow-list, ignored.\nOn the provider the agent is BOUND to, and not passthrough, it is\nignored as /gateway/v1 ignores it: the binding's model is exactly what\nthe profile is there to decide, and a second address to the same\nprovider must not be the way to run a bigger model on the operator's\nkey and invoice. Unnamed or ignored, the model is the binding's own\nwhen bound here, else the provider's default_model.\n\nauthorization_passthrough (the provider's own switch, off by default):\nthe call carries the caller's credential from X-Upstream-Authorization\n(\"Bearer <token>\", or the token alone — for Anthropic, an OAuth token\nand an API key respectively) instead of any key of the provider's; 401\nwithout one. On an OpenAI-kind provider a ChatGPT-subscription token\nneeds its account beside it: X-Upstream-ChatGPT-Account-Id (or ADP's\nChatGPT-Account-Id) is sent on as ChatGPT-Account-Id. Both are held for\nthis one call only (harness.llm.upstream_credential) and never stored,\nlogged, audited, transcripted or captured on the wire; the call's audit\nrow says passthrough=true and nothing more. Either header sent to a\nprovider that does not forward it is refused (400) rather than silently\nnot used.\n\nEverything is decided on one read of the provider and the profiles:\nwhether the call is passthrough and the target it runs on come from the\nsame snapshot, so an admin switching passthrough off between two reads\ncannot leave a caller's credential bound to a call that then runs on\nthe provider's stored key under a row that says passthrough=true.","operationId":"gateway_provider_chat_completions_api_gateway_providers__name__v1_chat_completions_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GatewayChatBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Gateway Provider Chat Completions Api Gateway Providers  Name  V1 Chat Completions Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/.well-known/jwks.json":{"get":{"summary":"Published Jwks","description":"The platform's public signing keys (RFC 7517): the active key and every\nkey a rotation replaced that is still inside its overlap. Public by\ndesign — a verifier needs no account here to check a signature.\n\nAlso served at the origin root (signing.JWKS_PATH), which is where a jku,\nan authorization server's jwks_uri and a client registration point; this\ncopy under /api is for a proxy that forwards nothing else. Five minutes\nof caching is safe because a rotation's overlap is days: a verifier\nholding a stale copy meets an unknown kid only after a rotation, and\nrefetches on an unknown kid as every JWKS client does.","operationId":"published_jwks_api__well_known_jwks_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/connections/providers/well-known":{"get":{"summary":"List Well Known Providers","description":"ADP's ListWellKnownProviders: the static catalogue of OAuth providers\npeople connect most (oauth_catalog) — endpoints, recommended scopes, how\nthe secret is sent, PKCE support, the extra parameters a refresh token\ndepends on, a category and the vendor's docs — for the Add provider\npicker. Narrowed by name_contains (id or display name, case-insensitive)\nand category, repeatable or comma-separated, any-of; `categories` is the\nchip row with each chip's count under name_contains alone. An unknown or\nmalformed category, or a filter past its bounds, is a 400.\n\nPublic, as ADP's is (no method permission, no Cedar action): answered\nfrom the module's constants alone — no store read, no registered\nprovider, no client ID, nothing one tenant could learn about another —\nand rate limited like the other anonymous routes. Cacheable for five\nminutes: it changes only with a release.\n\nDeclared on public_router, which is included ahead of api_router, so this\nliteral path answers before /connections/providers/{name} would read\n\"well-known\" as a provider name (oauth.RESERVED_PROVIDER_NAMES keeps it\nfrom ever being one).","operationId":"list_well_known_providers_api_connections_providers_well_known_get","parameters":[{"name":"name_contains","in":"query","required":false,"schema":{"type":"string","default":"","title":"Name Contains"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Category"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Well Known Providers Api Connections Providers Well Known Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/service-accounts/token":{"post":{"summary":"Service Account Token","description":"OAuth 2.0 client credentials (RFC 6749 §4.4) for a service account:\nform-encoded as the RFC has it, or JSON, which is easier from a shell.\nAnswers a one-hour bearer for the console plane — the bound account's\npermissions, nothing more — or invalid_client for every failure alike.\nThrottled per address as a password sign-in is.","operationId":"service_account_token_api_service_accounts_token_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/.well-known/liyagent-audit-key.json":{"get":{"summary":"Published Audit Keys","description":"The public halves of every key this instance has signed audit\nevidence bundles with, each with its validity window — what an auditor\npins, or checks a bundle's attestation against, with no account here.\nPublic by design, as the JWKS is: a public key is no secret, and a\nverifier who must sign in to learn it cannot check a bundle on their\nown. Also served at the origin root (RFC 8615). Never makes a key: an\ninstance that has exported no bundle lists none.","operationId":"published_audit_keys_api__well_known_liyagent_audit_key_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/logout":{"post":{"summary":"Logout","operationId":"logout_api_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/demo-requests":{"get":{"summary":"List Demo Requests","description":"The landing page's demo and pilot requests, newest first.","operationId":"list_demo_requests_api_demo_requests_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Demo Requests Api Demo Requests Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/funnel":{"get":{"summary":"Admin Funnel","description":"The public site's funnel (funnel.report) over [from, to] (ISO dates;\nthe last 30 days by default): each step's unique sessions, events and\nconversion from landed, overall and per campaign and per page-test arm.\nDaily counts only — there is no visit, address or text to read.","operationId":"admin_funnel_api_admin_funnel_get","parameters":[{"name":"from","in":"query","required":false,"schema":{"type":"string","maxLength":10,"default":"","title":"From"}},{"name":"to","in":"query","required":false,"schema":{"type":"string","maxLength":10,"default":"","title":"To"}},{"name":"campaign","in":"query","required":false,"schema":{"type":"string","maxLength":40,"default":"","title":"Campaign"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Funnel Api Admin Funnel Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/privacy/requests":{"get":{"summary":"List Privacy Requests","description":"The privacy-request queue, newest first: ``status`` open (the default:\nnot yet closed), all, or one status. With the counts the queue heads\nwith — open, and overdue (past the one-month due date).","operationId":"list_privacy_requests_api_privacy_requests_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"open","title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Privacy Requests Api Privacy Requests Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/privacy/requests/{ref}":{"get":{"summary":"Get Privacy Request","operationId":"get_privacy_request_api_privacy_requests__ref__get","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Privacy Request Api Privacy Requests  Ref  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/privacy/requests/{ref}/verify":{"post":{"summary":"Verify Privacy Request","description":"Mark a request's address confirmed by other means (the requester\nanswered from it, say, when no link could be mailed) — with a note of\nhow, which is required: \"verified\" is a claim the record must back.","operationId":"verify_privacy_request_api_privacy_requests__ref__verify_post","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/PrivacyRequestNoteBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Verify Privacy Request Api Privacy Requests  Ref  Verify Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/privacy/requests/{ref}/resend":{"post":{"summary":"Resend Privacy Verification","description":"Mail the confirmation link again (a new one, valid for seven days).","operationId":"resend_privacy_verification_api_privacy_requests__ref__resend_post","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Resend Privacy Verification Api Privacy Requests  Ref  Resend Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/privacy/requests/{ref}/run":{"post":{"summary":"Run Privacy Request","description":"Run the data-subject tools for a confirmed request, against the\nrequester's address: ``search`` (where they are), ``export`` (the access\ncopy, as a download) or ``erase`` (an erasure request only; four-eyes\nand legal holds apply exactly as on POST /api/privacy/erase). Each run\nis written on the request and audited against its reference, beside the\ntool's own audit row.","operationId":"run_privacy_request_api_privacy_requests__ref__run_post","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrivacyRequestRunBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Run Privacy Request Api Privacy Requests  Ref  Run Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/privacy/requests/{ref}/close":{"post":{"summary":"Close Privacy Request","description":"Close a request with its outcome and the answer given — mailed to\nthe requester with ``notify`` (only to a confirmed address, and only\nwhen mail is configured: refused before closing otherwise).","operationId":"close_privacy_request_api_privacy_requests__ref__close_post","parameters":[{"name":"ref","in":"path","required":true,"schema":{"type":"string","title":"Ref"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrivacyRequestCloseBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Close Privacy Request Api Privacy Requests  Ref  Close Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/superadmin/overview":{"get":{"summary":"Superadmin Overview","description":"The fleet at a glance: organisations by health band, active, alerts,\ntotals, version spread, the 30 day series and renewals coming up.","operationId":"superadmin_overview_api_superadmin_overview_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Superadmin Overview Api Superadmin Overview Get"}}}}}}},"/api/superadmin/orgs":{"get":{"summary":"Superadmin Orgs","description":"Every organisation, filtered, sorted and paged in SQL.","operationId":"superadmin_orgs_api_superadmin_orgs_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":80,"default":"","title":"Q"}},{"name":"band","in":"query","required":false,"schema":{"type":"string","maxLength":20,"default":"","title":"Band"}},{"name":"plan","in":"query","required":false,"schema":{"type":"string","maxLength":20,"default":"","title":"Plan"}},{"name":"deployment","in":"query","required":false,"schema":{"type":"string","maxLength":20,"default":"","title":"Deployment"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","maxLength":20,"default":"","title":"Status"}},{"name":"version","in":"query","required":false,"schema":{"type":"string","maxLength":40,"default":"","title":"Version"}},{"name":"billing","in":"query","required":false,"schema":{"type":"string","maxLength":20,"default":"","title":"Billing"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","maxLength":20,"default":"health","title":"Sort"}},{"name":"dir","in":"query","required":false,"schema":{"type":"string","maxLength":4,"default":"asc","title":"Dir"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":1000000,"minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Superadmin Orgs Api Superadmin Orgs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Superadmin Create Org","operationId":"superadmin_create_org_api_superadmin_orgs_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuperAdminOrgBody"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Superadmin Create Org Api Superadmin Orgs Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/superadmin/orgs/{org_id}":{"get":{"summary":"Superadmin Org","operationId":"superadmin_org_api_superadmin_orgs__org_id__get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Superadmin Org Api Superadmin Orgs  Org Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Superadmin Update Org","operationId":"superadmin_update_org_api_superadmin_orgs__org_id__patch","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuperAdminOrgBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Superadmin Update Org Api Superadmin Orgs  Org Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/superadmin/orgs/{org_id}/notes":{"post":{"summary":"Superadmin Add Note","operationId":"superadmin_add_note_api_superadmin_orgs__org_id__notes_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuperAdminNoteBody"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Superadmin Add Note Api Superadmin Orgs  Org Id  Notes Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/superadmin/orgs/{org_id}/contacts":{"post":{"summary":"Superadmin Add Contact","operationId":"superadmin_add_contact_api_superadmin_orgs__org_id__contacts_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuperAdminContactBody"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Superadmin Add Contact Api Superadmin Orgs  Org Id  Contacts Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/superadmin/orgs/{org_id}/contacts/{contact_id}":{"delete":{"summary":"Superadmin Delete Contact","operationId":"superadmin_delete_contact_api_superadmin_orgs__org_id__contacts__contact_id__delete","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"contact_id","in":"path","required":true,"schema":{"type":"integer","title":"Contact Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/superadmin/orgs/{org_id}/install-keys":{"post":{"summary":"Superadmin Issue Key","description":"A new install key, shown in this answer and never again.","operationId":"superadmin_issue_key_api_superadmin_orgs__org_id__install_keys_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuperAdminKeyBody"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Superadmin Issue Key Api Superadmin Orgs  Org Id  Install Keys Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/superadmin/install-keys/{key_id}":{"delete":{"summary":"Superadmin Revoke Key","operationId":"superadmin_revoke_key_api_superadmin_install_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Superadmin Revoke Key Api Superadmin Install Keys  Key Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/superadmin/instances/{instance_id}":{"delete":{"summary":"Superadmin Retire Instance","operationId":"superadmin_retire_instance_api_superadmin_instances__instance_id__delete","parameters":[{"name":"instance_id","in":"path","required":true,"schema":{"type":"string","title":"Instance Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Superadmin Retire Instance Api Superadmin Instances  Instance Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/superadmin/alerts/{alert_id}/ack":{"post":{"summary":"Superadmin Ack Alert","operationId":"superadmin_ack_alert_api_superadmin_alerts__alert_id__ack_post","parameters":[{"name":"alert_id","in":"path","required":true,"schema":{"type":"integer","title":"Alert Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Superadmin Ack Alert Api Superadmin Alerts  Alert Id  Ack Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/superadmin/orgs/{org_id}/billing":{"post":{"summary":"Superadmin Billing Link","description":"Link an organisation to its billing customer (or create one in\nStripe), then read its subscription.","operationId":"superadmin_billing_link_api_superadmin_orgs__org_id__billing_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuperAdminBillingLinkBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Superadmin Billing Link Api Superadmin Orgs  Org Id  Billing Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Superadmin Billing Unlink","operationId":"superadmin_billing_unlink_api_superadmin_orgs__org_id__billing_delete","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Superadmin Billing Unlink Api Superadmin Orgs  Org Id  Billing Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/superadmin/orgs/{org_id}/billing/sync":{"post":{"summary":"Superadmin Billing Sync","operationId":"superadmin_billing_sync_api_superadmin_orgs__org_id__billing_sync_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Superadmin Billing Sync Api Superadmin Orgs  Org Id  Billing Sync Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/superadmin/orgs/{org_id}/crm":{"post":{"summary":"Superadmin Crm Link","description":"Link an organisation to its CRM company (or create one in HubSpot),\nthen sync it both ways.","operationId":"superadmin_crm_link_api_superadmin_orgs__org_id__crm_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuperAdminCrmLinkBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Superadmin Crm Link Api Superadmin Orgs  Org Id  Crm Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Superadmin Crm Unlink","operationId":"superadmin_crm_unlink_api_superadmin_orgs__org_id__crm_delete","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Superadmin Crm Unlink Api Superadmin Orgs  Org Id  Crm Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/superadmin/orgs/{org_id}/crm/sync":{"post":{"summary":"Superadmin Crm Sync","operationId":"superadmin_crm_sync_api_superadmin_orgs__org_id__crm_sync_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Superadmin Crm Sync Api Superadmin Orgs  Org Id  Crm Sync Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/superadmin/sync":{"post":{"summary":"Superadmin Sync All","description":"Run the billing reconcile and the CRM sync now, rather than at the\ntop of the hour.","operationId":"superadmin_sync_all_api_superadmin_sync_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Superadmin Sync All Api Superadmin Sync Post"}}}}}}},"/api/instance/telemetry":{"get":{"summary":"Telemetry Status","description":"This instance's side (heartbeat.py), for Settings > Telemetry: on or\noff, where it goes, how the last send went, the exact body of the next\nheartbeat, and how Liyagent sees this instance (from its last answer).\n\nOn the vendor's instance, an admin working in a hosted tenant also gets\nhow Liyagent sees that tenant (superadmin.hosted_view): a customer we\nhost sees its own standing, as a self-hosted one does in its own\nconsole, and never another tenant's.","operationId":"telemetry_status_api_instance_telemetry_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Telemetry Status Api Instance Telemetry Get"}}}}}}},"/api/stats/public":{"get":{"summary":"Stats Public","description":"Aggregate-only counters (no ticket content).\n\nMoved off the public router when the landing hero was removed: its only\ncaller was an unauthenticated page, and until then anyone who could load the\nlogin URL could read this instance's live ticket and vector volumes. They\nare aggregates, but they are still a customer's operational numbers, and\nnothing needs them before sign-in any more.","operationId":"stats_public_api_stats_public_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Stats Public Api Stats Public Get"}}}}}}},"/api/me":{"get":{"summary":"Whoami","description":"Who is signed in, and what may they do.\n\nThe console showed a hardcoded \"admin\" in the sidebar for every user, which\nis worse than showing nothing: on a shared screen it tells an operator they\nare someone else. Permissions ride along so a page can hide a control the\ncaller cannot use, rather than rendering a button that 403s.","operationId":"whoami_api_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Whoami Api Me Get"}}}}}}},"/api/me/requests":{"get":{"summary":"My Requests","description":"What the caller asked for, newest first: the tickets they raised or\nthat were opened for them (selfservice.my_tickets, inside the tenants\nthey may see), and agents' writes held for approval on their behalf\n(approvalcards.own_request). For the mobile app's Requests tab, and so\nfor anyone signed in: following one's own requests needs no permission,\nand nothing here is anyone else's.","operationId":"my_requests_api_me_requests_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response My Requests Api Me Requests Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/landing":{"get":{"summary":"My Landing","description":"Where the caller lands after signing in, and whether the admin\nconsole is theirs: \"/\" for anyone holding a console permission,\n\"/workspace\" for an employee who only talks to agents. Open to everyone\nsigned in, like /me: it describes the caller and no one else.","operationId":"my_landing_api_me_landing_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response My Landing Api Me Landing Get"}}}}}}},"/api/workspace":{"get":{"summary":"Workspace","description":"What the console's shell draws for the caller: the tenant they are\nworking in and the solutions it has (solutions.effective), each with its\napp's tabs. The platform is always there, so it is a flag rather than a\nlist.\n\nEvery signed-in person reads it, on every page, so it is one KV read or\ntwo and nothing else. private, no-cache with an ETag: it changes with\nthe tenant selected, so no shared cache may keep it, and an unchanged\nanswer revalidates as a 304.","operationId":"workspace_api_workspace_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/tenants/deflection":{"put":{"summary":"Put Deflection Tenant","description":"Bind the unauthenticated deflection surfaces (Teams, /api/answer) to one\ntenant. Required on a multi-tenant instance; those surfaces refuse to\nanswer until it is set.","operationId":"put_deflection_tenant_api_tenants_deflection_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeflectionTenantBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Put Deflection Tenant Api Tenants Deflection Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/identity-map":{"get":{"summary":"Identity Map List","description":"The mapping rows, the crawl status of each source that has a\ndirectory, and the namespaces a row may name.","operationId":"identity_map_list_api_identity_map_get","parameters":[{"name":"principal_kind","in":"query","required":false,"schema":{"type":"string","default":"","title":"Principal Kind"}},{"name":"principal","in":"query","required":false,"schema":{"type":"string","default":"","title":"Principal"}},{"name":"namespace","in":"query","required":false,"schema":{"type":"string","default":"","title":"Namespace"}},{"name":"origin","in":"query","required":false,"schema":{"type":"string","default":"","title":"Origin"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Identity Map List Api Identity Map Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Identity Map Add","description":"Map a TicketIQ user or group to a source identity by hand.","operationId":"identity_map_add_api_identity_map_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IdentityMapBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Identity Map Add Api Identity Map Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/identity-map/{row_id}":{"delete":{"summary":"Identity Map Delete","description":"Remove a manual mapping. A crawled row is refused: the next refresh\nwould write it straight back, so deleting it here would only look like\nrevoking access. Revoke it in the source system, or refresh.","operationId":"identity_map_delete_api_identity_map__row_id__delete","parameters":[{"name":"row_id","in":"path","required":true,"schema":{"type":"integer","title":"Row Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Identity Map Delete Api Identity Map  Row Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/identity-map/refresh":{"post":{"summary":"Identity Map Refresh","description":"Crawl now, in the background job engine (a directory of tens of\nthousands of users is minutes of paging, not one request).","operationId":"identity_map_refresh_api_identity_map_refresh_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IdentityRefreshBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Identity Map Refresh Api Identity Map Refresh Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/identity-map/resolve":{"get":{"summary":"Identity Map Resolve","description":"Every source identity a TicketIQ user holds, as a captured ACL names\nthem — the answer to \"why can(not) this person read that article\".","operationId":"identity_map_resolve_api_identity_map_resolve_get","parameters":[{"name":"principal","in":"query","required":false,"schema":{"type":"string","default":"","title":"Principal"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Identity Map Resolve Api Identity Map Resolve Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tenants":{"get":{"summary":"Tenants List","description":"The tenants the caller may work in. ?view=switcher is the switcher's\ntrimmed projection — id, name, env_kind, region, residency, plan,\nsolutions, enabled — and nothing else of the rows: no sources,\nretention or channel switches (tenants.switcher_rows).","operationId":"tenants_list_api_tenants_get","parameters":[{"name":"view","in":"query","required":false,"schema":{"type":"string","default":"","title":"View"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Tenants List Api Tenants Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tenants/select/{tenant_id}":{"post":{"summary":"Tenant Select","operationId":"tenant_select_api_tenants_select__tenant_id__post","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Tenant Select Api Tenants Select  Tenant Id  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tenants/{tenant_id}":{"put":{"summary":"Put Tenant","operationId":"put_tenant_api_tenants__tenant_id__put","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Tenant Api Tenants  Tenant Id  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Tenant Endpoint","operationId":"delete_tenant_endpoint_api_tenants__tenant_id__delete","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ReasonBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Tenant Endpoint Api Tenants  Tenant Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/residency":{"get":{"summary":"Residency Tile","description":"The residency tile: per residency-bound tenant the caller may see,\nits last 30 days of model calls split by where they were processed\n(residency.tile) — computed from the spend ledger, not asserted.","operationId":"residency_tile_api_residency_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Residency Tile Api Residency Get"}}}}}}},"/api/tenants/{tenant_id}/solutions":{"get":{"summary":"Tenant Solutions","operationId":"tenant_solutions_api_tenants__tenant_id__solutions_get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Tenant Solutions Api Tenants  Tenant Id  Solutions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Put Tenant Solutions","operationId":"put_tenant_solutions_api_tenants__tenant_id__solutions_put","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}},{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Dry Run"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SolutionsBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Tenant Solutions Api Tenants  Tenant Id  Solutions Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instance/solutions":{"get":{"summary":"Instance Solutions","operationId":"instance_solutions_api_instance_solutions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Instance Solutions Api Instance Solutions Get"}}}}}},"put":{"summary":"Put Instance Solutions","operationId":"put_instance_solutions_api_instance_solutions_put","parameters":[{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Dry Run"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SolutionsBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Instance Solutions Api Instance Solutions Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tenants/solutions/infer":{"get":{"summary":"Tenant Solutions Infer","description":"What each tenant's use suggests its row should be (solutions.infer):\na dry run — nothing is written. `liya tenant solutions infer --apply`\nwrites each proposal through PUT …/solutions, audited, with the reason\n\"migration infer\".","operationId":"tenant_solutions_infer_api_tenants_solutions_infer_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Tenant Solutions Infer Api Tenants Solutions Infer Get"}}}}}}},"/api/tenants/{tenant_id}/profile":{"get":{"summary":"Tenant Profile","operationId":"tenant_profile_api_tenants__tenant_id__profile_get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Tenant Profile Api Tenants  Tenant Id  Profile Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Put Tenant Profile","description":"The tenant's environment kind (prod, test, dev, demo), release ring\n(internal, demo, early, ga) and label. Kept off the tenant row, which a\ntenant admin saves with access.write: relabelled DEV, a PROD tenant\nwould skip what PROD asks for. solutions.manage only; audited as\ntenant.profile.update with before and after.","operationId":"put_tenant_profile_api_tenants__tenant_id__profile_put","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantProfileBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Tenant Profile Api Tenants  Tenant Id  Profile Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tenants/{tenant_id}/solutions/request":{"post":{"summary":"Request Tenant Solution","description":"A tenant admin asks the instance's owners for a solution their tenant\ndoes not have. Kept for the owners (GET /api/tenants/solutions/requests)\nand audited as tenant.solutions.request; nothing leaves the instance and\nnothing is turned on.","operationId":"request_tenant_solution_api_tenants__tenant_id__solutions_request_post","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SolutionRequestBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Request Tenant Solution Api Tenants  Tenant Id  Solutions Request Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tenants/solutions/requests":{"get":{"summary":"Tenant Solution Requests","description":"The tenant admins' requests for solutions, newest first: the owners'\nto answer (solutions.manage).","operationId":"tenant_solution_requests_api_tenants_solutions_requests_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Tenant Solution Requests Api Tenants Solutions Requests Get"}}}}}}},"/api/tenants/{tenant_id}/adopt-legacy":{"post":{"summary":"Adopt Legacy Endpoint","description":"Adopt this instance's legacy (unstamped) history into `tenant_id`,\nits home (legacyadopt): the records restamped, the door triggers and the\ndeflection door bound, the accounts granted, so the people who used the\ninstance before it had tenants keep reading — and only — their own\nhistory. dry_run (the default) counts every step and writes nothing.\nApplying needs access.write AND admin.write over every tenant (`*`), a\nreason and the id confirmed; it is idempotent, refused into a second\ntenant once done, and audited as tenant.legacy.adopt with the counts.","operationId":"adopt_legacy_endpoint_api_tenants__tenant_id__adopt_legacy_post","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdoptLegacyBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Adopt Legacy Endpoint Api Tenants  Tenant Id  Adopt Legacy Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tenants/legacy/adoption":{"get":{"summary":"Legacy Adoption","description":"The legacy adoption's record (tenants.KV_LEGACY), or {adopted: false}.","operationId":"legacy_adoption_api_tenants_legacy_adoption_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Legacy Adoption Api Tenants Legacy Adoption Get"}}}}}}},"/api/tenants/{tenant_id}/retire":{"post":{"summary":"Retire Tenant Endpoint","description":"Offboard a tenant by crypto-shred (tenants.retire_tenant): an erasure\nreceipt first, then its data keys destroyed, its blobs removed and the\ntenant deleted. Needs access.write AND admin.write, ``*`` over tenants,\na reason and the id confirmed; refused (409) under a legal hold covering\nthe tenant, and for a residency-bound tenant without governance.weaken.\nThe receipt's digest goes on the audit row, anchoring it in the chain.","operationId":"retire_tenant_endpoint_api_tenants__tenant_id__retire_post","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RetireTenantBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Retire Tenant Endpoint Api Tenants  Tenant Id  Retire Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tenants/retirements":{"get":{"summary":"Tenant Retirements","description":"Every retirement's erasure receipt, oldest first: the proof, per\ncustomer offboarded, of what was destroyed, when, by whom and why.","operationId":"tenant_retirements_api_tenants_retirements_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Tenant Retirements Api Tenants Retirements Get"}}}}}}},"/api/tenants/grants/{username}":{"get":{"summary":"Get Tenant Grants","description":"The tenant ids a person is granted, as the PUT below last saved them\n(``*`` for every tenant). Gated as the PUT is: the grants editor reads\nthem to show what a save would replace.","operationId":"get_tenant_grants_api_tenants_grants__username__get","parameters":[{"name":"username","in":"path","required":true,"schema":{"type":"string","title":"Username"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Tenant Grants Api Tenants Grants  Username  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Put Tenant Grants","operationId":"put_tenant_grants_api_tenants_grants__username__put","parameters":[{"name":"username","in":"path","required":true,"schema":{"type":"string","title":"Username"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantGrantBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Tenant Grants Api Tenants Grants  Username  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/channels":{"get":{"summary":"Get Channels","description":"Every channel agents answer through, and where each is switched off:\non the deployment (`locked`, from TICKETIQ_CHANNELS_DISABLED), on the\ninstance, and for each tenant the caller holds — another customer's\nswitches are that customer's business.","operationId":"get_channels_api_channels_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Channels Api Channels Get"}}}}}},"put":{"summary":"Put Channels","description":"Switch channels off (or back on) for the instance, or with `tenant`\nfor that tenant alone. Takes effect on the next call through the channel\n— the gate (llm._door_refusal) reads the switches on every call.\n\nSwitching one off is building a control: governance.write. Switching one\nback on is switching a control off, so it takes governance.weaken and a\nreason too, as every other weakening does. A channel the deployment\nswitched off cannot be switched on here at all (409): the floor is the\noperator's, set where they deploy.","operationId":"put_channels_api_channels_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelsBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Put Channels Api Channels Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tenants/bindings":{"get":{"summary":"Tenant Bindings","description":"What is bound to which tenant — only the caller's visible tenants'\nbindings, since the list would otherwise name every customer's agents.","operationId":"tenant_bindings_api_tenants_bindings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Tenant Bindings Api Tenants Bindings Get"}}}}}}},"/api/tenants/bindings/{kind}/{name}":{"put":{"summary":"Put Tenant Binding","description":"Bind an agent, trigger, MCP server or LLM provider to one tenant, or\nshare it again with an empty tenant.\n\nA bound agent is readable and runnable only from its tenant, and its\nusage is that tenant's; a bound server or provider may be used only by\nwork running in its tenant (policy.tenant_refusal, ahead of Cedar). A\ntrigger and the agent it feeds must not be bound to different tenants:\nwhichever tenant the run then worked in, it would reach into the other.","operationId":"put_tenant_binding_api_tenants_bindings__kind___name__put","parameters":[{"name":"kind","in":"path","required":true,"schema":{"type":"string","title":"Kind"}},{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantBindingBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Tenant Binding Api Tenants Bindings  Kind   Name  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/instance":{"get":{"summary":"Instance Profile","description":"What this deployment actually is.\n\nLiyagent ships in materially different shapes — Postgres and embedded\nQdrant on one VM, managed Postgres and a Qdrant cluster on Kubernetes, a local GPU or a cloud\ntenancy for inference — and an operator looking at a browser tab has no way\nto tell which one they are on. Every field here is derived from live\nconfiguration rather than a stored label, so it cannot drift from reality.","operationId":"instance_profile_api_instance_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Instance Profile Api Instance Get"}}}}}}},"/api/stats":{"get":{"summary":"Stats","operationId":"stats_api_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Stats Api Stats Get"}}}}}}},"/api/tickets":{"post":{"summary":"Create Ticket","description":"Open a ticket from the console or an API client. An Idempotency-Key\nheader makes a retry return the first ticket instead of opening a\nsecond (see idempotency).","operationId":"create_ticket_api_tickets_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Ticket Api Tickets Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"List Tickets","operationId":"list_tickets_api_tickets_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"team","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"sensitivity","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sensitivity"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Tickets Api Tickets Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tickets/{ticket_id}":{"get":{"summary":"Get Ticket","operationId":"get_ticket_api_tickets__ticket_id__get","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","title":"Ticket Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Ticket Api Tickets  Ticket Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Patch Ticket","operationId":"patch_ticket_api_tickets__ticket_id__patch","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","title":"Ticket Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Patch Ticket Api Tickets  Ticket Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Ticket Cascade","description":"Delete a ticket and everything derived from it — attachments (blobs,\nFile Index text, chunk vectors), its live and learned vectors, the\narticles drafted from it (re-drafted from their other sources, or\nretracted), its working memory, runs, case audit, the mail it came from\nand its share of the rollups (erasure.delete_ticket).\n\nadmin.write rather than tickets.write: an operator works tickets, and\nthis takes a record out of the knowledge base and the analytics as well\nas the queue. It needs a reason, is audited with what it took, and is\nrefused (409) naming the hold when a legal hold covers the ticket.","operationId":"delete_ticket_cascade_api_tickets__ticket_id__delete","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","title":"Ticket Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ReasonBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Ticket Cascade Api Tickets  Ticket Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tickets/{ticket_id}/reporters":{"get":{"summary":"Ticket Reporters","description":"Everyone linked to this ticket as a known issue (ticketiq.knownissue):\nwho reported it again, through which door, and whether they were told\nwhen it was resolved. Where they are reached is never shown.","operationId":"ticket_reporters_api_tickets__ticket_id__reporters_get","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","title":"Ticket Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ticket Reporters Api Tickets  Ticket Id  Reporters Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tickets/{ticket_id}/history":{"get":{"summary":"Ticket History","description":"The ticket's field history, oldest first: who opened it and through\nwhich door, every edit with each field's before and after, each time a\nperson overrode what an agent had decided, unmerges and attachment\nchanges. Read from the audit log, which is where those rows already are\n— one record of a change, not a second copy to drift from it.","operationId":"ticket_history_api_tickets__ticket_id__history_get","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","title":"Ticket Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ticket History Api Tickets  Ticket Id  History Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tickets/{ticket_id}/replies":{"post":{"summary":"Post Ticket Reply","description":"Record a reply on a ticket's conversation, for what it does to the\nSLA clocks:\n\n* the desk's first PUBLIC reply is the first response (stamped once,\n  counted met or missed against the response target);\n* the requester's reply resumes a ticket waiting on them — waiting or\n  pending with waiting_on requester (or not said) — back to open, so\n  both clocks run again with the wait banked. One waiting on a third\n  party stays put: the requester answering is not the vendor answering.\n\nAudited as ticket.reply with the text's length only (the conversation\nis personal data the append-only log must not keep).","operationId":"post_ticket_reply_api_tickets__ticket_id__replies_post","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","title":"Ticket Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketReply"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Post Ticket Reply Api Tickets  Ticket Id  Replies Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tickets/{ticket_id}/sensitivity":{"put":{"summary":"Set Ticket Sensitivity","description":"Relabel a ticket, and with it every point derived from it — its\nlearned fix, live point, file chunks and the articles drafted from it.\nRaising takes tickets.write; lowering also governance.write and a\nreason. Audited either way, with the label before and after.","operationId":"set_ticket_sensitivity_api_tickets__ticket_id__sensitivity_put","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","title":"Ticket Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SensitivityBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Ticket Sensitivity Api Tickets  Ticket Id  Sensitivity Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tickets/{ticket_id}/de-escalate":{"post":{"summary":"De Escalate Ticket","description":"Undo a duplicate storm's escalation: the ticket's priority, SLA\ndeadline and first-response target go back to what they were before the\nstorm (kept on the ticket as storm_baseline when the deduplicator raised\nit). The compensating action for the storm, as unmerge is for a merge.\n\n409 when no storm escalated it, or when its priority has moved since\nthe storm set it — that is someone's later decision, and this would\nsilently revert it. Honours If-Match (412 on a stale tag), as PATCH does.","operationId":"de_escalate_ticket_api_tickets__ticket_id__de_escalate_post","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","title":"Ticket Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/DeEscalateBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response De Escalate Ticket Api Tickets  Ticket Id  De Escalate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tickets/{ticket_id}/unmerge":{"post":{"summary":"Unmerge Ticket","description":"Undo a false duplicate-merge: detach the ticket from its parent, roll back\nthe impact counters the merge advanced on the parent, and re-run the full\npipeline so the ticket finally gets its own classification, routing, SLA and\nrecommendations. The parent is NOT auto-de-escalated (ambiguous if other\nreal reports exist); its current counts are returned so the operator can\nadjust its priority deliberately — or ``de_escalate_parent`` asks for the\nstorm's escalation to be undone with it (audited as ticket.de_escalate).","operationId":"unmerge_ticket_api_tickets__ticket_id__unmerge_post","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","title":"Ticket Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/UnmergeBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Unmerge Ticket Api Tickets  Ticket Id  Unmerge Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tickets/{ticket_id}/attachments":{"get":{"summary":"List Ticket Attachments","operationId":"list_ticket_attachments_api_tickets__ticket_id__attachments_get","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","title":"Ticket Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Ticket Attachments Api Tickets  Ticket Id  Attachments Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Ticket Attachments","description":"Purge a ticket's attachment data — chunk vectors, queue rows, and (unless\nkept) the raw blobs. For retention / data-subject-erasure requests.","operationId":"delete_ticket_attachments_api_tickets__ticket_id__attachments_delete","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","title":"Ticket Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Ticket Attachments Api Tickets  Ticket Id  Attachments Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Upload Ticket Attachment","description":"Attach a large file (zip/log bundle) to an existing ticket. The bytes are\nstashed in the blob store and queued for the background batch extractor — the\nrequest returns immediately; the chunk vectors appear on the next worker pass.","operationId":"upload_ticket_attachment_api_tickets__ticket_id__attachments_post","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","title":"Ticket Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_ticket_attachment_api_tickets__ticket_id__attachments_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Upload Ticket Attachment Api Tickets  Ticket Id  Attachments Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/attachments/search":{"get":{"summary":"Search Attachments","description":"Hybrid (semantic + keyword) search over extracted attachment chunks,\naggregated to one hit per ticket with the matching excerpt.","operationId":"search_attachments_api_attachments_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Search Attachments Api Attachments Search Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/attachments/stats":{"get":{"summary":"Attachment Stats","operationId":"attachment_stats_api_attachments_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Attachment Stats Api Attachments Stats Get"}}}}}}},"/api/attachments/extract":{"post":{"summary":"Run Attachment Extraction","description":"Kick the deferred-extraction worker now (the scheduler also runs it on its\ntick). Returns a synchronous batch summary.","operationId":"run_attachment_extraction_api_attachments_extract_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Run Attachment Extraction Api Attachments Extract Post"}}}}}}},"/api/files/search":{"get":{"summary":"Files Search","description":"Hybrid search over the File Index: BM25 full-text over every file's text\n(exact codes, phrases, filenames) fused with the ticket-level semantic vectors.\nOne hit per file, ranked, with a highlighted snippet and container breadcrumb.","operationId":"files_search_api_files_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}},{"name":"ticket_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ticket Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Files Search Api Files Search Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/files":{"get":{"summary":"Files List","description":"Browse the catalog: top-level files (parent_id=0), the members of a container\n(parent_id=<id>), or everything on a ticket.","operationId":"files_list_api_files_get","parameters":[{"name":"ticket_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ticket Id"}},{"name":"parent_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent Id"}},{"name":"containers_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Containers Only"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Files List Api Files Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/files/stats":{"get":{"summary":"Files Stats","operationId":"files_stats_api_files_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Files Stats Api Files Stats Get"}}}}}}},"/api/files/{file_id}":{"get":{"summary":"Files Get","description":"A file's catalog record + a bounded text preview + its immediate members\n(if it's a container).","operationId":"files_get_api_files__file_id__get","parameters":[{"name":"file_id","in":"path","required":true,"schema":{"type":"integer","title":"File Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Files Get Api Files  File Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/runs":{"get":{"summary":"List Runs","description":"Recent pipeline runs the caller may read (see _readable_runs).","operationId":"list_runs_api_runs_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Runs Api Runs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/runs/{run_id}/checkpoint":{"get":{"summary":"Get Run Checkpoint","description":"What a suspended run of the caller's waits for — never its messages\nor the held call's arguments.","operationId":"get_run_checkpoint_api_runs__run_id__checkpoint_get","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Run Checkpoint Api Runs  Run Id  Checkpoint Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/runs/{run_id}/resume":{"post":{"summary":"Resume Run","description":"Resume the caller's suspended run once (runsuspend.resume), blocking:\nagents.run and Cedar's invoke on the agent, as starting it takes. A run\nwaiting for an approval resumes itself when the approval is decided; one\nwaiting for input is given `answer`; one waiting for a connection is\nresumed after connecting, and its call is made again.","operationId":"resume_run_api_runs__run_id__resume_post","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/RunResumeBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Resume Run Api Runs  Run Id  Resume Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/workflows":{"get":{"summary":"List Agent Workflows","operationId":"list_agent_workflows_api_agents__key__workflows_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Agent Workflows Api Agents  Key  Workflows Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/workflows/validate":{"post":{"summary":"Validate Agent Workflow","description":"Check a definition without saving it: every problem, and the graph\nof one that passes — what the editor shows before a save.","operationId":"validate_agent_workflow_api_agents__key__workflows_validate_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Validate Agent Workflow Api Agents  Key  Workflows Validate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/workflows/{name}":{"put":{"summary":"Put Agent Workflow","description":"Save a new version. The name in the path is the workflow's; a\ndefinition naming another is refused rather than saved under either.","operationId":"put_agent_workflow_api_agents__key__workflows__name__put","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Agent Workflow Api Agents  Key  Workflows  Name  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Get Agent Workflow","operationId":"get_agent_workflow_api_agents__key__workflows__name__get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"version","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Agent Workflow Api Agents  Key  Workflows  Name  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Agent Workflow","description":"Delete every version. A run already waiting ends when it resumes (its\nversion is gone); its history stays.","operationId":"delete_agent_workflow_api_agents__key__workflows__name__delete","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Agent Workflow Api Agents  Key  Workflows  Name  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/workflows/{name}/runs":{"post":{"summary":"Run Agent Workflow","description":"Run a workflow to its end or its first wait (an approval), blocking.\nA waiting run goes on by itself once the approval is decided.","operationId":"run_agent_workflow_api_agents__key__workflows__name__runs_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/WorkflowRunBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Run Agent Workflow Api Agents  Key  Workflows  Name  Runs Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/workflow-runs":{"get":{"summary":"List Agent Workflow Runs","operationId":"list_agent_workflow_runs_api_agents__key__workflow_runs_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"workflow","in":"query","required":false,"schema":{"type":"string","default":"","title":"Workflow"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Agent Workflow Runs Api Agents  Key  Workflow Runs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/workflow-runs/{run_id}":{"get":{"summary":"Get Agent Workflow Run","operationId":"get_agent_workflow_run_api_agents__key__workflow_runs__run_id__get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Agent Workflow Run Api Agents  Key  Workflow Runs  Run Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/workflow-runs/{run_id}/cancel":{"post":{"summary":"Cancel Agent Workflow Run","description":"The run's owner ends it while it waits; another caller's run answers\nas an unknown one does.","operationId":"cancel_agent_workflow_run_api_agents__key__workflow_runs__run_id__cancel_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cancel Agent Workflow Run Api Agents  Key  Workflow Runs  Run Id  Cancel Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sources":{"get":{"summary":"List Sources","description":"Sources the caller's current tenant owns.\n\nWhen no tenants are configured the scope is None and every source is\nreturned, so a single-customer instance is unaffected by this existing.","operationId":"list_sources_api_sources_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Sources Api Sources Get"}}}}}},"post":{"summary":"Create Source","operationId":"create_source_api_sources_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Source Api Sources Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sources/{source_id}/test":{"post":{"summary":"Test Source Endpoint","operationId":"test_source_endpoint_api_sources__source_id__test_post","parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"string","title":"Source Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Test Source Endpoint Api Sources  Source Id  Test Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sources/{source_id}/sync":{"post":{"summary":"Sync Source","operationId":"sync_source_api_sources__source_id__sync_post","parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"string","title":"Source Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Sync Source Api Sources  Source Id  Sync Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/jobs":{"get":{"summary":"List Jobs","operationId":"list_jobs_api_jobs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Jobs Api Jobs Get"}}}}}}},"/api/jobs/{job_id}":{"get":{"summary":"Get Job","operationId":"get_job_api_jobs__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Job Api Jobs  Job Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/jobs/{job_id}/cancel":{"post":{"summary":"Cancel Job","operationId":"cancel_job_api_jobs__job_id__cancel_post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cancel Job Api Jobs  Job Id  Cancel Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/insights":{"get":{"summary":"Get Insights","operationId":"get_insights_api_insights_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Insights Api Insights Get"}}}}}}},"/api/insights/graph":{"get":{"summary":"Insights Graph","operationId":"insights_graph_api_insights_graph_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Insights Graph Api Insights Graph Get"}}}}}}},"/api/insights/rebuild":{"post":{"summary":"Rebuild Insights","operationId":"rebuild_insights_api_insights_rebuild_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Rebuild Insights Api Insights Rebuild Post"}}}}}}},"/api/insights/opportunities":{"get":{"summary":"Insights Opportunities","description":"Recurring resolved tickets grouped by meaning, ranked by what an agent\ntaking them on is worth, with whether one already does. Served from the\nPostgres cache; mined from the caller's own tenant's tickets only.\nMining reads every ticket in scope, so it is agents.run's, as the\nknowledge-base rebuild is: `refresh` needs it, and so does the\nre-mine of a stale or empty cache — a reader without it gets the cached\nrows flagged `stale` instead, never a mine it could not have asked for.\nEvery mine is audited. Ticket titles, examples, resolutions and ids are\ntickets.read's: analytics.read alone sees the numbers.","operationId":"insights_opportunities_api_insights_opportunities_get","parameters":[{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Refresh"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Insights Opportunities Api Insights Opportunities Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/insights/opportunities/{opp_id}/agent":{"post":{"summary":"Opportunity Draft Agent","description":"A draft agent for the opportunity: registered disabled, with no\nprovider binding and a generated prompt — uninstalled until an operator\nreviews it, binds a model and enables it. It is a create like any other,\nso the Cedar `create` gate sees the record it would store.","operationId":"opportunity_draft_agent_api_insights_opportunities__opp_id__agent_post","parameters":[{"name":"opp_id","in":"path","required":true,"schema":{"type":"string","title":"Opp Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Opportunity Draft Agent Api Insights Opportunities  Opp Id  Agent Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/insights/opportunities/{opp_id}/evalset":{"post":{"summary":"Opportunity Evalset","description":"The opportunity's tickets as agent_turn cases in the next version of\na dataset — redacted, expecting what the resolutions share. Ticket text\nbecomes dataset content, so it needs tickets.read as from-tickets does.","operationId":"opportunity_evalset_api_insights_opportunities__opp_id__evalset_post","parameters":[{"name":"opp_id","in":"path","required":true,"schema":{"type":"string","title":"Opp Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/OpportunityEvalBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Opportunity Evalset Api Insights Opportunities  Opp Id  Evalset Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/insights/patterns":{"get":{"summary":"Insights Patterns","description":"Failure patterns in the caller's tenant scope: clusters of failed\nconversations — silent ones too — with frequency, users affected, a\nroot-cause note and their status (open, resolved, reopened). Examples\nand conversation ids are what was said, so transcripts.content.read's;\nanalytics.read alone sees the numbers and the names.","operationId":"insights_patterns_api_insights_patterns_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"","title":"Status"}},{"name":"agent","in":"query","required":false,"schema":{"type":"string","default":"","title":"Agent"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Insights Patterns Api Insights Patterns Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/insights/patterns/mine":{"post":{"summary":"Mine Patterns","description":"Mine now (the scheduler does hourly) — the caller's own tenants only.\nIt reads every settled conversation in the window and may call the\nlabelling model, so it is agents.run's, as a KB rebuild is; audited.","operationId":"mine_patterns_api_insights_patterns_mine_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Mine Patterns Api Insights Patterns Mine Post"}}}}}}},"/api/insights/patterns/{pid}":{"get":{"summary":"Insights Pattern","operationId":"insights_pattern_api_insights_patterns__pid__get","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Insights Pattern Api Insights Patterns  Pid  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Update Pattern","description":"Resolve a pattern (a fix shipped: the next failure like it that\nstarts afterwards reopens it) or put it back to open. Audited.","operationId":"update_pattern_api_insights_patterns__pid__patch","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatternStatusBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Pattern Api Insights Patterns  Pid  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/insights/patterns/{pid}/fixes":{"post":{"summary":"Propose Pattern Fix","description":"Turn a pattern into a proposed fix — never an applied one:\n\n* ``kb_draft`` (agents.run, as the scribe, and transcripts.content.read):\n  a KB draft for review — grounded in the tickets the pattern's\n  conversations raised, or outlined from its examples, so what was said;\n* ``instruction`` (agents.update, and Cedar ``update`` on the agent): the\n  agent's instructions with guidance for the pattern appended, filed as a\n  change request that a second person approves;\n* ``eval_case`` (governance.write and transcripts.content.read): the\n  pattern's conversations as agent_turn cases in a dataset version.\n\nEach is recorded on the pattern and audited. The permission is checked\nbefore the pattern is looked up, so a caller who could not propose the\nfix learns nothing about which patterns exist.","operationId":"propose_pattern_fix_api_insights_patterns__pid__fixes_post","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatternFixBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Propose Pattern Fix Api Insights Patterns  Pid  Fixes Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/analytics":{"get":{"summary":"Get Analytics","description":"Per-agent enterprise analytics assembled from the pre-aggregated rollup\ncube + the bounded live working set — no full-corpus scan, so it is O(1) at\ncrore scale. Organized as {meta, executive, by_agent}.","operationId":"get_analytics_api_analytics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Analytics Api Analytics Get"}}}}}}},"/api/analytics/cost-model":{"get":{"summary":"Get Cost Model","description":"The cost model the value figures are priced by: a base cost and handle\ntime per ticket, overrides by agent, category and priority, and the share\nof a ticket credited to an agent that only recommended its fix. One\ninstance-wide record, gated like the value report it prices.","operationId":"get_cost_model_api_analytics_cost_model_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Cost Model Api Analytics Cost Model Get"}}}}}},"put":{"summary":"Put Cost Model","description":"Replace the cost model. governance.write, not analytics.read: these\nnumbers are what the dashboard's savings and every agent's ROI are\nclaimed in, so moving them is changing what the business is told its\nagents are worth — audited with what it was and what it became. It is\none record for every tenant, so a caller confined to one tenant may not\nreprice the others' dashboards: refused before the body is even read.","operationId":"put_cost_model_api_analytics_cost_model_put","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Put Cost Model Api Analytics Cost Model Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/response-cache":{"get":{"summary":"Get Response Cache","description":"The response cache's TTLs in force (defaults under what is stored) and\nwhat it has saved. One instance-wide record, like the cost model.","operationId":"get_response_cache_api_response_cache_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Response Cache Api Response Cache Get"}}}}}},"put":{"summary":"Put Response Cache","description":"Set per-agent cache TTLs ({\"agents\": {name: cache_ttl_s}}; 0 is off).\ngovernance.write and audited with before and after: the cache decides\nwhether a governed answer is re-served, so turning it on or off is a\nchange to how answers are given. Lowering an agent's TTL also purges what\nthat agent has kept, so \"off\" means nothing old is served or held.","operationId":"put_response_cache_api_response_cache_put","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Put Response Cache Api Response Cache Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/semantic-cache":{"get":{"summary":"Get Semantic Cache","description":"The semantic answer cache's settings (the instance default and each\ntenant's own), the bounds a threshold and TTL may take, and what it has\nsaved: hits (model calls avoided), tokens and dollars, entries kept.\nOne instance-wide record, beside the response cache's.","operationId":"get_semantic_cache_api_semantic_cache_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Semantic Cache Api Semantic Cache Get"}}}}}},"put":{"summary":"Put Semantic Cache","description":"Set the semantic cache's switch, similarity threshold, TTL and KB\ntrust — instance-wide and per tenant ({\"enabled\", \"threshold\", \"ttl_s\",\n\"verify_kb_grounded\", \"tenants\": {id: …}}). governance.write and audited\nwith before and after: it decides whether one person is given another's\nverified answer. Switching it off where it was on purges what that scope\nkept, so \"off\" holds nothing to serve later.","operationId":"put_semantic_cache_api_semantic_cache_put","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Put Semantic Cache Api Semantic Cache Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/semantic-cache/entries":{"get":{"summary":"List Semantic Cache","description":"Live entries, newest first: the redacted question, how it was verified\n(thumbs_up, approved, kb — never by whom), its sources and hits. Never\nthe answer text.","operationId":"list_semantic_cache_api_semantic_cache_entries_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"","title":"Status"}},{"name":"tenant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Semantic Cache Api Semantic Cache Entries Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/semantic-cache/entries/{entry_id}/approve":{"post":{"summary":"Approve Semantic Cache Entry","description":"An operator's approval of a candidate answer: it may now be reused,\nas if a person had given it a thumbs-up.","operationId":"approve_semantic_cache_entry_api_semantic_cache_entries__entry_id__approve_post","parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","title":"Entry Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Approve Semantic Cache Entry Api Semantic Cache Entries  Entry Id  Approve Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/semantic-cache/entries/{entry_id}":{"delete":{"summary":"Delete Semantic Cache Entry","operationId":"delete_semantic_cache_entry_api_semantic_cache_entries__entry_id__delete","parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","title":"Entry Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Semantic Cache Entry Api Semantic Cache Entries  Entry Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/semantic-cache/purge":{"post":{"summary":"Purge Semantic Cache","description":"Drop every kept answer — or one tenant's — now: after a KB clean-up,\nor an erasure request.","operationId":"purge_semantic_cache_api_semantic_cache_purge_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SemanticCachePurgeBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Purge Semantic Cache Api Semantic Cache Purge Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/analytics/value":{"get":{"summary":"Get Value","description":"Each agent's value over a window — resolutions, assisted resolutions,\nattributed deflections, duplicates absorbed and hours saved, priced by\nthe cost model — against what it spent (the spend ledger): net value,\nROI and cost per resolution. Defaults to the last 30 days. Built over\nevery tenant's tickets and spend, so refused to a tenant-confined caller\nas the analytics cube is.","operationId":"get_value_api_analytics_value_get","parameters":[{"name":"window","in":"query","required":false,"schema":{"type":"string","default":"","title":"Window"}},{"name":"start","in":"query","required":false,"schema":{"type":"string","default":"","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","default":"","title":"End"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Value Api Analytics Value Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/events":{"get":{"summary":"Events Stream","description":"Server-Sent Events: pushes live change events (ticket routed/resolved,\nanalytics stale) to connected dashboards so they update in realtime instead\nof polling. Self-hosted — the browser talks only to this app. Authenticated\nby the session cookie (EventSource sends it same-origin).","operationId":"events_stream_api_events_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/analytics/rebuild":{"post":{"summary":"Rebuild Analytics","description":"Recompute the rollup cube from the corpus (the only O(corpus) pass). Run\nafter a large historical backfill so cumulative analytics reflect it.","operationId":"rebuild_analytics_api_analytics_rebuild_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Rebuild Analytics Api Analytics Rebuild Post"}}}}}}},"/api/metrics/search-bench":{"post":{"summary":"Search Bench","description":"Measure end-to-end semantic search latency (embed + ANN) across the\nlargest collection — the number that matters for dedup/RAG at scale.","operationId":"search_bench_api_metrics_search_bench_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Search Bench Api Metrics Search Bench Post"}}}}}}},"/api/sources/{source_id}/reclassify":{"post":{"summary":"Reclassify Source","description":"Payload-only category backfill for already-embedded collections.","operationId":"reclassify_source_api_sources__source_id__reclassify_post","parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"string","title":"Source Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reclassify Source Api Sources  Source Id  Reclassify Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sources/{source_id}/reacl":{"post":{"summary":"Reacl Source","description":"Re-read the source's permissions onto every ticket already imported\nfrom it, and onto the points derived from them (sync.reacl_source_pipeline):\nthe backfill for tickets imported before ACL capture, and for a source\nwhose sync never re-reads a record it has. It also backfills the\nsource's own category/team/priority as triage evaluation labels onto\ntickets imported before ingestion kept them (sync._backfill_source_labels).","operationId":"reacl_source_api_sources__source_id__reacl_post","parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"string","title":"Source Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reacl Source Api Sources  Source Id  Reacl Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sources/{source_id}/relink":{"post":{"summary":"Relink Source","description":"Give every record already synced from the source its link to the\noriginal (ticketiq.origin.backfill): the issue page for Jira, the record\npage for ServiceNow, the link template for ERP/SQL/CSV. Payload-only,\nnever a re-embed, and idempotent. The scheduler runs it once per source\nand its settings on its own; this runs it now.","operationId":"relink_source_api_sources__source_id__relink_post","parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"string","title":"Source Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Relink Source Api Sources  Source Id  Relink Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sources/{source_id}":{"patch":{"summary":"Patch Source","operationId":"patch_source_api_sources__source_id__patch","parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"string","title":"Source Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourcePatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Patch Source Api Sources  Source Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Source","description":"Delete a source and its KB collection. With ``cascade=true`` also\nevery ticket that arrived through it, each with the whole ticket\ncascade (DELETE /api/tickets/{id}) — which takes admin.write as well\nas sources.write, a reason, and the source's tenant; any legal hold on\nany of its tickets refuses the lot (409) before anything is deleted.\nGET /api/sources/{id}/cascade previews it.","operationId":"delete_source_api_sources__source_id__delete","parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"string","title":"Source Id"}},{"name":"cascade","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Cascade"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ReasonBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Source Api Sources  Source Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sources/{source_id}/cascade":{"get":{"summary":"Source Cascade Preview","description":"What DELETE /api/sources/{id}?cascade=true would take — the source's\ntickets and their attachments, the articles drafted from them, its\nvector collection — and the legal holds that would refuse it. Nothing\nis changed.\n\nA hold's scope, target and reason (a target may be a requester's\naddress; a reason names the matter) are for those who may list holds\n(access.read, GET /api/holds); anyone else who can read sources learns\nonly that holds apply, and which ids to ask about.","operationId":"source_cascade_preview_api_sources__source_id__cascade_get","parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"string","title":"Source Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Source Cascade Preview Api Sources  Source Id  Cascade Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/collections":{"get":{"summary":"Collections","operationId":"collections_api_collections_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Collections Api Collections Get"}}}}}}},"/api/mailserver/start":{"post":{"summary":"Mailserver Start","operationId":"mailserver_start_api_mailserver_start_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Mailserver Start Api Mailserver Start Post"}}}}}}},"/api/mailserver/stop":{"post":{"summary":"Mailserver Stop","operationId":"mailserver_stop_api_mailserver_stop_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Mailserver Stop Api Mailserver Stop Post"}}}}}}},"/api/mailserver":{"get":{"summary":"Mailserver Status","operationId":"mailserver_status_api_mailserver_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Mailserver Status Api Mailserver Get"}}}}}}},"/api/mailserver/send-test":{"post":{"summary":"Mailserver Send Test","operationId":"mailserver_send_test_api_mailserver_send_test_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendTestBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Mailserver Send Test Api Mailserver Send Test Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mailserver/ingest":{"post":{"summary":"Mailserver Ingest","operationId":"mailserver_ingest_api_mailserver_ingest_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Mailserver Ingest Api Mailserver Ingest Post"}}}}}}},"/api/settings":{"get":{"summary":"Get Runtime Settings","operationId":"get_runtime_settings_api_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Runtime Settings Api Settings Get"}}}}}},"patch":{"summary":"Patch Runtime Settings","description":"Change runtime settings. `reason` is not a setting: it is the why a\nchange that switches off an active control needs (_detectors_a_cap_moves,\naudit_spend_reads, audit_provider_reads, detector_firings_keep_on_delete or a\nsupervised_* pipeline step turned off, or audit_read_logging lowered), and is ignored on any other. Null is no reason, as on a detector\nPATCH. A body naming no setting is a 422, reason or not, rather than a\nwrite and an audit row that changed nothing.\n\nWith ?candidate=true nothing changes: the settings are validated exactly\nas a live change is and stored as a promotion candidate (replay.py) —\ntriage and knowledge settings only, plus a `routing_table` and a `note` —\nto be replayed, evaluated, signed off and promoted.","operationId":"patch_runtime_settings_api_settings_patch","parameters":[{"name":"candidate","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Candidate"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Patch Runtime Settings Api Settings Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/replays":{"get":{"summary":"List Replays","operationId":"list_replays_api_replays_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Replays Api Replays Get"}}}}}},"post":{"summary":"Start Replay","description":"Replay the newest decided tickets under the configuration in force and\nunder a settings candidate; keep and return the diff of changed decisions\nwith both configuration fingerprints and the verdict (replay.run).","operationId":"start_replay_api_replays_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplayBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Start Replay Api Replays Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/replays/{replay_id}":{"get":{"summary":"Get Replay","operationId":"get_replay_api_replays__replay_id__get","parameters":[{"name":"replay_id","in":"path","required":true,"schema":{"type":"string","title":"Replay Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Replay Api Replays  Replay Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/settings/candidates":{"get":{"summary":"List Settings Candidates","operationId":"list_settings_candidates_api_settings_candidates_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Settings Candidates Api Settings Candidates Get"}}}}}}},"/api/settings/candidates/{cid}":{"get":{"summary":"Get Settings Candidate","operationId":"get_settings_candidate_api_settings_candidates__cid__get","parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"string","title":"Cid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Settings Candidate Api Settings Candidates  Cid  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/settings/candidates/{cid}/signoff":{"post":{"summary":"Sign Off Candidate","description":"A second person's sign-off on the candidate as it stands. Its author\ncannot give one — refused and audited, as a four-eyes erasure's is.","operationId":"sign_off_candidate_api_settings_candidates__cid__signoff_post","parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"string","title":"Cid"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/CandidateNoteBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Sign Off Candidate Api Settings Candidates  Cid  Signoff Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/settings/candidates/{cid}/promote":{"post":{"summary":"Promote Candidate","description":"Apply a candidate — only when its replay, the frozen eval bank and a\nsecond person's sign-off all pass (replay.gate); 409 with every check\notherwise. Applied through the ordinary routes, so their permissions and\nweakening gates hold as for a direct change.","operationId":"promote_candidate_api_settings_candidates__cid__promote_post","parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"string","title":"Cid"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/CandidateNoteBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Promote Candidate Api Settings Candidates  Cid  Promote Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/settings/candidates/{cid}/withdraw":{"post":{"summary":"Withdraw Candidate","operationId":"withdraw_candidate_api_settings_candidates__cid__withdraw_post","parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"string","title":"Cid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Withdraw Candidate Api Settings Candidates  Cid  Withdraw Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/routing":{"get":{"summary":"Get Routing","operationId":"get_routing_api_routing_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Routing Api Routing Get"}}}}}},"put":{"summary":"Put Routing","operationId":"put_routing_api_routing_put","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Put Routing Api Routing Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Reset Routing","operationId":"reset_routing_api_routing_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Reset Routing Api Routing Delete"}}}}}}},"/api/taxonomy":{"get":{"summary":"Get Taxonomy","operationId":"get_taxonomy_api_taxonomy_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Taxonomy Api Taxonomy Get"}}}}}}},"/api/taxonomy/discover":{"post":{"summary":"Discover Taxonomy","operationId":"discover_taxonomy_api_taxonomy_discover_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaxonomyDiscoverBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Discover Taxonomy Api Taxonomy Discover Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/taxonomy/proposal/edit":{"post":{"summary":"Edit Taxonomy","operationId":"edit_taxonomy_api_taxonomy_proposal_edit_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Edit Taxonomy Api Taxonomy Proposal Edit Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/taxonomy/proposal":{"delete":{"summary":"Discard Taxonomy Proposal","operationId":"discard_taxonomy_proposal_api_taxonomy_proposal_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Discard Taxonomy Proposal Api Taxonomy Proposal Delete"}}}}}}},"/api/taxonomy/approve":{"post":{"summary":"Approve Taxonomy","operationId":"approve_taxonomy_api_taxonomy_approve_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Approve Taxonomy Api Taxonomy Approve Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/taxonomy/activate":{"post":{"summary":"Activate Taxonomy","description":"Roll back (or forward) to an approved version; version 0 turns the\nlearned taxonomy off, back to the default IT categories.","operationId":"activate_taxonomy_api_taxonomy_activate_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Activate Taxonomy Api Taxonomy Activate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/taxonomy/reclassify":{"post":{"summary":"Reclassify Taxonomy","description":"Re-file the tenant's existing tickets under the approved taxonomy, as a\nbackground job. A category or team a person set is left alone; open\ntickets are re-indexed so duplicate detection sees the new category.","operationId":"reclassify_taxonomy_api_taxonomy_reclassify_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Reclassify Taxonomy Api Taxonomy Reclassify Post"}}}}}}},"/api/sla/policies":{"get":{"summary":"List Sla Policies","description":"Every SLA policy the caller may see, in the order the router tries\nthem, and the flat table a ticket no policy matches falls back to.","operationId":"list_sla_policies_api_sla_policies_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Sla Policies Api Sla Policies Get"}}}}}}},"/api/sla/policies/{name}":{"get":{"summary":"Get Sla Policy","operationId":"get_sla_policy_api_sla_policies__name__get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Sla Policy Api Sla Policies  Name  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Put Sla Policy","description":"Create or replace one policy. Validated whole before anything is\nwritten; applies to the next ticket routed (tickets already on the clock\nkeep their deadlines until a priority change lays them again).","operationId":"put_sla_policy_api_sla_policies__name__put","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Sla Policy Api Sla Policies  Name  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Sla Policy","description":"Remove a policy. Tickets already on its clock keep their deadlines; a\npause in force on one ends on elapsed time (sla.end_pause). An optional\n``reason`` is recorded on the audit row.","operationId":"delete_sla_policy_api_sla_policies__name__delete","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Sla Policy Api Sla Policies  Name  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sla/preview":{"get":{"summary":"Preview Sla","description":"When a ticket would be due: under `policy` by name, or under whichever\npolicy would govern a ticket of this priority, category, team and tenant\n(the flat table when none would). `created_at` is when its clock starts,\nnow by default. Deadlines come in UTC and in the calendar's zone.","operationId":"preview_sla_api_sla_preview_get","parameters":[{"name":"priority","in":"query","required":false,"schema":{"type":"string","default":"P3","title":"Priority"}},{"name":"created_at","in":"query","required":false,"schema":{"type":"string","default":"","title":"Created At"}},{"name":"category","in":"query","required":false,"schema":{"type":"string","default":"","title":"Category"}},{"name":"team","in":"query","required":false,"schema":{"type":"string","default":"","title":"Team"}},{"name":"tenant","in":"query","required":false,"schema":{"type":"string","default":"","title":"Tenant"}},{"name":"policy","in":"query","required":false,"schema":{"type":"string","default":"","title":"Policy"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Preview Sla Api Sla Preview Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Preview Sla Draft","description":"The same, for a policy not yet saved — the console's editor asks\nbefore it saves. Writes nothing.","operationId":"preview_sla_draft_api_sla_preview_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Preview Sla Draft Api Sla Preview Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/integrations":{"get":{"summary":"List Integrations","operationId":"list_integrations_api_integrations_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Integrations Api Integrations Get"}}}}}},"post":{"summary":"Create Integration","operationId":"create_integration_api_integrations_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Integration Api Integrations Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/integrations/{integ_id}/test":{"post":{"summary":"Test Integration","operationId":"test_integration_api_integrations__integ_id__test_post","parameters":[{"name":"integ_id","in":"path","required":true,"schema":{"type":"string","title":"Integ Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Test Integration Api Integrations  Integ Id  Test Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/integrations/{integ_id}/deliveries":{"get":{"summary":"List Integration Deliveries","description":"The delivery log: one integration's deliveries, newest first — status,\nattempts, the last HTTP status and error, latency, trace id and the\nrecent attempts — paged by `before` (the previous page's next_before).","operationId":"list_integration_deliveries_api_integrations__integ_id__deliveries_get","parameters":[{"name":"integ_id","in":"path","required":true,"schema":{"type":"string","title":"Integ Id"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"","title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Before"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Integration Deliveries Api Integrations  Integ Id  Deliveries Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/integrations/{integ_id}/deliveries/{delivery_id}/redeliver":{"post":{"summary":"Redeliver Integration Delivery","description":"Send one delivery again now — same event id, fresh retry budget.","operationId":"redeliver_integration_delivery_api_integrations__integ_id__deliveries__delivery_id__redeliver_post","parameters":[{"name":"integ_id","in":"path","required":true,"schema":{"type":"string","title":"Integ Id"}},{"name":"delivery_id","in":"path","required":true,"schema":{"type":"integer","title":"Delivery Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Redeliver Integration Delivery Api Integrations  Integ Id  Deliveries  Delivery Id  Redeliver Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/integrations/{integ_id}/redeliver-dead":{"post":{"summary":"Redeliver Integration Dead","description":"Requeue every dead-lettered delivery of one integration.","operationId":"redeliver_integration_dead_api_integrations__integ_id__redeliver_dead_post","parameters":[{"name":"integ_id","in":"path","required":true,"schema":{"type":"string","title":"Integ Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Redeliver Integration Dead Api Integrations  Integ Id  Redeliver Dead Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/integrations/{integ_id}/rotate-secret":{"post":{"summary":"Rotate Integration Secret","description":"A new Standard Webhooks signing secret, shown once. During the overlap\nboth secrets sign every request, so the receiver can switch whenever.","operationId":"rotate_integration_secret_api_integrations__integ_id__rotate_secret_post","parameters":[{"name":"integ_id","in":"path","required":true,"schema":{"type":"string","title":"Integ Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/RotateSigningSecretBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Rotate Integration Secret Api Integrations  Integ Id  Rotate Secret Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/integrations/{integ_id}":{"delete":{"summary":"Delete Integration","operationId":"delete_integration_api_integrations__integ_id__delete","parameters":[{"name":"integ_id","in":"path","required":true,"schema":{"type":"string","title":"Integ Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Integration Api Integrations  Integ Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Edit Integration","description":"Rotate a webhook URL or enable/disable a connector in place (no\ndelete-and-recreate). Only provided fields change; the merged record is\nre-validated through the same SSRF/format guards as creation.","operationId":"edit_integration_api_integrations__integ_id__put","parameters":[{"name":"integ_id","in":"path","required":true,"schema":{"type":"string","title":"Integ Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationUpdateBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Edit Integration Api Integrations  Integ Id  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/api-token":{"get":{"summary":"Get Api Token","operationId":"get_api_token_api_api_token_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Api Token Api Api Token Get"}}}}}}},"/api/api-token/rotate":{"post":{"summary":"Rotate Api Token","description":"New instance key. The replaced one keeps working for the grace window\nrather than stopping at once: every integration holding it — the Teams\nbot, the monitoring hook, a partner's intake script — breaks at the same\nmoment otherwise, and a rotation that is an outage is one nobody does.","operationId":"rotate_api_token_api_api_token_rotate_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/RotateKeyBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Rotate Api Token Api Api Token Rotate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/api-token/previous":{"delete":{"summary":"Revoke Previous Api Token","description":"End the grace window now — the rotation was for a key that leaked, or\nevery integration has already moved.","operationId":"revoke_previous_api_token_api_api_token_previous_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Revoke Previous Api Token Api Api Token Previous Delete"}}}}}}},"/api/idp/issuers":{"get":{"summary":"List Idp Issuers","operationId":"list_idp_issuers_api_idp_issuers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Idp Issuers Api Idp Issuers Get"}}}}}}},"/api/idp/issuers/{name}":{"put":{"summary":"Put Idp Issuer","description":"Register or replace a trusted issuer. With neither jwks nor jwks_uri\nits keys are found through OIDC discovery, fetched now: a wrong issuer\nor an unreachable IdP is a 422 to read here, not every agent refused\nlater. Every mapping must name an agent or inbound client that exists.","operationId":"put_idp_issuer_api_idp_issuers__name__put","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Idp Issuer Api Idp Issuers  Name  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Idp Issuer","operationId":"delete_idp_issuer_api_idp_issuers__name__delete","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Idp Issuer Api Idp Issuers  Name  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/idp/test":{"post":{"summary":"Test Idp Token","description":"Dry run: what this instance would make of a token, without accepting\nit anywhere. The answer is the agent or client it would act as, or the\nreason it would be refused — and, once its signature verified, what it\nsays about itself, so the operator can see which subject to map. The\ntoken itself is never stored or audited.","operationId":"test_idp_token_api_idp_test_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IdPTestBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Test Idp Token Api Idp Test Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/idp/instance-key":{"get":{"summary":"Get Instance Key State","operationId":"get_instance_key_state_api_idp_instance_key_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Instance Key State Api Idp Instance Key Get"}}}}}},"put":{"summary":"Put Instance Key State","description":"Switch the unscoped instance API key off, or back on. Off is a\ntightening, the owner's alone. On again reopens a door with no scopes,\nso it is a weakening too: governance.weaken and a reason, and never past\nan environment that switched it off.","operationId":"put_instance_key_state_api_idp_instance_key_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstanceKeyBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Put Instance Key State Api Idp Instance Key Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tickets/{ticket_id}/copilot":{"get":{"summary":"Ticket Copilot","description":"Decision-support pack for the rep handling this ticket: summary, sentiment,\nsimilar resolved cases + fixes, related File Index hits, a grounded suggested\nreply, and next-best-actions. Generative parts use BYOLLM (local = air-gapped)\nand degrade to honest heuristics when no model is configured.","operationId":"ticket_copilot_api_tickets__ticket_id__copilot_get","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","title":"Ticket Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ticket Copilot Api Tickets  Ticket Id  Copilot Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/metrics/deflection":{"get":{"summary":"Deflection Metrics","description":"The headline AI-ITSM KPI. Honest definition: a query is DEFLECTED when the\nKB returned a confident answer (a recommendation above the recommend\nthreshold) and the user did not then file a ticket. We count `answered` at\nanswer time and `filed` when a follow-up ticket is opened, so the rate is\nanswered-minus-filed, never just 'a match existed'.\n\n`attributed` is the same claim made per answer (ticketiq.answers): each\nanswered question settled as deflected, escalated (its asker filed a\nticket inside the window) or disliked, the rate over the settled ones\nwith a 95% Wilson interval — over the tenants the caller may read. The\nlegacy counters above are instance-wide and kept for continuity.","operationId":"deflection_metrics_api_metrics_deflection_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Deflection Metrics Api Metrics Deflection Get"}}}}}}},"/api/integrations/teams-inbound":{"get":{"summary":"Get Teams Inbound","operationId":"get_teams_inbound_api_integrations_teams_inbound_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Teams Inbound Api Integrations Teams Inbound Get"}}}}}},"put":{"summary":"Set Teams Inbound","description":"Store the Teams Outgoing-Webhook security token so @mentions in Teams can\nbe HMAC-verified and answered/turned into tickets (no Azure Bot needed).","operationId":"set_teams_inbound_api_integrations_teams_inbound_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamsInboundBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Set Teams Inbound Api Integrations Teams Inbound Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kb/gaps":{"get":{"summary":"Kb Gaps","description":"Unanswered questions grouped by meaning, with whether the KB now\ncovers each group (a close fix found by the same search self-service uses).","operationId":"kb_gaps_api_kb_gaps_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":25,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Kb Gaps Api Kb Gaps Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kb/gaps/dismiss":{"post":{"summary":"Kb Gaps Dismiss","operationId":"kb_gaps_dismiss_api_kb_gaps_dismiss_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GapDismissBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Kb Gaps Dismiss Api Kb Gaps Dismiss Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kb/{ref_id}":{"delete":{"summary":"Delete Kb Entry","description":"Permanently remove a single learned resolution from the recommendable KB\n(e.g. a wrong, offensive, or credential-leaking fix). Searches every KB\ncollection so it reaches the implicit kb_resolved store too.","operationId":"delete_kb_entry_api_kb__ref_id__delete","parameters":[{"name":"ref_id","in":"path","required":true,"schema":{"type":"string","title":"Ref Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Kb Entry Api Kb  Ref Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kb/{ref_id}/quarantine":{"post":{"summary":"Quarantine Kb Entry","description":"Soft-retract a KB entry: it stays for audit but is filtered out of every\nrecommendation (strategist + /answer). Reversible via ?on=false.","operationId":"quarantine_kb_entry_api_kb__ref_id__quarantine_post","parameters":[{"name":"ref_id","in":"path","required":true,"schema":{"type":"string","title":"Ref Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Quarantine Kb Entry Api Kb  Ref Id  Quarantine Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kb/integrity":{"get":{"summary":"Kb Integrity","description":"The last knowledge-base integrity and oversharing report\n(kbmaint.integrity_check): out-of-band edits, scanner quarantines, and\npoints an outward surface can serve that carry PII, a credential, text\nthat reads like instructions or a sensitive category. Kinds, never the\nvalues. A tenant-scoped caller sees its own tenant's entries only; the\ncounts are then recomputed over those.","operationId":"kb_integrity_api_kb_integrity_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Kb Integrity Api Kb Integrity Get"}}}}}}},"/api/kb/integrity/run":{"post":{"summary":"Run Kb Integrity","description":"Run the nightly integrity and oversharing pass now, as a background\njob. It can quarantine entries (an out-of-band edit), so it is an admin\naction, and audited.","operationId":"run_kb_integrity_api_kb_integrity_run_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Run Kb Integrity Api Kb Integrity Run Post"}}}}}}},"/api/kb/{ref_id}/sensitivity":{"put":{"summary":"Set Kb Sensitivity","description":"Relabel one knowledge-base entry. A learned fix is its ticket's label,\nso the TICKET is relabelled (and every point from it); an approved\narticle keeps the relabel over its sources' label until one of them is\nraised past what was reviewed (scribe.article_sensitivity); a source\ncollection's point is relabelled in place, and the relabel held over\nre-syncs by the same rule (sync.SOURCE_LABELS_KEY). Lowering takes\ngovernance.write and a reason, as for a ticket.","operationId":"set_kb_sensitivity_api_kb__ref_id__sensitivity_put","parameters":[{"name":"ref_id","in":"path","required":true,"schema":{"type":"string","title":"Ref Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SensitivityBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Kb Sensitivity Api Kb  Ref Id  Sensitivity Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sensitivity":{"get":{"summary":"Get Sensitivity","description":"The label ladder, each surface's ceiling, and how many tickets carry\neach label (in the caller's tenant).","operationId":"get_sensitivity_api_sensitivity_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Sensitivity Api Sensitivity Get"}}}}}}},"/api/sensitivity/ceilings":{"put":{"summary":"Put Sensitivity Ceilings","description":"Change what surfaces may quote. Tightening a ceiling is governance\nwork; LOOSENING one switches off part of a control that is protecting\nsomething now, so it also takes governance.weaken and a reason, as\ndemoting a guardrail does.","operationId":"put_sensitivity_ceilings_api_sensitivity_ceilings_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CeilingsBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Put Sensitivity Ceilings Api Sensitivity Ceilings Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/recommendations/{ref_id}/feedback":{"post":{"summary":"Recommendation Feedback","description":"Record whether a recommended fix actually helped. Persisted on the KB\npayload (no re-embed) and blended into ranking so validated fixes rise and\nrepeatedly-unhelpful ones sink — the feedback signal the learning loop\nlacked. One standing vote per person per fix: a repeat is answered\n``counted: false`` and moves nothing.","operationId":"recommendation_feedback_api_recommendations__ref_id__feedback_post","parameters":[{"name":"ref_id","in":"path","required":true,"schema":{"type":"string","title":"Ref Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Recommendation Feedback Api Recommendations  Ref Id  Feedback Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/answers":{"get":{"summary":"List Answers","description":"Answer records, newest first, over the tenants the caller may read.\nPage with ``before`` = the previous page's ``next_before``.","operationId":"list_answers_api_answers_get","parameters":[{"name":"agent","in":"query","required":false,"schema":{"type":"string","default":"","title":"Agent"}},{"name":"channel","in":"query","required":false,"schema":{"type":"string","default":"","title":"Channel"}},{"name":"outcome","in":"query","required":false,"schema":{"type":"string","default":"","title":"Outcome"}},{"name":"before","in":"query","required":false,"schema":{"type":"string","default":"","title":"Before"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Answers Api Answers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/answers/{answer_id}":{"get":{"summary":"Get Answer","description":"One answer record with its votes: what was asked (redacted), what\nsearch ranked and in which band, what was withheld and why, the\nconfiguration fingerprint, and the outcome.","operationId":"get_answer_api_answers__answer_id__get","parameters":[{"name":"answer_id","in":"path","required":true,"schema":{"type":"string","title":"Answer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Answer Api Answers  Answer Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/metrics/answer-feedback":{"get":{"summary":"Answer Feedback Report","description":"Per agent and channel: answers, outcomes, votes, distinct voters and\nlabels, over the last ``days`` and the tenants the caller may read.","operationId":"answer_feedback_report_api_metrics_answer_feedback_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Answer Feedback Report Api Metrics Answer Feedback Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kb/articles":{"get":{"summary":"List Kb Articles","operationId":"list_kb_articles_api_kb_articles_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Kb Articles Api Kb Articles Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kb/articles/scribe":{"post":{"summary":"Run Scribe","description":"Run one scribe pass now (the scheduler also runs it periodically).\n\nWith a BYOLLM configured a pass means up to 5 sequential model calls —\nminutes, not milliseconds — so it runs through the job engine and this\nreturns a job id to poll. The heuristic path (no LLM) is fast and answers\ninline with the drafted article ids.","operationId":"run_scribe_api_kb_articles_scribe_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Run Scribe Api Kb Articles Scribe Post"}}}}}}},"/api/kb/articles/{article_id}/approve":{"post":{"summary":"Approve Kb Article","operationId":"approve_kb_article_api_kb_articles__article_id__approve_post","parameters":[{"name":"article_id","in":"path","required":true,"schema":{"type":"integer","title":"Article Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Approve Kb Article Api Kb Articles  Article Id  Approve Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kb/articles/{article_id}":{"patch":{"summary":"Edit Kb Article","description":"Edit a draft before approving it (scribe.edit_article): held to the\nchecks a fix meets before self-service shows it, with the diff audited.","operationId":"edit_kb_article_api_kb_articles__article_id__patch","parameters":[{"name":"article_id","in":"path","required":true,"schema":{"type":"integer","title":"Article Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KBArticlePatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Edit Kb Article Api Kb Articles  Article Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kb/articles/{article_id}/reject":{"post":{"summary":"Reject Kb Article","description":"Reject a draft. The reason is optional and goes on the audit row: the\nInbox asks for one beside Reject, as it does for an agent's held write,\nso the Scribe's author can learn why a draft was turned down.","operationId":"reject_kb_article_api_kb_articles__article_id__reject_post","parameters":[{"name":"article_id","in":"path","required":true,"schema":{"type":"integer","title":"Article Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/KBRejectBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reject Kb Article Api Kb Articles  Article Id  Reject Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/audits":{"get":{"summary":"List Case Audits","operationId":"list_case_audits_api_audits_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"max_score","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Score"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Case Audits Api Audits Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tickets/{ticket_id}/audit":{"get":{"summary":"Ticket Audit","operationId":"ticket_audit_api_tickets__ticket_id__audit_get","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","title":"Ticket Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ticket Audit Api Tickets  Ticket Id  Audit Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/audits/run":{"post":{"summary":"Run Auditor","operationId":"run_auditor_api_audits_run_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Run Auditor Api Audits Run Post"}}}}}}},"/api/reviews/queues":{"get":{"summary":"List Review Queues","description":"The review queues this caller may see: every queue in scope for a\nmanager, the queues that name them for a reviewer.","operationId":"list_review_queues_api_reviews_queues_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Review Queues Api Reviews Queues Get"}}}}}}},"/api/reviews/queues/{queue_id}":{"put":{"summary":"Put Review Queue","description":"Create or change a queue: its rubric, rules, reviewers and how many of\nthem each item needs. Every reviewer named must be an account — a typo\nwould be a reviewer no one can sign in as, and the queue would wait on\nthem for ever.","operationId":"put_review_queue_api_reviews_queues__queue_id__put","parameters":[{"name":"queue_id","in":"path","required":true,"schema":{"type":"string","title":"Queue Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Review Queue Api Reviews Queues  Queue Id  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Review Queue","operationId":"delete_review_queue_api_reviews_queues__queue_id__delete","parameters":[{"name":"queue_id","in":"path","required":true,"schema":{"type":"string","title":"Queue Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Review Queue Api Reviews Queues  Queue Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Get Review Queue","description":"One queue with what its reviews add up to (reviews.stats). A reviewer\ngets the queue's rubric and their own progress, not the results: a\nrunning tally would steer the scores still to be given.","operationId":"get_review_queue_api_reviews_queues__queue_id__get","parameters":[{"name":"queue_id","in":"path","required":true,"schema":{"type":"string","title":"Queue Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Review Queue Api Reviews Queues  Queue Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reviews/queues/{queue_id}/items":{"get":{"summary":"List Review Items","operationId":"list_review_items_api_reviews_queues__queue_id__items_get","parameters":[{"name":"queue_id","in":"path","required":true,"schema":{"type":"string","title":"Queue Id"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"","title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Review Items Api Reviews Queues  Queue Id  Items Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Add Review Item","description":"Put something in a queue by hand: a conversation (or two, for a\npairwise queue), a ticket, a session, or outputs given inline. Each\nsubject must be one this caller could open — a queue is not a way to\nhand a reviewer another tenant's conversation.","operationId":"add_review_item_api_reviews_queues__queue_id__items_post","parameters":[{"name":"queue_id","in":"path","required":true,"schema":{"type":"string","title":"Queue Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewItemBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Add Review Item Api Reviews Queues  Queue Id  Items Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reviews/queues/{queue_id}/sweep":{"post":{"summary":"Sweep Review Queue","description":"Run the queue's rules now rather than at the next minute's sweep.","operationId":"sweep_review_queue_api_reviews_queues__queue_id__sweep_post","parameters":[{"name":"queue_id","in":"path","required":true,"schema":{"type":"string","title":"Queue Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Sweep Review Queue Api Reviews Queues  Queue Id  Sweep Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reviews/queues/{queue_id}/claim":{"post":{"summary":"Claim Review Item","description":"The caller's next item, claimed for them (or the one they hold), with\nwhat is under review — or `item: null` when the queue has nothing left\nfor them.","operationId":"claim_review_item_api_reviews_queues__queue_id__claim_post","parameters":[{"name":"queue_id","in":"path","required":true,"schema":{"type":"string","title":"Queue Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Claim Review Item Api Reviews Queues  Queue Id  Claim Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reviews/items/{item_id}":{"get":{"summary":"Get Review Item","description":"One item, what is under review and its annotations: all of them for a\nmanager, only the caller's own for a reviewer — so no one scores with\nsomeone else's scores in front of them.","operationId":"get_review_item_api_reviews_items__item_id__get","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Review Item Api Reviews Items  Item Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reviews/items/{item_id}/release":{"post":{"summary":"Release Review Item","operationId":"release_review_item_api_reviews_items__item_id__release_post","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Release Review Item Api Reviews Items  Item Id  Release Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reviews/items/{item_id}/annotations":{"post":{"summary":"Annotate Review Item","description":"Score an item the caller holds the claim on. A corrected answer to a\nconversation becomes a case in the queue's dataset; a corrected routing\nof a ticket is saved on the ticket as a person's correction (so triage\nevaluation takes it as ground truth) — which needs tickets.write — and,\nwhen the queue names a dataset, as a triage case.","operationId":"annotate_review_item_api_reviews_items__item_id__annotations_post","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","title":"Item Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewAnnotationBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Annotate Review Item Api Reviews Items  Item Id  Annotations Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/audits/{ticket_id}":{"put":{"summary":"Override Case Audit","description":"A person's corrected score for Liya Review's score of a case,\nand why. The machine's score stays as it was; each override is a new\nrow, and the latest is the case's effective score.","operationId":"override_case_audit_api_audits__ticket_id__put","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","title":"Ticket Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditOverrideBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Override Case Audit Api Audits  Ticket Id  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/audits/{ticket_id}/overrides":{"get":{"summary":"Case Audit Overrides","operationId":"case_audit_overrides_api_audits__ticket_id__overrides_get","parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","title":"Ticket Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Case Audit Overrides Api Audits  Ticket Id  Overrides Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/audits/agreement":{"get":{"summary":"Case Audit Agreement","description":"How often people's overrides agree with the auditor (pass at 60 or\nnot): percent agreement and Cohen's kappa over each overridden case.","operationId":"case_audit_agreement_api_audits_agreement_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Case Audit Agreement Api Audits Agreement Get"}}}}}}},"/api/llm-gateway/meta":{"get":{"summary":"Llmp Meta","operationId":"llmp_meta_api_llm_gateway_meta_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Llmp Meta Api Llm Gateway Meta Get"}}}}}}},"/api/llm-gateway/keys":{"get":{"summary":"Llmp Keys","operationId":"llmp_keys_api_llm_gateway_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Llmp Keys Api Llm Gateway Keys Get"}}}}}}},"/api/llm-gateway/catalog":{"get":{"summary":"Llmp Catalog","operationId":"llmp_catalog_api_llm_gateway_catalog_get","parameters":[{"name":"type","in":"query","required":false,"schema":{"type":"string","default":"","title":"Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Llmp Catalog Api Llm Gateway Catalog Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/llm-gateway/providers":{"get":{"summary":"Llmp List","operationId":"llmp_list_api_llm_gateway_providers_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"type","in":"query","required":false,"schema":{"type":"string","default":"","title":"Type"}},{"name":"model","in":"query","required":false,"schema":{"type":"string","default":"","title":"Model"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"","title":"Status"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Per Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Llmp List Api Llm Gateway Providers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Llmp Create","operationId":"llmp_create_api_llm_gateway_providers_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Llmp Create Api Llm Gateway Providers Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/llm-gateway/providers/test":{"post":{"summary":"Llmp Test Draft","operationId":"llmp_test_draft_api_llm_gateway_providers_test_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Llmp Test Draft Api Llm Gateway Providers Test Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/llm-gateway/providers/order":{"put":{"summary":"Llmp Order","operationId":"llmp_order_api_llm_gateway_providers_order_put","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Llmp Order Api Llm Gateway Providers Order Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/llm-gateway/providers/{pid}":{"get":{"summary":"Llmp Get","operationId":"llmp_get_api_llm_gateway_providers__pid__get","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Llmp Get Api Llm Gateway Providers  Pid  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Llmp Update","operationId":"llmp_update_api_llm_gateway_providers__pid__put","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Llmp Update Api Llm Gateway Providers  Pid  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Llmp Delete","operationId":"llmp_delete_api_llm_gateway_providers__pid__delete","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Llmp Delete Api Llm Gateway Providers  Pid  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/llm-gateway/providers/{pid}/test":{"post":{"summary":"Llmp Test Saved","operationId":"llmp_test_saved_api_llm_gateway_providers__pid__test_post","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Llmp Test Saved Api Llm Gateway Providers  Pid  Test Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/llm-gateway/providers/{pid}/{verb}":{"post":{"summary":"Llmp Toggle","operationId":"llmp_toggle_api_llm_gateway_providers__pid___verb__post","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}},{"name":"verb","in":"path","required":true,"schema":{"type":"string","title":"Verb"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Llmp Toggle Api Llm Gateway Providers  Pid   Verb  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/alerts/metrics":{"get":{"summary":"Alert Rule Metrics","description":"What a rule may say: metrics (unit, bad direction, source), scopes,\nmodes, no-data behaviours and the limits the editor enforces.","operationId":"alert_rule_metrics_api_alerts_metrics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Alert Rule Metrics Api Alerts Metrics Get"}}}}}}},"/api/alerts/rules":{"get":{"summary":"List Alert Rules","operationId":"list_alert_rules_api_alerts_rules_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Alert Rules Api Alerts Rules Get"}}}}}},"post":{"summary":"Create Alert Rule","operationId":"create_alert_rule_api_alerts_rules_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Alert Rule Api Alerts Rules Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/alerts/rules/preview":{"post":{"summary":"Preview Alert Rule","description":"Replay a draft rule (body.rule, or the body itself) over stored\nhistory: the values it would have read at each step and the firings it\nwould have written. Stores and sends nothing.","operationId":"preview_alert_rule_api_alerts_rules_preview_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Preview Alert Rule Api Alerts Rules Preview Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/alerts/rules/{rule_id}":{"get":{"summary":"Get Alert Rule","operationId":"get_alert_rule_api_alerts_rules__rule_id__get","parameters":[{"name":"rule_id","in":"path","required":true,"schema":{"type":"string","title":"Rule Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Alert Rule Api Alerts Rules  Rule Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Replace Alert Rule","operationId":"replace_alert_rule_api_alerts_rules__rule_id__put","parameters":[{"name":"rule_id","in":"path","required":true,"schema":{"type":"string","title":"Rule Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Replace Alert Rule Api Alerts Rules  Rule Id  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Alert Rule","operationId":"delete_alert_rule_api_alerts_rules__rule_id__delete","parameters":[{"name":"rule_id","in":"path","required":true,"schema":{"type":"string","title":"Rule Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Alert Rule Api Alerts Rules  Rule Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/alerts/rules/{rule_id}/evaluate":{"post":{"summary":"Evaluate Alert Rule","description":"Judge one rule now, as the scheduler would: a firing is recorded and\nsent like any other. A disabled rule is refused, not judged.","operationId":"evaluate_alert_rule_api_alerts_rules__rule_id__evaluate_post","parameters":[{"name":"rule_id","in":"path","required":true,"schema":{"type":"string","title":"Rule Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Evaluate Alert Rule Api Alerts Rules  Rule Id  Evaluate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/alerts/firings":{"get":{"summary":"List Alert Firings","operationId":"list_alert_firings_api_alerts_firings_get","parameters":[{"name":"rule_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Rule Id"}},{"name":"level","in":"query","required":false,"schema":{"type":"string","default":"","title":"Level"}},{"name":"unacknowledged","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Unacknowledged"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Alert Firings Api Alerts Firings Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/alerts/firings/{firing_id}":{"get":{"summary":"Get Alert Firing","operationId":"get_alert_firing_api_alerts_firings__firing_id__get","parameters":[{"name":"firing_id","in":"path","required":true,"schema":{"type":"integer","title":"Firing Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Alert Firing Api Alerts Firings  Firing Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/alerts/firings/{firing_id}/ack":{"post":{"summary":"Ack Alert Firing","operationId":"ack_alert_firing_api_alerts_firings__firing_id__ack_post","parameters":[{"name":"firing_id","in":"path","required":true,"schema":{"type":"integer","title":"Firing Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ack Alert Firing Api Alerts Firings  Firing Id  Ack Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/alerts/inbox":{"get":{"summary":"Alerts Inbox","description":"Every alert in one list — rule firings, the Sentinel's and the KB's\ntrend alerts, and the network graph's — newest first. Trend alerts are\nlisted to a caller who may read them (tickets.read), as their own route\ndoes.","operationId":"alerts_inbox_api_alerts_inbox_get","parameters":[{"name":"unacknowledged","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Unacknowledged"}},{"name":"source","in":"query","required":false,"schema":{"type":"string","default":"","title":"Source"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Alerts Inbox Api Alerts Inbox Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/alerts/inbox/ack":{"post":{"summary":"Ack Inbox Alert","description":"Acknowledge any inbox alert by source and id, with the permission\nits own route asks: governance.write for a rule firing or a network\nalert, tickets.write for a trend alert.","operationId":"ack_inbox_alert_api_alerts_inbox_ack_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboxAckBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Ack Inbox Alert Api Alerts Inbox Ack Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/alerts":{"get":{"summary":"List Trend Alerts","operationId":"list_trend_alerts_api_alerts_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"unacknowledged","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Unacknowledged"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Trend Alerts Api Alerts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/alerts/{alert_id}/ack":{"post":{"summary":"Ack Trend Alert","operationId":"ack_trend_alert_api_alerts__alert_id__ack_post","parameters":[{"name":"alert_id","in":"path","required":true,"schema":{"type":"integer","title":"Alert Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ack Trend Alert Api Alerts  Alert Id  Ack Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/alerts/scan":{"post":{"summary":"Run Sentinel","operationId":"run_sentinel_api_alerts_scan_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Run Sentinel Api Alerts Scan Post"}}}}}}},"/api/memory-distill/policy":{"get":{"summary":"Get Memory Distill Policy","operationId":"get_memory_distill_policy_api_memory_distill_policy_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Memory Distill Policy Api Memory Distill Policy Get"}}}}}},"put":{"summary":"Put Memory Distill Policy","operationId":"put_memory_distill_policy_api_memory_distill_policy_put","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Put Memory Distill Policy Api Memory Distill Policy Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/memory-distill/{conversation_id}":{"post":{"summary":"Run Memory Distill","description":"Distill one conversation now rather than when the scheduler reaches\nit. Its tenant's operators only: a conversation of another tenant reads\nas not found, as it does on the transcript routes. One already distilled\nis refused (409) unless `force` — a rerun costs a model call, and what\nit finds again is merged away as duplicates of the rows already there.","operationId":"run_memory_distill_api_memory_distill__conversation_id__post","parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","title":"Conversation Id"}},{"name":"force","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Force"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Run Memory Distill Api Memory Distill  Conversation Id  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/memory-review":{"get":{"summary":"List Memory Review","description":"The quarantine queue. Values are what a requester said, so they are\nshown only to a caller who may read transcript content; the rest see\nthe stamps — scope, provenance, why it waits — with the value withheld.","operationId":"list_memory_review_api_memory_review_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope"}},{"name":"origin","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Memory Review Api Memory Review Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/memory-review/{memory_id}/approve":{"post":{"summary":"Approve Memory","operationId":"approve_memory_api_memory_review__memory_id__approve_post","parameters":[{"name":"memory_id","in":"path","required":true,"schema":{"type":"integer","title":"Memory Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Approve Memory Api Memory Review  Memory Id  Approve Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/memory-review/{memory_id}/reject":{"post":{"summary":"Reject Memory","operationId":"reject_memory_api_memory_review__memory_id__reject_post","parameters":[{"name":"memory_id","in":"path","required":true,"schema":{"type":"integer","title":"Memory Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/MemoryReviewBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reject Memory Api Memory Review  Memory Id  Reject Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/memory-recall/policy":{"get":{"summary":"Get Memory Recall Policy","description":"The policy, and `recall_horizon`: how many of the newest active rows\nof an agent's scopes one recall ranks (memory.RECALL_CANDIDATES). The\nembeddings are sealed, so ranking happens here rather than in the\ndatabase, and an older row is not recalled however close it is.","operationId":"get_memory_recall_policy_api_memory_recall_policy_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Memory Recall Policy Api Memory Recall Policy Get"}}}}}},"put":{"summary":"Put Memory Recall Policy","operationId":"put_memory_recall_policy_api_memory_recall_policy_put","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Put Memory Recall Policy Api Memory Recall Policy Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/memory-recall/preview":{"post":{"summary":"Preview Memory Recall","description":"What `agent` would be given for `query` about `subject`: the ranked\nhits and the block, exactly as the hook would build them, with nothing\nsent anywhere. The caller's tenant only, and the words only to a caller\nwho may read transcript content — they are what people said.","operationId":"preview_memory_recall_api_memory_recall_preview_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemoryRecallPreviewBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Preview Memory Recall Api Memory Recall Preview Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/memory":{"post":{"summary":"Ingest Memory","description":"Give an agent a long-term memory by hand: a fact about a person, a\nprocedure of its own, a note for the whole workspace.\n\nGated three ways before anything is written: Cedar's `update` on the\nagent (what an agent is told is part of what it is), the recall policy's\nwrite scopes for it, and the caller's tenant. Quarantined — pending\nreview, never recalled — unless the caller asks for `trusted` AND holds\ngovernance.write (the grant that approves the review queue), and even\nthen when the guardrails would change the text.","operationId":"ingest_memory_api_memory_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemoryIngestBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Ingest Memory Api Memory Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/memory/{scope}":{"get":{"summary":"Read Memory","operationId":"read_memory_api_memory__scope__get","parameters":[{"name":"scope","in":"path","required":true,"schema":{"type":"string","title":"Scope"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Read Memory Api Memory  Scope  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Memory Scope","description":"Clear a scope — a ticket's working context, the deflection log.\nAudited even when it was already empty: the attempt is the record.","operationId":"delete_memory_scope_api_memory__scope__delete","parameters":[{"name":"scope","in":"path","required":true,"schema":{"type":"string","title":"Scope"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Memory Scope Api Memory  Scope  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/memory/item/{memory_id}":{"delete":{"summary":"Delete Memory Item","operationId":"delete_memory_item_api_memory_item__memory_id__delete","parameters":[{"name":"memory_id","in":"path","required":true,"schema":{"type":"integer","title":"Memory Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Memory Item Api Memory Item  Memory Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/memory/{scope}/{key}":{"put":{"summary":"Put Memory","description":"Write or replace one keyed entry by hand — to correct what an agent\nwill pick up next, or to give it context it should have. Redacted and\nsealed like any agent write, and marked as a person's (trust 'human',\norigin the caller) so no agent mistakes it for its own conclusion.","operationId":"put_memory_api_memory__scope___key__put","parameters":[{"name":"scope","in":"path","required":true,"schema":{"type":"string","title":"Scope"}},{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemoryPutBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Memory Api Memory  Scope   Key  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Memory Key","operationId":"delete_memory_key_api_memory__scope___key__delete","parameters":[{"name":"scope","in":"path","required":true,"schema":{"type":"string","title":"Scope"}},{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Memory Key Api Memory  Scope   Key  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/gateway/agents":{"get":{"summary":"Gateway Agents","description":"ADP's ListAgents: narrowed on the server by an AIP-160 filter (name,\ndisplay_name, description, created_at, updated_at, model, state, kind,\nstage, enabled; tags.<key> = value exactly, reading a tag as Cedar and\nthe cost report do — last value of a key, a bare tag `true` —\ntags:<key> for has-key, and tag = \"k=v\" for one whole tag as stored;\nupdated_at counts a model rebind), ordered by order_by (name, display_name\nor created_at, asc/desc), paged by page_size (0-1000) with signed keyset\ntokens bound to the query and the caller. No parameters is the whole\nroster in its own order, as before, plus next_page_token and total_size.\n\nThe rows the caller may not `list` (Cedar's registry verb, decided with\nthe `read` it refines) are dropped BEFORE the filter, the page and the\ncount: a filter that matched a hidden agent, or a total that counted\none, would say it exists to someone a policy hides it from.","operationId":"gateway_agents_api_gateway_agents_get","parameters":[{"name":"filter","in":"query","required":false,"schema":{"type":"string","default":"","title":"Filter"}},{"name":"order_by","in":"query","required":false,"schema":{"type":"string","default":"","title":"Order By"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Page Size"}},{"name":"page_token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Page Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Gateway Agents Api Gateway Agents Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/gateway/agents/{agent_id}":{"get":{"summary":"Gateway Agent","description":"One agent's whole record — ADP's GetAgent.\n\nThe roster row (built by the same code as the list, so the two cannot\ndisagree) plus what the console otherwise fetched aspect by aspect: its\ndefinition, its runtime when TicketIQ runs it, its containment state and\nits metadata. Unknown is a 404 before any policy check, as the per-aspect\nroutes do; a Cedar refusal of `get` — the registry verb, decided with the\n`read` it refines — is a 403 and is audited by the gate.\nNothing secret is on it: public_agent already drops the token hash, and\ncredentials appear only as a count.\n\nIts row version (ADP's Agent.version) rides on it as `version`, and as\nthe ETag header and `etag`, W/\"v<n>\": what PUT /gateway/agents/{id},\n/agents/{key} and /agents/{key}/runtime take back as If-Match.\n\nThat tag validates the AGENT ROW — what those If-Match routes write, and\nwhat else counts a version (agentgw): registry fields, binding, runtime,\ncontainment, credentials. It is not a validator of this whole body. The\ndefinition beside it (`spec`: instructions, recording, card, telemetry)\nhas its own tag, agentspec.etag, on GET /agents/{key}/spec, and moves\nwithout this one — except a registered agent's instructions, which are\nalso its row's prompt. Nor does the lifecycle's observed state move it.\nSo two answers under one tag can differ there, and no route answers a\nconditional GET on it (no 304): a client holding this body checks the\ndefinition by its own tag. Kept as the row's rather than a combination\nof the two so the header can be sent straight back as If-Match.","operationId":"gateway_agent_api_gateway_agents__agent_id__get","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Gateway Agent Api Gateway Agents  Agent Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Put Gateway Agent","description":"CreateAgent, or an edit. With an update_mask it is UpdateAgent,\nexactly as PATCH (_update_agent_masked; never a create). Without one it\nmerges by presence as it always has — and an edit of an agent that\nexists says it is deprecated (Deprecation header): PATCH with a mask is\nthe standard update. A create is not; PUT is how an agent is made.","operationId":"put_gateway_agent_api_gateway_agents__agent_id__put","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GatewayAgentBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Gateway Agent Api Gateway Agents  Agent Id  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Patch Gateway Agent","description":"ADP's UpdateAgent (AIP-134). `update_mask` — in the body (a list, or\none comma-separated string) or as the query parameter — names the paths\nto write: display_name, description, tags, enabled, prompt,\nexchange_only, and a managed agent's runtime as managed.<field>\n(managed.max_iterations, managed.mcp_servers, managed.limits.<cap>, ...).\nEach named path is written from the body — reset when the body leaves\nit out — and everything else is kept, whatever else the body sends. A\nwildcard, the whole runtime (`managed`), an unknown path or an immutable\none (runtime, kind, id, uid) is a 400; an unknown id a 404, since an\nupdate never creates.\n\nGated as PUT's edit is — agents.update, Cedar `update` on the agent as\nstored and as it would land, the guardrail-escape and run-as weakening\ngates, the publish posture gate on a runtime change — and If-Match/412.\nThe registry row and the runtime are written in one database\ntransaction: both land, or neither. Audited with the mask.","operationId":"patch_gateway_agent_api_gateway_agents__agent_id__patch","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"update_mask","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Update Mask"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Patch Gateway Agent Api Gateway Agents  Agent Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Gateway Agent","description":"Delete an agent and what is its alone. `dry_run` answers what the\ndelete would touch and changes nothing (ServiceNow's dependency view,\nEntra Agent ID's pre-delete check). A delete that would leave policies\nnaming the agent, or other agents' workflows calling it, is a 409 that\nlists them unless `force`; forced, the permits naming it are switched\noff (orphans_disabled) and the rest are left as they fail closed.","operationId":"delete_gateway_agent_api_gateway_agents__agent_id__delete","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Dry Run"}},{"name":"force","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Force"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ReasonBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Gateway Agent Api Gateway Agents  Agent Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/transcripts":{"get":{"summary":"Agent Transcripts","description":"An agent's conversations — ADP's ListTranscripts.\n\n`page_size` (1-100, default 50; -1 for every one), `page_token` (the last\nanswer's `next_page_token`), `order_by` (start_time, duration,\nturn_count, total_tokens or cost, asc/desc; default start_time desc),\n`filter` (AIP-160 over start_time, status, has_errors, source,\nend_user_id) and `q`, which searches ids, titles and — with\ntranscripts.content.read — what was said (see transcripts.list_page).\nThose are 400s when refused; a bad since/until/status stays a 422.\n\n`limit` alone is the older first-N list, answered exactly as before. It\nis not a page size: mixed with the paging parameters it is refused\nrather than guessed at. `stats` is the agent's exact count either way;\nthere is no total_size.\n\nAn unknown agent is a 404 before anything else is asked (see\n_transcript_agent): a deleted agent's history lists only for an audit\nreader, marked `retired`. A live agent lists its own incarnation's\nconversations only — never those of an earlier agent that held the key\n(transcripts.predecessor). A list that answered is audited as\ntranscript.list — who looked at which agent's conversations, and how\nmany they saw; a Cedar refusal is already policy.denied.\n\nRBAC transcripts.list (IMPLIED_BY agents.read), then Cedar `list` on the\nagent's transcripts as a whole — Transcript::\"<key>/*\", a child of the\nagent, decided with the `read` it refines (policy.REFINES) — so a policy\ncan keep someone from the conversation list and leave the agent\nreadable, as ADP's dataplane_adp_transcript_list does.","operationId":"agent_transcripts_api_agents__key__transcripts_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},{"name":"user","in":"query","required":false,"schema":{"type":"string","default":"","title":"User"}},{"name":"since","in":"query","required":false,"schema":{"type":"string","default":"","title":"Since"}},{"name":"until","in":"query","required":false,"schema":{"type":"string","default":"","title":"Until"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"","title":"Status"}},{"name":"source","in":"query","required":false,"schema":{"type":"string","default":"","title":"Source"}},{"name":"has_errors","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Errors"}},{"name":"filter","in":"query","required":false,"schema":{"type":"string","default":"","title":"Filter"}},{"name":"order_by","in":"query","required":false,"schema":{"type":"string","default":"","title":"Order By"}},{"name":"page_size","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Page Size"}},{"name":"page_token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Page Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Transcripts Api Agents  Key  Transcripts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/transcripts/{conv_id}":{"get":{"summary":"Transcript Detail","operationId":"transcript_detail_api_transcripts__conv_id__get","parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"string","title":"Conv Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Transcript Detail Api Transcripts  Conv Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Transcript","operationId":"delete_transcript_api_transcripts__conv_id__delete","parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"string","title":"Conv Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Transcript Api Transcripts  Conv Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/transcripts/{conv_id}":{"get":{"summary":"Agent Transcript Detail","description":"One conversation addressed under its agent, as ADP's GetTranscript\nnames it. The same read as GET /transcripts/{id}, and a conversation of\nanother agent is the same 404 as a missing one — the path is not a way\nto learn which agent an id belongs to.","operationId":"agent_transcript_detail_api_agents__key__transcripts__conv_id__get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"conv_id","in":"path","required":true,"schema":{"type":"string","title":"Conv Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Transcript Detail Api Agents  Key  Transcripts  Conv Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/traces":{"get":{"summary":"Agent Traces","description":"An agent's traces from the span store, newest first — its managed\nruns and what it exported over OTLP: per trace its first span, duration,\nspan and error counts, model tokens, and the conversation, session, end\nuser and environment it was tagged with. Narrowed by any of those,\n`status` (ok|error) and since/until; paged by `before` (the last page's\n`next_before`). `environments` lists the tags there are to filter by.\nWith no `since`, and no conversation or session to narrow to, the list\ncovers the last spans.DEFAULT_WINDOW_DAYS (the `since` it answers with).\n\nGated as the agent's transcripts are (_trace_agent), narrowed to the\ncaller's tenants, and audited as transcript.trace.list — the filters by\nname only, never a value: an end user's id is a person.","operationId":"agent_traces_api_agents__key__traces_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"conversation","in":"query","required":false,"schema":{"type":"string","default":"","title":"Conversation"}},{"name":"session","in":"query","required":false,"schema":{"type":"string","default":"","title":"Session"}},{"name":"user","in":"query","required":false,"schema":{"type":"string","default":"","title":"User"}},{"name":"environment","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Environment"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"","title":"Status"}},{"name":"since","in":"query","required":false,"schema":{"type":"string","default":"","title":"Since"}},{"name":"until","in":"query","required":false,"schema":{"type":"string","default":"","title":"Until"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"before","in":"query","required":false,"schema":{"type":"string","default":"","title":"Before"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Traces Api Agents  Key  Traces Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/trace-sessions":{"get":{"summary":"Agent Trace Sessions","description":"An agent's traces grouped into sessions — the conversation they fed,\nelse the session.id they named, else each trace alone — with who each\nwas for and the environment it ran in (ADP/Langfuse sessions). Gated\nand audited as the trace list is. The same default window as the trace\nlist, answered as `since`; `environments` lists the tags to filter by, so\nthe Sessions view needs no trace list (and no second audit row) to paint.","operationId":"agent_trace_sessions_api_agents__key__trace_sessions_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"user","in":"query","required":false,"schema":{"type":"string","default":"","title":"User"}},{"name":"environment","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Environment"}},{"name":"since","in":"query","required":false,"schema":{"type":"string","default":"","title":"Since"}},{"name":"until","in":"query","required":false,"schema":{"type":"string","default":"","title":"Until"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Trace Sessions Api Agents  Key  Trace Sessions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/traces/{trace_id}":{"get":{"summary":"Agent Trace","description":"One trace as a span tree (parents before children, each span's\n`depth`), addressed under an agent with a span in it.\n\nA trace can cross agents — a run that called another over A2A, an\nexporter that wrote into a trace it was handed — so it is read whole,\nless every span of an agent this caller may not read (`hidden_spans`\ncounts them) or of another tenant. Arguments, results and retrieval\ntext come with transcripts.content.read only; a guardrail span's policy\nnames with governance.read only, as a playground step's do. A trace\nthis agent has no span in is the same 404 as one that does not exist.","operationId":"agent_trace_api_agents__key__traces__trace_id__get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"trace_id","in":"path","required":true,"schema":{"type":"string","title":"Trace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Trace Api Agents  Key  Traces  Trace Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/traces/{trace_id}":{"get":{"summary":"Trace Detail","description":"One trace by its id alone — what an audit row, a playground run or a\ncaller's own tracing hands over, without knowing which agent wrote it.\n\nThe same tree agent_trace returns, narrowed the same way: spans of an\nagent this caller may not read, or of another tenant, are left out and\ncounted in `hidden_spans`. A trace with no span this caller may see is\nthe same 404 as one that does not exist — a 403 would confirm the id,\nand so which requests some agent served.","operationId":"trace_detail_api_traces__trace_id__get","parameters":[{"name":"trace_id","in":"path","required":true,"schema":{"type":"string","title":"Trace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Trace Detail Api Traces  Trace Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/transcripts/{conv_id}/trace":{"get":{"summary":"Transcript Trace","description":"A conversation's waterfall: the traces its spans sit in (`traces`,\noldest first — one per request that wrote to it) and one of them as a\nspan tree, `trace` if asked for, else the latest.\n\nGated as the conversation itself is (_read_transcript: tenant, the\nretired-agent rule, Cedar `get` on the Transcript) and then `read` on\nits agent, as every trace route is — each refused as the same 404 a\nmissing id is. A conversation with no spans kept (recording off, or\nolder than the span store's window) answers an empty tree, not an\nerror: the conversation is there, its timing is not.","operationId":"transcript_trace_api_transcripts__conv_id__trace_get","parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"string","title":"Conv Id"}},{"name":"trace","in":"query","required":false,"schema":{"type":"string","default":"","title":"Trace"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Transcript Trace Api Transcripts  Conv Id  Trace Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/transcripts/bulk-delete":{"post":{"summary":"Bulk Delete Transcripts","description":"Erase every conversation a filter matches — or, with dry_run, count them.\n\nThe same two Cedar checks as the single delete, per agent: an agent the\ncaller may not `read` is left out of the match entirely (as a list would\nhide it), and one they may read but not `configure` refuses the whole\nrequest with a 403 naming it — a bulk erase that quietly skipped some\nagents would report a clean result that is not. A retired agent's\nconversations match only for an audit reader, as they list only for one\n(_transcript_agents): a dry run would otherwise be the way to learn a\ndeleted key and how much it said. Refused under the audit\nlegal hold: the response counts the held conversations instead. One\naudit row per real run, with the filter and the count, not one per\nconversation.","operationId":"bulk_delete_transcripts_api_transcripts_bulk_delete_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscriptBulkDeleteBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Bulk Delete Transcripts Api Transcripts Bulk Delete Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/evals/builtins":{"get":{"summary":"Eval Builtins","description":"The built-in evaluators and the params each takes, and the ready-made\nLLM judges (an llm_judge evaluator's params.judge, or a name in a run).","operationId":"eval_builtins_api_evals_builtins_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Eval Builtins Api Evals Builtins Get"}}}}}}},"/api/evals/evaluators":{"get":{"summary":"List Eval Evaluators","description":"Stored evaluators — every one, or with `agent` those that apply to\nit (its own and the fleet's). One defined for an agent this caller may\nnot `read` is left out, as the agent is from every list.","operationId":"list_eval_evaluators_api_evals_evaluators_get","parameters":[{"name":"agent","in":"query","required":false,"schema":{"type":"string","default":"","title":"Agent"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Eval Evaluators Api Evals Evaluators Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/evals/evaluators/{name}":{"get":{"summary":"Get Eval Evaluator","operationId":"get_eval_evaluator_api_evals_evaluators__name__get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Eval Evaluator Api Evals Evaluators  Name  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Put Eval Evaluator","description":"Create or replace an evaluator; every save is a new version (see\nticketiq.evaluators). An http evaluator names its HMAC key by secret\nlabel, never by value; a code one is refused unless code mode is on.","operationId":"put_eval_evaluator_api_evals_evaluators__name__put","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluatorBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Eval Evaluator Api Evals Evaluators  Name  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Eval Evaluator","description":"Delete an evaluator. Its events stay: they are the record of what it\nscored, each naming the version that scored it.","operationId":"delete_eval_evaluator_api_evals_evaluators__name__delete","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Eval Evaluator Api Evals Evaluators  Name  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/pdp-hooks":{"get":{"summary":"List Pdp Hooks","description":"Every interceptor hook that applies to the caller's tenant, in the\norder they run, with its breaker's state; and what may be registered.","operationId":"list_pdp_hooks_api_pdp_hooks_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Pdp Hooks Api Pdp Hooks Get"}}}}}}},"/api/pdp-hooks/{name}":{"get":{"summary":"Get Pdp Hook","operationId":"get_pdp_hook_api_pdp_hooks__name__get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Pdp Hook Api Pdp Hooks  Name  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Put Pdp Hook","description":"Register or replace a hook. An agent's hook is that agent's\nconfiguration (Cedar `configure` on it); a save that switches off an\nenforcing hook — disables it, makes it log-only or fail open, moves or\nrescopes it — weakens a control, and takes governance.weaken and a\n`reason`, as deleting it does.","operationId":"put_pdp_hook_api_pdp_hooks__name__put","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Pdp Hook Api Pdp Hooks  Name  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Pdp Hook","description":"Remove a hook. One that is enforcing now is a control being removed:\ngovernance.weaken and a reason, recorded with the deletion.","operationId":"delete_pdp_hook_api_pdp_hooks__name__delete","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ReasonBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Pdp Hook Api Pdp Hooks  Name  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/pdp-hooks/{name}/test":{"post":{"summary":"Test Pdp Hook","description":"Ask the hook about a sample, once: its decision (or its failure, and\nwhat that would do to a call) and its latency. Nothing is enforced and\nits breaker is not moved. governance.write, not read: it sends a signed\nrequest to the hook's endpoint.","operationId":"test_pdp_hook_api_pdp_hooks__name__test_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"default":{},"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Test Pdp Hook Api Pdp Hooks  Name  Test Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/evals/run":{"post":{"summary":"Run Evals","description":"Score conversations with evaluators and store the events.\n\ngovernance.write, because it writes the scores everyone else reads —\nand transcripts.content.read, because an evaluator reads what was said\nand an explanation can repeat it. Every conversation must be one this\ncaller could open (tenant, Cedar `read` on its agent): one that is not\nis a 404 for the whole run, before anything is scored — a run that\nquietly scored fewer conversations than it was given reads as complete.\nAudited as eval.run with the run id, the conversations and the\nevaluators, never the scores' explanations.","operationId":"run_evals_api_evals_run_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvalRunBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Run Evals Api Evals Run Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/transcripts/{conv_id}/evaluations":{"get":{"summary":"Transcript Evaluations","description":"A conversation's evaluation events: each evaluator's latest run, or\nwith `history` every run. The same 404s as reading the conversation. A\ncode or http evaluator's explanation is withheld without\ntranscripts.content.read (evaluators.view).","operationId":"transcript_evaluations_api_transcripts__conv_id__evaluations_get","parameters":[{"name":"conv_id","in":"path","required":true,"schema":{"type":"string","title":"Conv Id"}},{"name":"history","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"History"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Transcript Evaluations Api Transcripts  Conv Id  Evaluations Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/evaluations":{"get":{"summary":"Agent Evaluations","description":"An agent's evaluation scores aggregated per evaluator over a window\n(`window` 1h-90d, default 7d; or since/until as ISO times): events,\nmean score, pass rate, errors and a daily trend. Scoped to the caller's\ntenant as the conversations are; the agent's gates are the transcript\nlist's (unknown is a 404, Cedar `read`).","operationId":"agent_evaluations_api_agents__key__evaluations_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"window","in":"query","required":false,"schema":{"type":"string","default":"","title":"Window"}},{"name":"since","in":"query","required":false,"schema":{"type":"string","default":"","title":"Since"}},{"name":"until","in":"query","required":false,"schema":{"type":"string","default":"","title":"Until"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Evaluations Api Agents  Key  Evaluations Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/conversation-evals":{"get":{"summary":"Get Conversation Evals","description":"The agent's online-evaluation config (null when off) and its summary\nover `window` (1h-90d, default 7d): coverage — eligible, scored,\nfiltered, sampled out, pending, judge-capped — outcomes, pass rate, and\njudge calls this hour against the cap. The same gates as the agent's\nevaluation aggregate.","operationId":"get_conversation_evals_api_agents__key__conversation_evals_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"window","in":"query","required":false,"schema":{"type":"string","default":"","title":"Window"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Conversation Evals Api Agents  Key  Conversation Evals Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Put Conversation Evals","description":"Create or replace the agent's online-evaluation config. Audited as\nconv_eval.config.save with the config before and after.","operationId":"put_conversation_evals_api_agents__key__conversation_evals_put","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConvEvalConfigBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Conversation Evals Api Agents  Key  Conversation Evals Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Conversation Evals","description":"Turn online evaluations off for the agent. What was scored stays.","operationId":"delete_conversation_evals_api_agents__key__conversation_evals_delete","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Conversation Evals Api Agents  Key  Conversation Evals Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/conversation-evals/backfill":{"post":{"summary":"Backfill Conversation Evals","description":"Score the agent's idle conversations of the last `days` (1-30) by the\nconfig's rules — sample, filters, hourly judge cap — each at most once\nwhoever else is scoring. Bounded per call; `remaining` says how many are\nstill undecided. Audited as conv_eval.backfill.","operationId":"backfill_conversation_evals_api_agents__key__conversation_evals_backfill_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConvEvalBackfillBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Backfill Conversation Evals Api Agents  Key  Conversation Evals Backfill Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/evals/datasets":{"get":{"summary":"List Eval Datasets","description":"Every dataset the caller's tenant scope reads: its latest version's\nmetadata and how many versions it has.","operationId":"list_eval_datasets_api_evals_datasets_get","parameters":[{"name":"kind","in":"query","required":false,"schema":{"type":"string","default":"","title":"Kind"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Eval Datasets Api Evals Datasets Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Post Eval Dataset","description":"Write a dataset version: version 1 of a new dataset, or the next\nversion of one (the items replacing the latest's, or with `append`\nadded to them). Items the latest version already holds exactly write\nnothing and answer that version (`unchanged`). Every item is checked\nagainst the kind's schema, and a bad one refuses the whole write.","operationId":"post_eval_dataset_api_evals_datasets_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvalDatasetBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Post Eval Dataset Api Evals Datasets Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/evals/datasets/{name}":{"get":{"summary":"Get Eval Dataset","description":"One version (the latest by default) with its items — which need the\npermission that reads what they hold (see above) — or with `items=false`\nits metadata alone.","operationId":"get_eval_dataset_api_evals_datasets__name__get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"version","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Version"}},{"name":"items","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Items"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Eval Dataset Api Evals Datasets  Name  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/evals/datasets/{name}/versions":{"get":{"summary":"Eval Dataset Versions","operationId":"eval_dataset_versions_api_evals_datasets__name__versions_get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Eval Dataset Versions Api Evals Datasets  Name  Versions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/evals/datasets/{name}/export":{"get":{"summary":"Export Eval Dataset","description":"A version as JSON Lines, one item per line — what POST\n/evals/datasets takes back as `jsonl`. Audited: it is the dataset's\ncontents leaving the instance.","operationId":"export_eval_dataset_api_evals_datasets__name__export_get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"version","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/evals/datasets/{name}/split":{"post":{"summary":"Split Eval Dataset","description":"Mark every item calibrate or holdout with a seeded split, as the next\nversion. The same seed puts each item on the same side every time, so a\nholdout stays unseen by whoever tunes on the calibrate side.","operationId":"split_eval_dataset_api_evals_datasets__name__split_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvalSplitBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Split Eval Dataset Api Evals Datasets  Name  Split Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/evals/generate":{"post":{"summary":"Generate Agent Evals","description":"Eval cases generated from the agent's definition (ticketiq.casegen)\n— answer cases from its card and instructions, routing from its\nsubagents, tool calls from its tools' schemas, refusals from its\nguardrails and data policies — frozen as the next version of an\nagent_turn dataset, or only shown with `dry_run`. governance.read as\nwell as write: the refusal cases spell out the guardrails' terms and the\npolicies' clamps, which are the rulebook.","operationId":"generate_agent_evals_api_agents__key__evals_generate_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/EvalGenerateBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Generate Agent Evals Api Agents  Key  Evals Generate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/evals/datasets/{name}/from-transcript":{"post":{"summary":"Eval Case From Transcript","description":"Save one question of a recorded conversation as an agent_turn case —\nredacted — in the next version of `name` (created when it does not\nexist). transcripts.content.read, because it reads what was said, and\nthe conversation must be one this caller could open.","operationId":"eval_case_from_transcript_api_evals_datasets__name__from_transcript_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvalCaseBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Eval Case From Transcript Api Evals Datasets  Name  From Transcript Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/evals/datasets/{name}/from-tickets":{"post":{"summary":"Eval Cases From Tickets","description":"Terminal tickets with triage labels (the source's own, or a person's\ncorrection) in the caller's tenant scope, as triage cases in the next\nversion of `name`. A ticket already in the dataset is replaced by its\nlabels as they are now — a correction since is the better truth.","operationId":"eval_cases_from_tickets_api_evals_datasets__name__from_tickets_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvalTicketsBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Eval Cases From Tickets Api Evals Datasets  Name  From Tickets Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/evals/runs":{"post":{"summary":"Start Eval Run","description":"Run a dataset version as a background job and compare it with a\nbaseline (see ticketiq.evalrun). Everything is checked before the job\nstarts — the dataset, the agent's pinned version, the evaluators, the\nbaseline — so a refusal leaves no run behind. An agent_turn run calls\nthe agent through the playground's governed path: Cedar `invoke` on it,\nand transcripts.content.read, because its evaluators read the answers.\nA triage run replays tickets: tickets.read.","operationId":"start_eval_run_api_evals_runs_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvalOfflineRunBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Start Eval Run Api Evals Runs Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"List Eval Runs","description":"Runs newest first, without their items; each says whether it is its\ndataset's pinned baseline. A run of an agent the caller may not read is\nleft out, as the agent is from every list.","operationId":"list_eval_runs_api_evals_runs_get","parameters":[{"name":"dataset","in":"query","required":false,"schema":{"type":"string","default":"","title":"Dataset"}},{"name":"agent","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Eval Runs Api Evals Runs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/evals/runs/{run_id}":{"get":{"summary":"Get Eval Run","description":"One run with its per-item results and its comparison.","operationId":"get_eval_run_api_evals_runs__run_id__get","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Eval Run Api Evals Runs  Run Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/evals/runs/{run_id}/compare":{"get":{"summary":"Compare Eval Runs","description":"This run against another of its dataset — by id, `pinned` or\n`latest` — paired item by item, whenever it was run. Gated with the\ndrops the run was (its allowed_drop, unless one is given here, and its\nper-metric allowed_drops), so the verdict it had is the verdict again.","operationId":"compare_eval_runs_api_evals_runs__run_id__compare_get","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}},{"name":"baseline","in":"query","required":false,"schema":{"type":"string","default":"pinned","title":"Baseline"}},{"name":"allowed_drop","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Allowed Drop"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Compare Eval Runs Api Evals Runs  Run Id  Compare Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/evals/runs/{run_id}/baseline":{"post":{"summary":"Pin Eval Baseline","description":"Pin this run as its dataset's baseline (and its agent's): what a run\ncompares with when it names none, and what `--baseline pinned` gates\non. Changing an agent's gate is configuring it: Cedar `configure`.","operationId":"pin_eval_baseline_api_evals_runs__run_id__baseline_post","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Pin Eval Baseline Api Evals Runs  Run Id  Baseline Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/redteam/corpus":{"get":{"summary":"Redteam Corpus","description":"The attack corpus, transforms, vectors and targets a run is made of.","operationId":"redteam_corpus_api_redteam_corpus_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Redteam Corpus Api Redteam Corpus Get"}}}}}}},"/api/redteam/runs":{"post":{"summary":"Start Redteam Run","description":"Red-team an agent as a background job (see ticketiq.redteam).\nEverything is checked before the job starts, so a refusal leaves no run\nbehind. A guardrails run reads the agent's rules: Cedar `read` on it. An\nagent run calls the agent through the playground's governed path: Cedar\n`invoke` on it, and transcripts.content.read, since its verdicts are\nread off the agent's answers (the answers stay in the transcripts).","operationId":"start_redteam_run_api_redteam_runs_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedTeamRunBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Start Redteam Run Api Redteam Runs Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"List Redteam Runs","description":"Runs newest first, without their attempts; a run of an agent the\ncaller may not read is left out, as the agent is from every list.","operationId":"list_redteam_runs_api_redteam_runs_get","parameters":[{"name":"agent","in":"query","required":false,"schema":{"type":"string","default":"","title":"Agent"}},{"name":"target","in":"query","required":false,"schema":{"type":"string","default":"","title":"Target"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Redteam Runs Api Redteam Runs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/redteam/runs/{run_id}":{"get":{"summary":"Get Redteam Run","description":"One run with its report, attempts and comparison; `format=csv` is\nthe attempts as a spreadsheet.","operationId":"get_redteam_run_api_redteam_runs__run_id__get","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}},{"name":"format","in":"query","required":false,"schema":{"type":"string","default":"json","title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Get Redteam Run Api Redteam Runs  Run Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/redteam/runs/{run_id}/compare":{"get":{"summary":"Compare Redteam Runs","description":"This run against another of the same agent and target — by id, or\n`latest` (the newest completed run before it) — whenever it was run.","operationId":"compare_redteam_runs_api_redteam_runs__run_id__compare_get","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}},{"name":"baseline","in":"query","required":false,"schema":{"type":"string","default":"latest","title":"Baseline"}},{"name":"allowed_rise","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Allowed Rise"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Compare Redteam Runs Api Redteam Runs  Run Id  Compare Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/redteam/gate":{"get":{"summary":"Get Redteam Gate","description":"The release gate's organisation default and the agents with a policy\nof their own (only those the caller may read).","operationId":"get_redteam_gate_api_redteam_gate_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Redteam Gate Api Redteam Gate Get"}}}}}},"put":{"summary":"Put Redteam Gate","description":"Set the organisation default: whether a release needs a passing\nred-team run, and its bars. Loosening a gate that is on takes\ngovernance.weaken and a reason.","operationId":"put_redteam_gate_api_redteam_gate_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedTeamGateBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Put Redteam Gate Api Redteam Gate Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/redteam-gate":{"get":{"summary":"Get Agent Redteam Gate","description":"The gate as it holds for this agent: the policy in force and where it\ncomes from, and the verdict a release of the agent as it is configured\nnow would meet — with the run it would be judged on.","operationId":"get_agent_redteam_gate_api_agents__key__redteam_gate_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Agent Redteam Gate Api Agents  Key  Redteam Gate Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Put Agent Redteam Gate","description":"Give the agent a gate policy of its own (fields left out start from\nthe one in force), or `inherit` the default again. Cedar `configure` on\nthe agent; loosening the gate in force for it takes governance.weaken\nand a reason.","operationId":"put_agent_redteam_gate_api_agents__key__redteam_gate_put","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedTeamGateBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Agent Redteam Gate Api Agents  Key  Redteam Gate Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/simulations":{"get":{"summary":"List Agent Simulations","description":"The personas, the agent's scenario banks and its runs, newest first\n(without their per-scenario results).","operationId":"list_agent_simulations_api_agents__key__simulations_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"bank","in":"query","required":false,"schema":{"type":"string","default":"","title":"Bank"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Agent Simulations Api Agents  Key  Simulations Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Start Agent Simulation","description":"Play a scenario bank against the agent with simulated users, as a\nbackground job (see ticketiq.usersim). Every turn is one governed call\nof the agent — its guardrails, policies, budget and metering — so the\nrun is gated as an invocation of it (Cedar `invoke`), and of the\nsimulator agent when an LLM plays the user. Its scores are read off the\nagent's answers: transcripts.content.read as well. Everything is\nchecked before the job starts; a refusal leaves no run behind.","operationId":"start_agent_simulation_api_agents__key__simulations_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimRunBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Start Agent Simulation Api Agents  Key  Simulations Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/simulations/banks/{name}":{"put":{"summary":"Put Simulation Bank","description":"Save a scenario bank; every save is a new version, and a run names\nthe version it played.","operationId":"put_simulation_bank_api_agents__key__simulations_banks__name__put","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimBankBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Simulation Bank Api Agents  Key  Simulations Banks  Name  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Get Simulation Bank","operationId":"get_simulation_bank_api_agents__key__simulations_banks__name__get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Simulation Bank Api Agents  Key  Simulations Banks  Name  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Simulation Bank","description":"Delete a bank; the runs that played it keep their scores.","operationId":"delete_simulation_bank_api_agents__key__simulations_banks__name__delete","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Simulation Bank Api Agents  Key  Simulations Banks  Name  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/simulations/{run_id}":{"get":{"summary":"Get Agent Simulation","description":"One run: its summary, per-scenario scores and comparison.","operationId":"get_agent_simulation_api_agents__key__simulations__run_id__get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Agent Simulation Api Agents  Key  Simulations  Run Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/simulations/{run_id}/compare":{"get":{"summary":"Compare Agent Simulations","description":"This run against another of the same agent — by id, or `latest` (the\nnewest completed run of the same bank before it) — with the score diff.","operationId":"compare_agent_simulations_api_agents__key__simulations__run_id__compare_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}},{"name":"baseline","in":"query","required":false,"schema":{"type":"string","default":"latest","title":"Baseline"}},{"name":"allowed_drop","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Allowed Drop"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Compare Agent Simulations Api Agents  Key  Simulations  Run Id  Compare Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/playground":{"post":{"summary":"Agent Playground","description":"Run one prompt through an agent exactly as production would.\n\nDeliberately the SAME governed path as everything else — provider binding,\nguardrails, budget, metering, transcript — rather than a bypass that talks\nto the model directly. A playground that skips governance answers the wrong\nquestion: it tells you the model works, when what you need to know is\nwhether the agent as configured works.","operationId":"agent_playground_api_agents__key__playground_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaygroundBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Playground Api Agents  Key  Playground Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/playground/stream":{"post":{"summary":"Agent Playground Stream","description":"POST /agents/{key}/playground, as server-sent events while it runs.\n\nThe turn is agent_playground's, called as it is, on the same governed\npath: this only listens to it (turnlive) and says, as they happen, that\na model is working and which tool or agent was called and how that went:\nnames, kinds and timings, never a prompt, an argument or a result. The\nfinal answer comes as `delta` events while it is written, when the\nagent's output rules can judge part of it, each piece only once they\nhave passed it, and `retract` when what was shown is no longer the\nanswer (answerstream). Then `done` with exactly what POST\n/agents/{key}/playground answers (the reply as the output guardrails\nleft it), which a screen puts in place of what it typed, or `error`\nwith the status and detail it would have refused with once running. A\nturn refused before it starts is answered as the plain call answers it,\nwith that status and no stream. A comment line every 10 s keeps a long\nturn open through proxies and the CDN. A screen that goes away does not stop\nthe turn: it ends, and is kept in its session, as it would have.","operationId":"agent_playground_stream_api_agents__key__playground_stream_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaygroundBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/playground/feedback":{"post":{"summary":"Playground Feedback","description":"The person's thumbs up or down on one reply, with their words: the\nhuman oversight a deployer must be able to show (EU AI Act Article 14\nand 26), recorded on the conversation and on the audit trail, and\ncounted per agent. Only a conversation this agent had, from a chat.","operationId":"playground_feedback_api_agents__key__playground_feedback_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplyFeedbackBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Playground Feedback Api Agents  Key  Playground Feedback Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/playground/sap-confirmations/{confirmation_id}":{"post":{"summary":"Playground Sap Decide","description":"The sender's Confirm or Cancel of an SAP call the agent proposed in\nthe playground: decided as them — only the person it was proposed for,\nonce (sapconfirm.decide) — and, confirmed, run as the fixed call it was\n(sapconfirm.execute). The agent then answers from what SAP returned with\nno tools, so it cannot call SAP again from here; SAP's own result is\nhanded back beside its words. Every answer is an audit row, refusals too.","operationId":"playground_sap_decide_api_agents__key__playground_sap_confirmations__confirmation_id__post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"confirmation_id","in":"path","required":true,"schema":{"type":"string","title":"Confirmation Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/PlaygroundSapDecision"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Playground Sap Decide Api Agents  Key  Playground Sap Confirmations  Confirmation Id  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/playground/files":{"post":{"summary":"Upload Playground File","description":"Keep one file for a Playground message (multipart, field `file`):\nchecked (its bytes must be the type its name says, never a program),\nread (a document's text, under extract.py's bounded extraction) and\nstored for its uploader only. Refusals say what is wrong with the file:\n413 too large, 415 a type that is not accepted, 422 one with nothing\nthe agent could read.\n\nThe form is read only after the gates: a caller Cedar keeps from the\nagent is refused before a byte of their upload is parsed.","operationId":"upload_playground_file_api_agents__key__playground_files_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Upload Playground File Api Agents  Key  Playground Files Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/playground/files/{file_id}":{"get":{"summary":"Playground File","description":"One of the caller's files: 404 when it is not theirs (or not there),\n410 when it has expired.","operationId":"playground_file_api_agents__key__playground_files__file_id__get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"file_id","in":"path","required":true,"schema":{"type":"string","title":"File Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Playground File Api Agents  Key  Playground Files  File Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Playground File","description":"A file taken off a message before it was sent. Idempotent.","operationId":"delete_playground_file_api_agents__key__playground_files__file_id__delete","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"file_id","in":"path","required":true,"schema":{"type":"string","title":"File Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Playground File Api Agents  Key  Playground Files  File Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/playground/files/{file_id}/content":{"get":{"summary":"Playground File Content","description":"The file's bytes, back to its uploader. An image is served as the\nformat its bytes are (chatfiles.check proved it), for its preview;\nanything else only as a download — never under a type a browser would\nrender or run. Sandboxed and never cached either way.","operationId":"playground_file_content_api_agents__key__playground_files__file_id__content_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"file_id","in":"path","required":true,"schema":{"type":"string","title":"File Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/playground/compare":{"post":{"summary":"Agent Playground Compare","description":"One prompt asked of the agent under 2 to 4 variants, side by side:\neach a system half and/or a model (evalrun.variant), each a full\ngoverned run with its own transcript, usage and latency — so an operator\nsees what an edit would change before making it, rather than comparing\ntwo chats from memory.\n\nEvery variant is checked before any runs: a compare whose third column\nis refused must not have spent the first two. The columns run in order,\neach through the same door (Cedar `invoke`, the channel, the kill\nswitch), and a refusal of one is that column's answer, not the\ncompare's.","operationId":"agent_playground_compare_api_agents__key__playground_compare_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaygroundCompareBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Playground Compare Api Agents  Key  Playground Compare Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/playground/replay":{"post":{"summary":"Agent Playground Replay","description":"Ask one question of a past conversation again — as it was, or with\nedits to the question, the system half or the model — with the turns\nbefore it as the history, and return the new answer beside the old.\n\nReplay reads the conversation first, exactly as opening it would\n(_read_transcript: the tenant, the agent's incarnation, Cedar `get` on\nthe Transcript — another agent's or a hidden conversation is a 404), and\nneeds transcripts.content.read: it re-sends the words. What it re-sends\nis what the transcript kept — the GUARDED prompt, never the raw one — and\na conversation recorded as metadata only kept no words to replay. The\nreplay is a new governed run with its own transcript; the original is\nnever touched.","operationId":"agent_playground_replay_api_agents__key__playground_replay_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaygroundReplayBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Playground Replay Api Agents  Key  Playground Replay Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/playground/context":{"get":{"summary":"Playground Context","description":"Everything that will shape the next playground run, in one place: the\nbinding, the definition, and every governance control that applies. The\nside panel exists so an operator never has to ask \"why did it answer\nlike that\" by opening five pages.","operationId":"playground_context_api_agents__key__playground_context_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Playground Context Api Agents  Key  Playground Context Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/context":{"get":{"summary":"Agent Context","description":"Everything that shapes what this agent says: its model and\ninstructions, the governance around it, the knowledge it draws on and\nthe parameters of that search, and the channels that reach it.","operationId":"agent_context_api_agents__key__context_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Context Api Agents  Key  Context Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/context/search":{"post":{"summary":"Agent Context Search","description":"What the agent would retrieve for `query`, with the band each result\nfalls in — the way to check a threshold against a real question.","operationId":"agent_context_search_api_agents__key__context_search_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContextSearchBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Context Search Api Agents  Key  Context Search Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kb/eval":{"get":{"summary":"Last Kb Eval","operationId":"last_kb_eval_api_kb_eval_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Last Kb Eval Api Kb Eval Get"}}}}}},"post":{"summary":"Start Kb Eval","description":"Score search on this knowledge base as a background job (see\nticketiq.kbeval); the report is kept for GET /api/kb/eval.","operationId":"start_kb_eval_api_kb_eval_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvalBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Start Kb Eval Api Kb Eval Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kb/eval/bank":{"post":{"summary":"Rebuild Kb Eval Bank","description":"Redraw the questions the nightly check asks (ticketiq.kbmaint). Only\nnights on one bank are compared, so this restarts the regression alert's\nbaseline — an admin action, and audited, like changing the bars.","operationId":"rebuild_kb_eval_bank_api_kb_eval_bank_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Rebuild Kb Eval Bank Api Kb Eval Bank Post"}}}}}}},"/api/kb/embedding-migrations":{"get":{"summary":"List Embedding Migrations","operationId":"list_embedding_migrations_api_kb_embedding_migrations_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Embedding Migrations Api Kb Embedding Migrations Get"}}}}}},"post":{"summary":"Start Embedding Migration","description":"Start moving a knowledge-base collection to another embedding model:\nthe shadow is created and dual-written from now on, and its backfill\nstarts as a background job.","operationId":"start_embedding_migration_api_kb_embedding_migrations_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmbeddingMigrationBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Start Embedding Migration Api Kb Embedding Migrations Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kb/embedding-migrations/{collection}/backfill":{"post":{"summary":"Backfill Embedding Migration","operationId":"backfill_embedding_migration_api_kb_embedding_migrations__collection__backfill_post","parameters":[{"name":"collection","in":"path","required":true,"schema":{"type":"string","title":"Collection"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Backfill Embedding Migration Api Kb Embedding Migrations  Collection  Backfill Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kb/embedding-migrations/{collection}/shadow-read":{"post":{"summary":"Shadow Read Embedding Migration","operationId":"shadow_read_embedding_migration_api_kb_embedding_migrations__collection__shadow_read_post","parameters":[{"name":"collection","in":"path","required":true,"schema":{"type":"string","title":"Collection"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Shadow Read Embedding Migration Api Kb Embedding Migrations  Collection  Shadow Read Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kb/embedding-migrations/{collection}/cutover":{"post":{"summary":"Cutover Embedding Migration","operationId":"cutover_embedding_migration_api_kb_embedding_migrations__collection__cutover_post","parameters":[{"name":"collection","in":"path","required":true,"schema":{"type":"string","title":"Collection"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/EmbeddingCutoverBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cutover Embedding Migration Api Kb Embedding Migrations  Collection  Cutover Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kb/embedding-migrations/{collection}/rollback":{"post":{"summary":"Rollback Embedding Migration","operationId":"rollback_embedding_migration_api_kb_embedding_migrations__collection__rollback_post","parameters":[{"name":"collection","in":"path","required":true,"schema":{"type":"string","title":"Collection"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Rollback Embedding Migration Api Kb Embedding Migrations  Collection  Rollback Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kb/embedding-migrations/{collection}/cancel":{"post":{"summary":"Cancel Embedding Migration","operationId":"cancel_embedding_migration_api_kb_embedding_migrations__collection__cancel_post","parameters":[{"name":"collection","in":"path","required":true,"schema":{"type":"string","title":"Collection"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cancel Embedding Migration Api Kb Embedding Migrations  Collection  Cancel Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kb/embedding-migrations/{collection}/finalize":{"post":{"summary":"Finalize Embedding Migration","operationId":"finalize_embedding_migration_api_kb_embedding_migrations__collection__finalize_post","parameters":[{"name":"collection","in":"path","required":true,"schema":{"type":"string","title":"Collection"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/EmbeddingFinalizeBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Finalize Embedding Migration Api Kb Embedding Migrations  Collection  Finalize Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/sessions":{"get":{"summary":"Agent Sessions","description":"ADP's ListSessions. Every retained session is reachable: `limit` (or\nADP's `page_size`) goes up to what is kept, and `next_page_token` walks\nthe rest. `filter` is AIP-160 over session_id, source, display_name and\nupdated_at/created_at (sessions.FILTER_FIELDS); a malformed one is a 400\nINVALID_ARGUMENT, and so is a token from another filter — never a quiet\nrestart (see sessions.list_for).\n\nRBAC sessions.list (IMPLIED_BY agents.read), then Cedar `list` on the\nagent's sessions as a whole (Session::\"<key>/*\"), decided with the\n`read` on the agent it refines — the list carries each session's\nopening words, so it is `read` as surely as one session is. An unknown\nagent is a 404 before Cedar is asked. Audited as agent.session.list.","operationId":"agent_sessions_api_agents__key__sessions_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"page_token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Page Token"}},{"name":"source","in":"query","required":false,"schema":{"type":"string","default":"","title":"Source"}},{"name":"filter","in":"query","required":false,"schema":{"type":"string","default":"","title":"Filter"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Sessions Api Agents  Key  Sessions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/sessions/{session_id}":{"get":{"summary":"Agent Session","description":"ADP's GetSession. RBAC sessions.get (IMPLIED_BY agents.read), then\nCedar `get` on Session::\"<key>/<id>\", decided with the `read` on the\nagent it refines — a session holds conversation content, the same verb\nas its transcripts. A session of an earlier agent under this key is\nnone of this one's (sessions' incarnation check): a 404. Audited as\nagent.session.read.","operationId":"agent_session_api_agents__key__sessions__session_id__get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Session Api Agents  Key  Sessions  Session Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Patch Agent Session","description":"ADP's UpdateSession: rename a session. `display_name` is the one\nwritable field; `update_mask` (in the body as a list or comma-separated\nstring, or as the query parameter ADP's HTTP binding uses — each also\nunder its proto JSON name, `updateMask`) names what to write — left out,\nthe fields the body sends; `*`, every writable field.\nOutput-only fields are ignored, an unknown one is a 400, and so is a name\nover 63 characters. An empty name clears it. Answers with the slim\nresource {name, display_name, session_id, updated_at}; 404 for a session\nthat does not exist, has expired or is another tenant's.","operationId":"patch_agent_session_api_agents__key__sessions__session_id__patch","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Patch Agent Session Api Agents  Key  Sessions  Session Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Agent Session","operationId":"delete_agent_session_api_agents__key__sessions__session_id__delete","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Agent Session Api Agents  Key  Sessions  Session Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/chat":{"get":{"summary":"Chat Agents","description":"The agents the caller may chat with, for the workspace's list: every\nmodel-driven assistant on the roster that Cedar lets them `invoke` (the\nplayground's own gate), the rest dropped rather than refused, as a list\ndoes. Name, one line on what it does, and whether an administrator has\npaused it; nothing of its binding, owners or cost.","operationId":"chat_agents_api_agents_chat_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Chat Agents Api Agents Chat Get"}}}}}}},"/api/agents/{key}/chats":{"get":{"summary":"My Chats","description":"The caller's own chats with this agent, newest first: the sessions\nthe playground opened for them (source playground, owner them), with\ntheir titles, and the channel sessions a door recorded as being with\nthem (Teams, Google Chat, email: `person`), each badged with its\nchannel. Another person's chat is never listed, whatever the caller's\nother grants. Cedar `invoke` on the agent, as chatting is.","operationId":"my_chats_api_agents__key__chats_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response My Chats Api Agents  Key  Chats Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/chats":{"get":{"summary":"My Chats All","description":"The caller's own chats with every agent they may chat with, newest\nfirst, in one read: the workspace's sessions list, grouped by agent on\nthe page. The same rows, under the same rules, as GET\n/agents/{key}/chats gives agent by agent; an agent the caller may not\n`invoke` is left out, not refused.","operationId":"my_chats_all_api_me_chats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response My Chats All Api Me Chats Get"}}}}}}},"/api/agents/{key}/chats/{session_id}":{"get":{"summary":"My Chat","description":"One of the caller's own chats, with its messages, to pick it up\nagain. Their own words and the agent's answers to them, so not redacted\nas a reader of other people's sessions is: anything not theirs (another\nperson's, one with no owner, one that is gone) is the same 404. A\nchannel session recorded as being with them reads the same, with its\n`channel`; it is continued in that channel, not here. `waiting` is what\nthe caller's runs in this chat wait for (the approval card, an answer).\nAudited as agent.session.read, as GetSession is.","operationId":"my_chat_api_agents__key__chats__session_id__get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response My Chat Api Agents  Key  Chats  Session Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/runs/{run_id}/approval":{"get":{"summary":"Run Approval","description":"The approval the caller's own run waits on, for the card in their\nchat: the run's status (it goes on by itself once the approval is\ndecided) and the approval as _chat_approval shows it. Another person's\nrun answers as an unknown one does; a run that waits on something else\nhas no approval (null).","operationId":"run_approval_api_runs__run_id__approval_get","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Run Approval Api Runs  Run Id  Approval Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/chats/events":{"get":{"summary":"My Chat Events","description":"Server-Sent Events for the workspace: a frame each time one of the\ncaller's own chats moves (a run in it answered, failed, or went on\nafter its approval was decided), so a waiting card updates without\npolling. Only the agent and session of the caller's own playground\nchats, never words: the chat itself is then read through GET\n/agents/{key}/chats/{id}. Built on the transcript events /api/events\ncarries, which this caller may not be able to open.","operationId":"my_chat_events_api_me_chats_events_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/agents/{key}/sessions/{session_id}/unpin":{"post":{"summary":"Unpin Agent Session","description":"Take a session off the agent version it started on (versions.\nsession_pin): from its next turn it runs on live config, and stays\nthere. The emergency rollout — a prompt fix that must reach threads\nalready in flight, not only new ones. governance.write, as editing the\nagent is, then Cedar `update` on the Session (refining `configure` on\nthe agent): what the session is answered by is changing. Optional\n`reason`. 404 for a session that does not exist, has expired or is\noutside the caller's tenant scope. Idempotent: unpinning a session that\nis not pinned answers `unpinned: false`. Audited as agent.session.unpin.","operationId":"unpin_agent_session_api_agents__key__sessions__session_id__unpin_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/UnpinSessionBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Unpin Agent Session Api Agents  Key  Sessions  Session Id  Unpin Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/sessions/{session_id}/live":{"get":{"summary":"Agent Session Live","description":"The supervisor view of one session: its kept conversations, oldest\nfirst, with their turns — the agent's, the person's, and an operator's\nduring a takeover — and whether a person has it now. What a live pane\nredraws on each ``transcript`` event naming the session. Gated as\nGetSession is (sessions.get, Cedar `get` on the Session); the\nconversations need transcripts.get too — the transcript routes and the\n``transcript`` events ask it — and are left out for a caller without it;\nthe words are transcripts.content.read's here as everywhere.","operationId":"agent_session_live_api_agents__key__sessions__session_id__live_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Session Live Api Agents  Key  Sessions  Session Id  Live Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/sessions/{session_id}/takeover":{"post":{"summary":"Take Over Session","description":"Put a Teams session in human mode: the agent stops answering it and\nthe caller answers instead (reply), until hand-back. 409 for a session\nno Teams message was seen in, or one another person already holds.\nAudited as agent.session.takeover, actor_type human.","operationId":"take_over_session_api_agents__key__sessions__session_id__takeover_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Take Over Session Api Agents  Key  Sessions  Session Id  Takeover Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/sessions/{session_id}/reply":{"post":{"summary":"Reply In Session","description":"Send `text` to the person in a taken-over Teams session, as the\noperator. Only the holder replies (409 otherwise, and for a session not\nin human mode). Sent proactively through the bot of the trigger the\nthread came in on — which must still be an enabled Teams bot for this\nagent — to a Microsoft conversation host only (teamsbot._post). Written\nto the transcript as an ``operator`` turn and audited as\nagent.session.reply with actor_type human: the words are a person's and\nnever read as the agent's. A send Teams refuses is a 502, and nothing is\nrecorded as said.","operationId":"reply_in_session_api_agents__key__sessions__session_id__reply_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reply In Session Api Agents  Key  Sessions  Session Id  Reply Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/sessions/{session_id}/handback":{"post":{"summary":"Hand Back Session","description":"Give the session back to the agent: human mode cleared, the\ntakeover's conversation finished. Anyone who may take over may hand\nback — a takeover whose holder went home must not silence the agent\nuntil they return — and the row names whose takeover ended. Idempotent:\na session not taken over answers handed_back false.","operationId":"hand_back_session_api_agents__key__sessions__session_id__handback_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Hand Back Session Api Agents  Key  Sessions  Session Id  Handback Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/spec":{"get":{"summary":"Agent Spec","operationId":"agent_spec_api_agents__key__spec_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Spec Api Agents  Key  Spec Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Put Agent Spec","operationId":"put_agent_spec_api_agents__key__spec_put","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentSpecBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Agent Spec Api Agents  Key  Spec Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/tree":{"get":{"summary":"Agents Tree","description":"Liya and the subagents her runtime declares, with their steps and\nengines (agenttree.tree): what the fleet, the network graph and Liya's\nSettings draw. An agent the caller may not read is left out.","operationId":"agents_tree_api_agents_tree_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Agents Tree Api Agents Tree Get"}}}}}}},"/api/agents/{key}/subagents":{"get":{"summary":"Agent Subagent Catalog","description":"Liya's subagent catalog (GET /api/agents/copilot/subagents): each one\nwith whether it is built-in — permanent, shipped with the product — and\nwhether it is on for the caller's tenant (\"\" the default tenant), which\nturns it off or on for itself alone (PUT …/{name}/tenant-state).","operationId":"agent_subagent_catalog_api_agents__key__subagents_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Subagent Catalog Api Agents  Key  Subagents Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/subagents/{name}/tenant-state":{"put":{"summary":"Put Subagent Tenant State","description":"Turn one of Liya's subagents off, or back on, for the caller's tenant\nalone: every other tenant keeps it as it was. Needs what editing an\nagent's definition needs (agents.update and Cedar `update` on Liya);\nturning one ON is also held by a freeze on Liya (containment, an\nincident hold) — turning one off never is: taking a capability away is\nwhat an incident calls for. Audited as agent.subagent.tenant_state.","operationId":"put_subagent_tenant_state_api_agents__key__subagents__name__tenant_state_put","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubagentTenantStateBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Subagent Tenant State Api Agents  Key  Subagents  Name  Tenant State Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/fleet/agents":{"get":{"summary":"Fleet Agents","description":"The Agents list page (fleetlist.query): search, the Status, Model,\nEngine and Tag facets (comma lists; tag repeats, as a tag may hold a\ncomma), sort, and a page of 10, 25 or 50 — with the total and each\nfacet's counts. Over what the caller may `list`, as ListAgents is:\na hidden agent is in no row, count or facet. With no query, Liya's\nsubagents come under her; `collapsed` folds them.","operationId":"fleet_agents_api_fleet_agents_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"","title":"Status"}},{"name":"model","in":"query","required":false,"schema":{"type":"string","default":"","title":"Model"}},{"name":"engine","in":"query","required":false,"schema":{"type":"string","default":"","title":"Engine"}},{"name":"tag","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Tag"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","default":"","title":"Sort"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","default":25,"title":"Page Size"}},{"name":"collapsed","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Collapsed"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Fleet Agents Api Fleet Agents Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/engine":{"get":{"summary":"Agent Engine","description":"The agent's engine in force, its rules in plain words, its fallback\nprompt, where it sits in Liya's tree, and the model it runs on — its own\nbinding or the one it inherits from Liya.","operationId":"agent_engine_api_agents__key__engine_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Engine Api Agents  Key  Engine Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/binding":{"delete":{"summary":"Clear Agent Binding","description":"Drop the agent's own binding: a Liya subagent inherits Liya's model\nchain again, any other agent goes back to the global backend. A change\nto the agent like a rebind: gated, audited and versioned as one.","operationId":"clear_agent_binding_api_agents__key__binding_delete","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Clear Agent Binding Api Agents  Key  Binding Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/decide":{"post":{"summary":"Agent Decide","description":"A rule agent's decision on a sample ticket (agentdecide): what it\nwould decide, which rules fired, how sure it was and whether the model\nfallback ran. Nothing is saved, indexed or sent.","operationId":"agent_decide_api_agents__key__decide_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DecideBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Decide Api Agents  Key  Decide Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/eval/starter":{"get":{"summary":"Agent Starter Eval","description":"The agent's starter eval set and its latest run.","operationId":"agent_starter_eval_api_agents__key__eval_starter_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Starter Eval Api Agents  Key  Eval Starter Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Run Agent Starter Eval","description":"Run the agent's starter set now, as an ordinary eval run: listed and\ncomparable on the Evaluations page.","operationId":"run_agent_starter_eval_api_agents__key__eval_starter_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Run Agent Starter Eval Api Agents  Key  Eval Starter Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/registry":{"get":{"summary":"Agent Registry","operationId":"agent_registry_api_agents__key__registry_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Registry Api Agents  Key  Registry Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Put Agent Registry","operationId":"put_agent_registry_api_agents__key__registry_put","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegistryBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Agent Registry Api Agents  Key  Registry Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ai-act/questionnaire":{"get":{"summary":"Ai Act Questionnaire","operationId":"ai_act_questionnaire_api_ai_act_questionnaire_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Ai Act Questionnaire Api Ai Act Questionnaire Get"}}}}}}},"/api/ai-act/register":{"get":{"summary":"Ai Act Register","description":"Every agent's AI Act standing, high risk first: which are unscreened,\nwhich changed since they were screened, which high-risk ones name no\noversight role or are past their review date. Agents the caller may\nnot `get` under Cedar are left out, as the agent list leaves them.","operationId":"ai_act_register_api_ai_act_register_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Ai Act Register Api Ai Act Register Get"}}}}}}},"/api/agents/{key}/ai-act":{"get":{"summary":"Agent Ai Act","operationId":"agent_ai_act_api_agents__key__ai_act_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Ai Act Api Agents  Key  Ai Act Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/ai-act/screening":{"post":{"summary":"Screen Agent Ai Act","description":"Screen the agent against the AI Act and write the tier it yields.\n\nThe tier goes through put_agent_registry, so a high-risk result on an\nagent with no oversight role is refused there (nothing is recorded),\nand under change control it is filed as a change request (the\nscreening is recorded; the tier lands when the request is approved).\nA prohibited result is recorded, not saved as a tier: from then on the\nagent is refused on every call. Lifting such a finding is a weakening.","operationId":"screen_agent_ai_act_api_agents__key__ai_act_screening_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiActScreeningBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Screen Agent Ai Act Api Agents  Key  Ai Act Screening Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/ai-act/acknowledge":{"post":{"summary":"Acknowledge Agent Ai Act","description":"Record that what changed since the screening is not a substantial\nmodification (Art. 3(23)): the classification stands, re-based on the\nagent as it is now. Needs a reason, which the audit row keeps.","operationId":"acknowledge_agent_ai_act_api_agents__key__ai_act_acknowledge_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiActAcknowledgeBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Acknowledge Agent Ai Act Api Agents  Key  Ai Act Acknowledge Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/registry/transfer":{"post":{"summary":"Transfer Agent Registry","description":"Offer the agent to `to`. Nothing changes hands until they accept it\n(POST .../registry/transfer/accept); then they are its only owner, or,\nwith mode \"add\", one more of its owners.\n\nWho may offer: one of its owners, or an access administrator\n(access.write), the one who moves accountability when an owner has left\nor will not hand the agent on. Either way the caller needs a write\npermission (governance.write as an owner, or access.write), not just to\nbe named on the entry, and Cedar `configure` applies, as on every write\nto one agent, so a forbid narrows this too.","operationId":"transfer_agent_registry_api_agents__key__registry_transfer_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegistryTransferBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Transfer Agent Registry Api Agents  Key  Registry Transfer Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Withdraw Agent Transfer","description":"End a pending offer: the recipient declining it, or an owner, the\nperson who made it or an access administrator taking it back. Nothing\nchanges hands. agents.read for the reason accept gives: declining is\nthe recipient's to do, and anyone the offer does not concern is refused\n(agentreg.withdraw_transfer).","operationId":"withdraw_agent_transfer_api_agents__key__registry_transfer_delete","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Withdraw Agent Transfer Api Agents  Key  Registry Transfer Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/registry/transfer/accept":{"post":{"summary":"Accept Agent Transfer","description":"Take up the offer made to the caller (or to a group they are in): the\nrecipient becomes the agent's only owner.\n\nagents.read and Cedar `read`, not a write permission, like consenting to\nan OAuth request (/oauth/pending/{rid}/approve): the person an agent is\noffered to is often not an administrator, and what they may do here is\nonly ever answer the offer made to them. The write was weighed when the\noffer was made, by whoever made it (governance.write as an owner, or\naccess.write). Anyone else is refused and the attempt is on the record.\nAudited as agent.owner.transfer with the owners before and after, like\nevery other way an agent changes hands.","operationId":"accept_agent_transfer_api_agents__key__registry_transfer_accept_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Accept Agent Transfer Api Agents  Key  Registry Transfer Accept Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent-registry/sweep":{"post":{"summary":"Sweep Agent Registry","description":"Run the orphan sweep now rather than on the hour. Each agent that\nbecomes orphaned or recovers is its own system audit row; this row says\nwho asked for the pass.","operationId":"sweep_agent_registry_api_agent_registry_sweep_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Sweep Agent Registry Api Agent Registry Sweep Post"}}}}}}},"/api/agents/{key}/tools":{"get":{"summary":"Agent Tools","description":"The MCP servers and subagents an agent's runtime declares — for any\nagent, a built-in included (the managed runtime form is richer, and\nonly for managed agents): what Settings → Tools and Subagents show.","operationId":"agent_tools_api_agents__key__tools_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Tools Api Agents  Key  Tools Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Put Agent Tools","description":"Attach or detach MCP servers and subagents on a BUILT-IN agent's\nruntime (a managed agent saves its whole runtime on PUT …/runtime).\nValidated by runtime.validate as any runtime is, versioned and audited\nas agent.runtime.save.","operationId":"put_agent_tools_api_agents__key__tools_put","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuiltinToolsBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Agent Tools Api Agents  Key  Tools Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/runtime":{"get":{"summary":"Agent Runtime","operationId":"agent_runtime_api_agents__key__runtime_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Runtime Api Agents  Key  Runtime Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Put Agent Runtime","description":"Save a managed agent's runtime. If-Match, optional, is the agent's row\netag (GET here or GET /gateway/agents/{id}): a save over a change made\nsince — to the runtime, the registry row, the binding, the kill switch —\nis refused 412, checked and written under the registry lock.","operationId":"put_agent_runtime_api_agents__key__runtime_put","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Agent Runtime Api Agents  Key  Runtime Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/effective-tools":{"get":{"summary":"Agent Effective Tools","description":"Every tool the managed agent — and each subagent — could be offered,\nwith whether it is and what decided (runtime.effective_tools): the\nintersection of the server's gate and record, the agent's tool list and\nCedar on each tool, through the functions a run uses. `refresh` dials a\nremote server for its listing, as a run would; otherwise its last\nrecorded discovery is shown. The deciding Cedar policies are named to a\ncaller who may read the rulebook (governance.read), as a playground's\nguardrail steps are; to anyone else, what refused and why without them.","operationId":"agent_effective_tools_api_agents__key__effective_tools_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Refresh"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Effective Tools Api Agents  Key  Effective Tools Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/posture":{"get":{"summary":"Agent Posture","description":"The agent's security posture: a score, a grade, and every finding\nwith its severity and where it is fixed (posture.py). Read off stored\nconfiguration only — nothing is dialled — under Cedar `read`, as the\nagent's other aspects are.","operationId":"agent_posture_api_agents__key__posture_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Posture Api Agents  Key  Posture Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/preflight":{"post":{"summary":"Agent Preflight","description":"The findings a draft would have, before it is saved — the console asks\nbefore Save, Start and Publish. `key` may be an agent about to be\ncreated: its draft is judged as a new agent would be. `blocking` is what\na publish of this draft would be refused for; `new` is what the draft\nadds to the agent as it stands. Saves nothing.","operationId":"agent_preflight_api_agents__key__preflight_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreflightBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Preflight Api Agents  Key  Preflight Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/governance/coverage":{"get":{"summary":"Governance Coverage","description":"Fleet coverage: each agent's posture score, and per control how many\nof the agents it applies to have it. The agents the caller may not\n`read` are dropped BEFORE anything is counted, as the roster drops\nthem, so a total never says a hidden agent exists. `max_age` (seconds,\nat most posture.COVERAGE_MAX_AGE_S) takes a reading of the same agents\nthat recent instead of a live one — Home's summary line; the readable\nset is judged live either way, so a cached reading never shows a caller\nan agent it may not read.","operationId":"governance_coverage_api_governance_coverage_get","parameters":[{"name":"max_age","in":"query","required":false,"schema":{"type":"number","default":0,"title":"Max Age"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Governance Coverage Api Governance Coverage Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/governance/controls":{"get":{"summary":"Governance Controls","description":"The control crosswalk (crosswalk.py): each TicketIQ control, the EU AI\nAct, NIST AI RMF and ISO/IEC 42001 clause ids it supports, evidence\nlinks, and whether it is configured on this instance right now. Its\nper-agent coverage counts only the agents the caller may `read`, as\nGET /governance/coverage does. format=csv is the auditor's spreadsheet.\nDeliberately unscored: the mapping is evidence, not a certification.","operationId":"governance_controls_api_governance_controls_get","parameters":[{"name":"format","in":"query","required":false,"schema":{"type":"string","maxLength":8,"default":"json","title":"Format"}},{"name":"framework","in":"query","required":false,"schema":{"type":"string","maxLength":32,"default":"","title":"Framework"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/bom":{"get":{"summary":"Agent Bom","description":"One agent's CycloneDX 1.6 bill of materials: its model, the MCP\nservers and pinned tool digests it can reach, its subagents, data\nsources and registry owner and tier. Under Cedar `read`, as the agent's\nother aspects are; no secret or credential reference is in it.","operationId":"agent_bom_api_agents__key__bom_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/governance/inventory":{"get":{"summary":"Governance Inventory","description":"The fleet inventory: a CycloneDX 1.6 BOM (format=cyclonedx) or one CSV\nrow per agent (format=csv). The agents the caller may not `read` are\ndropped before anything is built, as the roster drops them, so neither\nfile says a hidden agent, or the model and tools only it uses, exists.","operationId":"governance_inventory_api_governance_inventory_get","parameters":[{"name":"format","in":"query","required":false,"schema":{"type":"string","default":"cyclonedx","title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/governance/inventory/push":{"post":{"summary":"Governance Inventory Push","description":"Queue the fleet inventory for every webhook integration subscribed to\n`inventory` (a CMDB, an ITAM tool): as a CycloneDX BOM, or as ServiceNow\nIRE items and relations (format=cmdb). admin.write, as the integrations\nit goes to are; it carries only the agents the caller may read. 409 with\nnothing queued when no integration is subscribed. Audited.","operationId":"governance_inventory_push_api_governance_inventory_push_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InventoryPushBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Governance Inventory Push Api Governance Inventory Push Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/access/review":{"get":{"summary":"Access Review","operationId":"access_review_api_access_review_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Access Review Api Access Review Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/access/review/agents/{key}":{"get":{"summary":"Access Review Agent","operationId":"access_review_agent_api_access_review_agents__key__get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Access Review Agent Api Access Review Agents  Key  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/access/review/dismiss":{"post":{"summary":"Access Review Dismiss","description":"Accept one current finding, with a reason, for `days` (at most a\nyear) — it comes back after. Audited, as every decision a later\nreviewer relies on is.","operationId":"access_review_dismiss_api_access_review_dismiss_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessDismissBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Access Review Dismiss Api Access Review Dismiss Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/access/review/undismiss":{"post":{"summary":"Access Review Undismiss","operationId":"access_review_undismiss_api_access_review_undismiss_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessDismissBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Access Review Undismiss Api Access Review Undismiss Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/access/reviews":{"get":{"summary":"Access Reviews","operationId":"access_reviews_api_access_reviews_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Access Reviews Api Access Reviews Get"}}}}}},"post":{"summary":"Access Review Start","operationId":"access_review_start_api_access_reviews_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessReviewBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Access Review Start Api Access Reviews Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/access/reviews/{review_id}/signoff":{"post":{"summary":"Access Review Signoff","description":"Close the open review. Refused (409) to whoever started it and while\nany high finding is neither fixed nor dismissed; the refusal is on the\nrecord too, as an attempted sign-off is itself evidence.","operationId":"access_review_signoff_api_access_reviews__review_id__signoff_post","parameters":[{"name":"review_id","in":"path","required":true,"schema":{"type":"string","title":"Review Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessReviewBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Access Review Signoff Api Access Reviews  Review Id  Signoff Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/versions":{"get":{"summary":"Agent Versions","operationId":"agent_versions_api_agents__key__versions_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Versions Api Agents  Key  Versions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/versions/diff":{"get":{"summary":"Agent Versions Diff","operationId":"agent_versions_diff_api_agents__key__versions_diff_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"a","in":"query","required":false,"schema":{"type":"string","default":"","title":"A"}},{"name":"b","in":"query","required":false,"schema":{"type":"string","default":"","title":"B"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Versions Diff Api Agents  Key  Versions Diff Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/versions/{version_id}":{"get":{"summary":"Agent Version","operationId":"agent_version_api_agents__key__versions__version_id__get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"version_id","in":"path","required":true,"schema":{"type":"string","title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Version Api Agents  Key  Versions  Version Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/versions/{version_id}/restore":{"post":{"summary":"Restore Agent Version","operationId":"restore_agent_version_api_agents__key__versions__version_id__restore_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"version_id","in":"path","required":true,"schema":{"type":"string","title":"Version Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/VersionRestoreBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Restore Agent Version Api Agents  Key  Versions  Version Id  Restore Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/versions/{version_id}/candidate":{"post":{"summary":"Agent Version Candidate","description":"Propose restoring a version as a promotion candidate: it goes live\nthrough POST /api/settings/candidates/{id}/promote, gated by the frozen\neval bank and a second person's sign-off, as a settings candidate is.\nPinned to the version's fingerprint — a version is immutable, so what\nwas signed off is what is restored.","operationId":"agent_version_candidate_api_agents__key__versions__version_id__candidate_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"version_id","in":"path","required":true,"schema":{"type":"string","title":"Version Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/CandidateNoteBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Version Candidate Api Agents  Key  Versions  Version Id  Candidate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/optimizer/signals":{"get":{"summary":"Optimizer Signals","description":"What went wrong for the agent over the last `days` (optimizer.mine):\nrefusals, tool errors, thumbs-down, knowledge gaps and failed eval cases,\ncounted, sampled and grouped by cause.","operationId":"optimizer_signals_api_agents__key__optimizer_signals_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Optimizer Signals Api Agents  Key  Optimizer Signals Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/optimizer/proposals":{"get":{"summary":"List Optimizer Proposals","operationId":"list_optimizer_proposals_api_agents__key__optimizer_proposals_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Optimizer Proposals Api Agents  Key  Optimizer Proposals Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Create Optimizer Proposal","description":"A draft proposal: the edits given, or — with none — edits a model\ndrafts from the agent's mined failures (optimizer.draft). Either way the\nedits are checked (optimizer.clean_edits) and nothing about the agent\nchanges: a draft is offered only once an evaluation says it is better.","operationId":"create_optimizer_proposal_api_agents__key__optimizer_proposals_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProposalBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Optimizer Proposal Api Agents  Key  Optimizer Proposals Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/optimizer/proposals/{pid}":{"get":{"summary":"Get Optimizer Proposal","operationId":"get_optimizer_proposal_api_agents__key__optimizer_proposals__pid__get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Optimizer Proposal Api Agents  Key  Optimizer Proposals  Pid  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/optimizer/proposals/{pid}/evaluate":{"post":{"summary":"Evaluate Optimizer Proposal","description":"Run the dataset against the agent as it is and with the proposal\ntrialed, back to back; offer the proposal only when it beats the\ncurrent version with no regression in any metric or category, reject\nit otherwise. Both runs are ordinary eval runs, listed with the rest.\nTwo runs of up to a hundred agent turns each outlast a request, so they\nrun as a background job, like any eval run: everything is checked and\nboth runs planned here, the proposal says `evaluating` while the job\nruns, and a client polls the proposal (or the job) for the verdict.","operationId":"evaluate_optimizer_proposal_api_agents__key__optimizer_proposals__pid__evaluate_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProposalEvalBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Evaluate Optimizer Proposal Api Agents  Key  Optimizer Proposals  Pid  Evaluate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/optimizer/whatif":{"post":{"summary":"Optimizer Whatif","description":"Each model/effort option run on the dataset against the agent as it\nis, with its verdict (beats it with no regression, or not), and the\nagent's metered traffic priced on the option's model at the rate card.\nChanges nothing: an option worth taking is proposed like any edit. A\npair of eval runs an option outlasts a request, so the runs are a\nbackground job: this answers with the job, whose result is the table.","operationId":"optimizer_whatif_api_agents__key__optimizer_whatif_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WhatIfBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Optimizer Whatif Api Agents  Key  Optimizer Whatif Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/optimizer/proposals/{pid}/candidate":{"post":{"summary":"Optimizer Proposal Candidate","description":"Put an offered proposal forward for adoption: a promotion candidate\n(kind agent_proposal) that goes live through POST\n/api/settings/candidates/{id}/promote — its evaluation still current,\nthe frozen eval bank, and a second person's sign-off. Edited tool\ndescriptions must be named with the digests reviewed.","operationId":"optimizer_proposal_candidate_api_agents__key__optimizer_proposals__pid__candidate_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProposalCandidateBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Optimizer Proposal Candidate Api Agents  Key  Optimizer Proposals  Pid  Candidate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/optimizer/proposals/{pid}/withdraw":{"post":{"summary":"Withdraw Optimizer Proposal","operationId":"withdraw_optimizer_proposal_api_agents__key__optimizer_proposals__pid__withdraw_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Withdraw Optimizer Proposal Api Agents  Key  Optimizer Proposals  Pid  Withdraw Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bundle-schema":{"get":{"summary":"Agent Bundle Schema","description":"The bundle's JSON Schema, for a CI step that lints a bundle before it\nposts one. The apply validates against the same schema.","operationId":"agent_bundle_schema_api_bundle_schema_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/agents/{key}/export":{"get":{"summary":"Export Agent Bundle","description":"The agent as a bundle (bundle.py): every section, or `sections` (a\ncomma-separated list). Keys in a stable order; secrets as secret://\nreferences only; no kill switch. The ETag is what POST /agents/apply takes\nback as If-Match.\n\nagents.get and Cedar `get`, as the definition is — and the read\npermission of every section asked for (a trigger's, a budget's), 403\nnaming the ones missing rather than a bundle quietly without them.","operationId":"export_agent_bundle_api_agents__key__export_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"sections","in":"query","required":false,"schema":{"type":"string","default":"","title":"Sections"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/export":{"get":{"summary":"Export All Bundles","description":"Every agent the caller may `get`, as an AgentBundleList: the estate's\nagents in one file, sorted by name, that POST /agents/apply takes back\nwhole. An agent Cedar keeps from the caller is left out, as the fleet\nlist leaves it out.","operationId":"export_all_bundles_api_export_get","parameters":[{"name":"sections","in":"query","required":false,"schema":{"type":"string","default":"","title":"Sections"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/apply":{"post":{"summary":"Apply Agent Bundle","description":"Apply a bundle (GET /agents/{key}/export's), or an AgentBundleList\n(GET /export's): make each agent what its bundle says, and answer the\nplan — per section, what was created, updated or deleted.\n\nOne store transaction around every write of every agent: a bundle lands\nwhole, or not at all. Each section is written by its own route, called\nas a function, so every permission, Cedar gate, posture gate, weakening\ngate and validator a console save meets holds here too; a refusal\nanywhere rolls back everything and is answered with the route's own\nstatus and sentence, plus `at` — the part of the bundle it was.\n\nIdempotent: a section equal to what is stored is not written, and a\nbundle equal to the agent writes nothing, no version and no change —\nonly the agent.apply row saying it was applied. `If-Match` is the\nexport's ETag (412 when any section moved since); `If-None-Match: *`\nmakes it create-only. `dry_run` makes every write and meets every gate,\nthen rolls all of it back: the plan, and whether it would be refused.\n\nWritten as ONE version per agent (source \"apply\"), and audited as\nagent.apply with the bundle's hash and actor_type \"pipeline\" — beside\neach replayed route's own row, marked via=agent.apply.","operationId":"apply_agent_bundle_api_agents_apply_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BundleApplyBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/bundle-lock":{"delete":{"summary":"Delete Agent Bundle Lock","description":"Break glass: lift the gitops lock without a bundle, so the console\ncan edit an agent the pipeline that manages it cannot reach (the\nrepository gone, the pipeline broken mid-incident). A weakening —\ngovernance.weaken and a reason — and Cedar `configure` on the agent.\nThe kill switch never needed this: it is not in any bundle.","operationId":"delete_agent_bundle_lock_api_agents__key__bundle_lock_delete","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/BundleUnlockBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Agent Bundle Lock Api Agents  Key  Bundle Lock Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/start":{"post":{"summary":"Start Agent","operationId":"start_agent_api_agents__key__start_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Start Agent Api Agents  Key  Start Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/stop":{"post":{"summary":"Stop Agent","operationId":"stop_agent_api_agents__key__stop_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Stop Agent Api Agents  Key  Stop Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/runtime/check":{"post":{"summary":"Check Agent Runtime","operationId":"check_agent_runtime_api_agents__key__runtime_check_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Check Agent Runtime Api Agents  Key  Runtime Check Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/card":{"get":{"summary":"Agent Card Preview","description":"The card exactly as an A2A client would fetch it — shown in the console\nwhether or not it is published.","operationId":"agent_card_preview_api_agents__key__card_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Card Preview Api Agents  Key  Card Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/avatar":{"get":{"summary":"Agent Avatar","operationId":"agent_avatar_api_agents__key__avatar_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"fallback","in":"query","required":false,"schema":{"type":"string","default":"","title":"Fallback"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Put Agent Avatar","description":"Upload an avatar: the image itself as the body, PNG or SVG, with its\nContent-Type. Validated and scrubbed by avatars.validate.","operationId":"put_agent_avatar_api_agents__key__avatar_put","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Agent Avatar Api Agents  Key  Avatar Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Reset Agent Avatar","description":"Back to the generated Liyagent spark.","operationId":"reset_agent_avatar_api_agents__key__avatar_delete","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reset Agent Avatar Api Agents  Key  Avatar Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/avatar/meta":{"get":{"summary":"Agent Avatar Meta","operationId":"agent_avatar_meta_api_agents__key__avatar_meta_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Avatar Meta Api Agents  Key  Avatar Meta Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/display-name":{"get":{"summary":"Agent Display Name","operationId":"agent_display_name_api_agents__key__display_name_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Display Name Api Agents  Key  Display Name Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Put Agent Display Name","description":"Name a built-in agent — \"Liya\" is only the shipped default. For the\ntenant the request works in, where the platform has tenants. Every place\nthe agent names itself follows: fleet, page, A2A card, the Teams and\nweb-chat persona, replies and cards, and the Teams package.","operationId":"put_agent_display_name_api_agents__key__display_name_put","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DisplayNameBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Agent Display Name Api Agents  Key  Display Name Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/a2a/catalog":{"get":{"summary":"Tenant Agent Catalogue","description":"The catalogue scoped to the caller's tenant: the shared agents and the\nones bound to their tenant (tenants.may_use — the same rule that decides\nwhich agents their work may run), less any a policy forbids them to\nread, as GET /agents drops them (_readable_agents). private, no-cache:\nthe answer rides on a session and changes with the tenant selected, so\nno shared cache may keep it, and the caller revalidates (a 304 while\nnothing changed).","operationId":"tenant_agent_catalogue_api_a2a_catalog_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/triggers/{name}/runs":{"get":{"summary":"Trigger Runs","description":"A scheduled trigger's runs, newest first — ADP's ListTriggerRuns.\n\n`page_size` (0-1000; above is cut to 1000) pages them newest scheduled\ntime first, `next_page_token` walks the rest and `total_size` counts\nevery page. Without either, every run comes back in stored order, as it\nalways has, plus an empty token and the count.","operationId":"trigger_runs_api_triggers__name__runs_get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Page Size"}},{"name":"page_token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Page Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Trigger Runs Api Triggers  Name  Runs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/triggers/{name}/run":{"post":{"summary":"Trigger Run Now","description":"Run a scheduled trigger once, now — to try a new schedule's input\nwithout waiting for its first tick. Recorded as a run like any other.","operationId":"trigger_run_now_api_triggers__name__run_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Trigger Run Now Api Triggers  Name  Run Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/triggers/{name}/runs/{run_id}/cancel":{"post":{"summary":"Cancel Trigger Run","description":"Stop one run of a scheduled trigger (cron.cancel_run): the row says\n`cancelled` at once, and the run stops before its next model or tool\ncall. Asks what Run now asks — agents.run, and Cedar `invoke` on the\nagent — since stopping a run is the other half of starting one; a run\nof another tenant's is no run at all (404), and a run already ended is\n409, its outcome final.","operationId":"cancel_trigger_run_api_triggers__name__runs__run_id__cancel_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/RunCancelBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cancel Trigger Run Api Triggers  Name  Runs  Run Id  Cancel Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tool-tasks":{"get":{"summary":"List Tool Tasks","description":"The caller's tenant's tool tasks, newest first, less those of agents\nCedar will not let the caller read (dropped, not refused).","operationId":"list_tool_tasks_api_tool_tasks_get","parameters":[{"name":"agent","in":"query","required":false,"schema":{"type":"string","default":"","title":"Agent"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"","title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Tool Tasks Api Tool Tasks Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tool-tasks/{task_id}":{"get":{"summary":"Get Tool Task","operationId":"get_tool_task_api_tool_tasks__task_id__get","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Tool Task Api Tool Tasks  Task Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tool-tasks/{task_id}/cancel":{"post":{"summary":"Cancel Tool Task","description":"Cancel an open tool task: the row says `cancelled` at once and the\ntool is told, best effort. Idempotent for a task already cancelled; 409\nfor one that succeeded or failed, its outcome final. A run waiting on\nthe task is told the tool's answer will not come; the run itself goes\non (cancel the run for that).","operationId":"cancel_tool_task_api_tool_tasks__task_id__cancel_post","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/RunCancelBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cancel Tool Task Api Tool Tasks  Task Id  Cancel Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/triggers":{"get":{"summary":"List Triggers Endpoint","description":"Every trigger the caller may see, by name, `?agent=` narrowing it to\none agent's. `page_size` (0-1000; above is cut to 1000) pages it,\n`next_page_token` walks the rest and `total_size` counts every page;\nwithout one the whole list comes back, as it always has.\nGET /agents/{key}/triggers is ADP's agent-scoped form of the same list.","operationId":"list_triggers_endpoint_api_triggers_get","parameters":[{"name":"agent","in":"query","required":false,"schema":{"type":"string","default":"","title":"Agent"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Page Size"}},{"name":"page_token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Page Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Triggers Endpoint Api Triggers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/triggers/{name}":{"get":{"summary":"Get Trigger","description":"One trigger by name — ADP's GetTrigger — in exactly the shape the list\ngives its row, messaging endpoint and loop-guard counts included, and its\nrow etag as the ETag header too: PUT /triggers/{name} takes it back as\nIf-Match.\n\nAnother tenant's trigger is the 404 an unknown name gets; then Cedar\n`get` on the trigger, decided with `read` on the agent it feeds, as its\nruns are — the row carries a schedule's message and call count, which\nthe list hides from the same caller.","operationId":"get_trigger_api_triggers__name__get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Trigger Api Triggers  Name  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Put Trigger","description":"Create a trigger, or edit one by the keys the body names. What the\ntrigger IS — its kind, a Teams trigger's bot or webhook mode — is fixed\nat creation: an edit that would change it is refused 422, and\nPOST /triggers/{name}/convert is how it changes.\n\nIf-Match, optional, is the trigger's etag (its GET, or its row in the\nlist): an edit of a trigger changed since — or deleted — is refused 412.\nWithout it the edit is still refused 409 when the trigger moved between\nthis request's own read and its write. The new etag comes back as the\nETag header as well as `etag`, as the agent PUTs answer theirs.\n\nWith an update_mask it is UpdateTrigger, exactly as PATCH (never a\ncreate: an unknown name is a 404). Without one, an edit of a trigger\nthat exists still merges by presence, and says it is deprecated\n(Deprecation header): PATCH with a mask is the standard update.","operationId":"put_trigger_api_triggers__name__put","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TriggerBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Trigger Api Triggers  Name  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Patch Trigger","description":"ADP's UpdateTrigger (AIP-134). `update_mask` — in the body (a list, or\none comma-separated string) or as the query parameter — names the paths\nto write: display_name, description, enabled, and the config.<leaf>\nfields this trigger's kind has (config.schedule, config.auth_mode,\nconfig.loop_guard.mode, ...). Each named path is written from the body,\nreset when the body leaves it out; everything else is kept, whatever\nelse the body sends. A wildcard, the whole config, a path the kind lacks,\nan unknown or an immutable one (kind, agent) is a 400; an unknown name a\n404, since an update never creates.\n\nGated and saved as PUT's edit is (_save_trigger: agents.trigger.update,\nCedar `update` on the AgentTrigger as stored and as it would land,\nIf-Match/412, 409 on a trigger changed under the request), and audited\nwith the mask. A mask of `enabled` alone is a pause or resume: only the\nswitch moves, as POST .../pause and .../resume.","operationId":"patch_trigger_api_triggers__name__patch","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"update_mask","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Update Mask"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Patch Trigger Api Triggers  Name  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Trigger","description":"Delete a trigger, idempotently — ADP's DeleteTrigger. A trigger that\nis not there is already deleted: 200 with `existed: false`, and no audit\nrow, since nothing changed. A retry after a lost response, or a runbook\ntearing down what may already be gone, then succeeds instead of failing\non its own earlier success.\n\nStill governance.write, so the answer is no way for a reader to probe\nnames; and another tenant's trigger gets the same answer as an unknown\nname (and is left alone), as its other routes 404 alike.","operationId":"delete_trigger_api_triggers__name__delete","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Trigger Api Triggers  Name  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/triggers":{"get":{"summary":"Agent Triggers","description":"One agent's triggers, by name — ADP's ListTriggers with the agent as\nits parent — paged as GET /triggers is. An unknown agent is a 404 rather\nthan an empty list, so a mistyped key is not read as \"no triggers\"; one\nwhose triggers the caller may not `list` — Cedar, on the agent's triggers\nas a whole (policy.LIST_SCOPE), decided with `read` on the agent — is\nrefused, where the instance-wide list would only leave them out.","operationId":"agent_triggers_api_agents__key__triggers_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Page Size"}},{"name":"page_token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Page Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Triggers Api Agents  Key  Triggers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/triggers/{name}/convert":{"post":{"summary":"Convert Trigger","description":"Change what a trigger is — a webhook into a schedule, a Teams bot back\ninto a token-in-URL webhook — as its own request, with a reason.\n\nThe body is an edit like PUT's (the new kind and whatever it needs: a\nschedule, a bot's ids, an auth_mode), merged over the stored trigger by\ntriggers.merged and gated the same way — Cedar `configure` on the agent\nit feeds now and the one it would feed. It must change the kind or mode;\nanything else is an edit, and is refused here. Audited as\ntrigger.convert, from and to.","operationId":"convert_trigger_api_triggers__name__convert_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TriggerConvertBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Convert Trigger Api Triggers  Name  Convert Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/triggers/{name}/pause":{"post":{"summary":"Pause Trigger","description":"Stop a trigger acting — its endpoint refuses the next call, its\nschedule stops firing — keeping its token, history and configuration.","operationId":"pause_trigger_api_triggers__name__pause_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Pause Trigger Api Triggers  Name  Pause Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/triggers/{name}/resume":{"post":{"summary":"Resume Trigger","description":"Switch a paused trigger back on. A schedule resumes from its next tick;\nthe ones it slept through are not run late, nor recorded as missed.","operationId":"resume_trigger_api_triggers__name__resume_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Resume Trigger Api Triggers  Name  Resume Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/triggers/{name}/token":{"post":{"summary":"Issue Trigger Token","description":"Mint the endpoint credential. Shown ONCE — it is stored hashed.","operationId":"issue_trigger_token_api_triggers__name__token_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Issue Trigger Token Api Triggers  Name  Token Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/triggers/{name}/webchat":{"get":{"summary":"Get Trigger Webchat","operationId":"get_trigger_webchat_api_triggers__name__webchat_get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Trigger Webchat Api Triggers  Name  Webchat Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Put Trigger Webchat","description":"Embed this trigger's agent in the listed pages. Opening a door onto an\nagent from a page on the internet is configuring the agent: the same\npermission, tenant and Cedar check as any edit of the trigger.","operationId":"put_trigger_webchat_api_triggers__name__webchat_put","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebchatBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Trigger Webchat Api Triggers  Name  Webchat Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Trigger Webchat","description":"Take the web-chat door away; the trigger's own door is untouched.","operationId":"delete_trigger_webchat_api_triggers__name__webchat_delete","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Trigger Webchat Api Triggers  Name  Webchat Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/triggers/{name}/email":{"get":{"summary":"Get Trigger Email","operationId":"get_trigger_email_api_triggers__name__email_get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Trigger Email Api Triggers  Name  Email Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Put Trigger Email","description":"Give this trigger's agent a mailbox. Letting mail from outside reach\nan agent is configuring the agent: the same permission, tenant and Cedar\ncheck as any edit of the trigger.","operationId":"put_trigger_email_api_triggers__name__email_put","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailDoorBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Trigger Email Api Triggers  Name  Email Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Trigger Email","description":"Take the email door away; the trigger's own door is untouched.","operationId":"delete_trigger_email_api_triggers__name__email_delete","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Trigger Email Api Triggers  Name  Email Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/triggers/{name}/teams-sso":{"put":{"summary":"Put Teams Sso","description":"Teams single sign-on for a bot trigger: whether the bot asks Teams\nfor the chat user's own token, the Azure Bot OAuth connection its\nsign-in card falls back to, and the Application ID URI the token must\nbe for. An invoker-mode agent reached through it then acts as the chat\nuser downstream (obo). Switching it off drops every token it kept.","operationId":"put_teams_sso_api_triggers__name__teams_sso_put","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamsSsoBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Teams Sso Api Triggers  Name  Teams Sso Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/triggers/{name}/teams-access":{"put":{"summary":"Put Teams Access","description":"Who may use this agent from Teams: everyone in the tenant, named\npeople, Entra groups, or whoever TicketIQ's own roles and policies allow.","operationId":"put_teams_access_api_triggers__name__teams_access_put","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamsAccessBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Teams Access Api Triggers  Name  Teams Access Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/triggers/{name}/teams-app":{"get":{"summary":"Teams App Package","description":"The Teams app package (manifest + icons) for a bot trigger — what a\nTeams admin uploads under Apps → Manage your apps → Upload.","operationId":"teams_app_package_api_triggers__name__teams_app_get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/network":{"get":{"summary":"Agent Network","description":"The estate as ADP draws it: agents, subagents, providers (with the\nmodels used), MCP servers (with their tools), the edges between them, and\nthe error clusters that need attention — all from recorded calls, never\nfrom declared bindings. See ticketiq/netobs.py.\n\nThe request is ADP's GetAgentNetworkRequest: ``start_time`` and\n``end_time`` (RFC 3339, half-open, both or neither) and ``filter``, the\nrestricted AIP-160 health filter (``health = DEGRADED OR health =\nERROR``). The older ``window``/``days``/``start``/``end`` and the comma\nlist ``health`` still work. Anything malformed — a backwards window, a\nfield other than health, an operator the grammar does not have, two\nwindow forms or two filters at once — is a 400 whose ``code`` is\nINVALID_ARGUMENT, never an answer to a question nobody asked.\n\nThe filter keeps only matching agent nodes (and their edges); totals\nalways cover the whole graph — the whole graph the caller may see. An\nagent they may not `read` is not drawn and its calls are in no figure\n(see netobs.build): its node carries its cost, and every total sums it.\n\n`kpis` answers the graph's question — an agent with a model OR a tool\ncall is active, and agent-less calls are a node like any other — over\nthe full graph, as the totals are, so neither the filter nor the node\ncap changes the strip. ADP's GetInsights headline (model callers only,\ndirect calls in the totals but not the agent count) is GET\n/usage/headline.","operationId":"agent_network_api_network_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days"}},{"name":"health","in":"query","required":false,"schema":{"type":"string","default":"","title":"Health"}},{"name":"window","in":"query","required":false,"schema":{"type":"string","default":"","title":"Window"}},{"name":"start","in":"query","required":false,"schema":{"type":"string","default":"","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","default":"","title":"End"}},{"name":"start_time","in":"query","required":false,"schema":{"type":"string","default":"","title":"Start Time"}},{"name":"end_time","in":"query","required":false,"schema":{"type":"string","default":"","title":"End Time"}},{"name":"filter","in":"query","required":false,"schema":{"type":"string","default":"","title":"Filter"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Network Api Network Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/network/impact":{"get":{"summary":"Agent Network Impact","description":"The blast radius of one node — an MCP server, a provider, an agent or\na remote A2A agent: every agent, subagent and inbound client that\ndepends on it, directly or through delegations, with the shortest chain\nand whether each link was observed in the window, declared in the\nregistry, or both (netobs.impact).\n\nOver what the caller may `read`, as the graph is: an agent they cannot\nread is neither listed nor walked through, and naming one is the same\n404 as naming nothing. A malformed request is a 400 INVALID_ARGUMENT.","operationId":"agent_network_impact_api_network_impact_get","parameters":[{"name":"type","in":"query","required":false,"schema":{"type":"string","default":"","title":"Type"}},{"name":"id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Id"}},{"name":"days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days"}},{"name":"window","in":"query","required":false,"schema":{"type":"string","default":"","title":"Window"}},{"name":"start","in":"query","required":false,"schema":{"type":"string","default":"","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","default":"","title":"End"}},{"name":"start_time","in":"query","required":false,"schema":{"type":"string","default":"","title":"Start Time"}},{"name":"end_time","in":"query","required":false,"schema":{"type":"string","default":"","title":"End Time"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Network Impact Api Network Impact Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/network/agents/{agent_id}":{"get":{"summary":"Agent Network Detail","description":"Per-agent figures that do not sum over the window — fetched when a\nnode is selected, over the graph's own window (start_time/end_time\nincluded, as strictly as GET /network reads them). `uid` picks the\nincarnation the spend and request latency are of (default the agent's\ncurrent one; see netobs.agent_detail); one that is no UUID is a 400,\nnever a read of nothing that looks like \"spent $0\".","operationId":"agent_network_detail_api_network_agents__agent_id__get","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days"}},{"name":"window","in":"query","required":false,"schema":{"type":"string","default":"","title":"Window"}},{"name":"start","in":"query","required":false,"schema":{"type":"string","default":"","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","default":"","title":"End"}},{"name":"start_time","in":"query","required":false,"schema":{"type":"string","default":"","title":"Start Time"}},{"name":"end_time","in":"query","required":false,"schema":{"type":"string","default":"","title":"End Time"}},{"name":"uid","in":"query","required":false,"schema":{"type":"string","default":"","title":"Uid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Network Detail Api Network Agents  Agent Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/fleet/metrics":{"get":{"summary":"Fleet Metrics","description":"One operational row per agent over ``window`` (7d or 30d): calls,\nerror rate, p95 latency, tokens, cost, conversations, distinct users and\n30-day MAU, the live config version, the escalation rate and the latest\nevaluation score (see ticketiq/fleetmetrics.py). Cached 60 s per window.\n\nOver what the caller may `read`, as the network is: an agent they cannot\nread has no row. Any other window is a 400 INVALID_ARGUMENT.","operationId":"fleet_metrics_api_fleet_metrics_get","parameters":[{"name":"window","in":"query","required":false,"schema":{"type":"string","default":"7d","title":"Window"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Fleet Metrics Api Fleet Metrics Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/network/providers/{name}/failures":{"get":{"summary":"Provider Call Failures","description":"Failed calls to one provider, newest first (ADP's\nQueryLLMProviderCallFailures): when, which caller and model, how long, a\nreason class, and what to follow it by — the W3C trace and span ids and\nthe provider's own request id. Content-safe by construction — the\nprovider's own error text is never recorded, because it can echo the\nprompt that caused it. The window is the graph's, in any of its forms.\n\nThe caller is ``agent_name`` (``agents/{agent}`` or bare; ``agent`` is\nits older spelling) or ``user_email`` — a person's direct calls — never\nboth. ``page_size`` 0 is 50, above 100 is 100, negative is refused; the\npage token is keyset, signed and bound to this provider, window and\ncaller.\n\nOver what the caller may read, as the graph is: an agent's failures only\nwhere they may `read` that agent, a person's direct ones — and the\npeople offered as callers — only where the row's tenant is one they\nread (tenants.ReadScope: their tenant, and the untenanted rows only for\nsomeone who reads every tenant).\n\nCedar's `read` on Provider::\"{name}\" first (_provider_gate), before\nanything else is parsed — ADP's per-provider check on\nQueryLLMProviderCallFailures — so a forbid on one provider refuses its\nfailures and no other's, and a refused caller learns nothing about which\nnames have any. A named agent is then `read`-gated as GET /usage?agent=\nis: asking for an agent's failures by name is a read of that agent, and\na 403 there beats an empty page that reads as \"it never failed\".","operationId":"provider_call_failures_api_network_providers__name__failures_get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days"}},{"name":"agent","in":"query","required":false,"schema":{"type":"string","default":"","title":"Agent"}},{"name":"agent_name","in":"query","required":false,"schema":{"type":"string","default":"","title":"Agent Name"}},{"name":"user_email","in":"query","required":false,"schema":{"type":"string","default":"","title":"User Email"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Page Size"}},{"name":"page_token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Page Token"}},{"name":"window","in":"query","required":false,"schema":{"type":"string","default":"","title":"Window"}},{"name":"start","in":"query","required":false,"schema":{"type":"string","default":"","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","default":"","title":"End"}},{"name":"start_time","in":"query","required":false,"schema":{"type":"string","default":"","title":"Start Time"}},{"name":"end_time","in":"query","required":false,"schema":{"type":"string","default":"","title":"End Time"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Provider Call Failures Api Network Providers  Name  Failures Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/network/providers/{name}/attention":{"get":{"summary":"Provider Attention","description":"Whether one provider needs attention, and what to do (netobs.attention):\nits failures over the window by reason class, each with the next step\nfor its class, folded per caller — agent, service account or person —\nplus a traffic change against its baseline. The provider page's banner.\n\nThe failures' own gates, in their order: network.failures.read, Cedar\n`read` on the provider before anything is parsed, then the reader's\nscope (agents they may read, direct calls in their tenants), so the\nbanner can never name a caller the failures list would not.","operationId":"provider_attention_api_network_providers__name__attention_get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"window","in":"query","required":false,"schema":{"type":"string","default":"","title":"Window"}},{"name":"start","in":"query","required":false,"schema":{"type":"string","default":"","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","default":"","title":"End"}},{"name":"start_time","in":"query","required":false,"schema":{"type":"string","default":"","title":"Start Time"}},{"name":"end_time","in":"query","required":false,"schema":{"type":"string","default":"","title":"End Time"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Provider Attention Api Network Providers  Name  Attention Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/network/provider-attention":{"get":{"summary":"Providers Attention","description":"netobs.attention_overview: which providers need attention over the\nwindow (default the last 24 hours), in brief — the list page's flag on\neach row, in one call rather than one per row. Only the providers the\ncaller may list (_readable_providers, Cedar's `list` refining `read`)\nare named, and the failures are scoped as on the provider's own page.","operationId":"providers_attention_api_network_provider_attention_get","parameters":[{"name":"window","in":"query","required":false,"schema":{"type":"string","default":"24h","title":"Window"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Providers Attention Api Network Provider Attention Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/network/breakers":{"get":{"summary":"Peer Breakers List","description":"Every peer circuit (peerbreaker): MCP servers, server/tool pairs and\nremote child agents — state, why it tripped, when it may be retried, and\na summary of its window (calls, errors, p95). Never the samples\nthemselves, and nothing a call carried. ``kind`` and ``state`` filter.","operationId":"peer_breakers_list_api_network_breakers_get","parameters":[{"name":"kind","in":"query","required":false,"schema":{"type":"string","default":"","title":"Kind"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","default":"","title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Peer Breakers List Api Network Breakers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/network/breakers/reset":{"post":{"summary":"Peer Breaker Reset","description":"Close one peer circuit by hand, forgetting its window: the operator\nwho fixed the peer need not wait out the cooldown. governance.write, a\nreason required, and on the audit record — closing a breaker sends\ntraffic back to a peer the breaker judged down.","operationId":"peer_breaker_reset_api_network_breakers_reset_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_BreakerReset"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Peer Breaker Reset Api Network Breakers Reset Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/policies":{"get":{"summary":"List Policies Endpoint","description":"Every Cedar policy by name, with what the builder needs beside them.\n\nADP's ListPolicies rides on the same route: `filter` (AIP-160 over name,\ndisplay_name, description, effect, enabled, the timestamps,\ncreated_by/updated_by, tags.<key> and scope.* — any statement matching;\neffect and scope.effect compare case-insensitively, so PERMIT and permit\nboth match), `order_by` (name, display_name, effect, created_at,\nupdated_at; asc or desc, name breaking ties; absent, ADP's default of\ncreated_at desc, name),\n`page_size` (1-100; absent is every match) and `page_token` (bound to the\nfilter and order). Given any of them, `policies` is that page and\n`next_page_token` and `total_size` join it; given none, the answer is\nexactly what it always was. `read_mask` trims each row to the fields it\nnames, the name always among them, in either shape.\n\npolicy.list (access.read includes it). A policy a Cedar policy forbids\nthe caller to `read` is left out (_readable_policies) before the filter\nand the paging, so a page is never short and total_size never counts a\npolicy the caller could not open. Audited as policy.list — how many\nrows, what was asked, never a body.","operationId":"list_policies_endpoint_api_policies_get","parameters":[{"name":"filter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filter"}},{"name":"order_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order By"}},{"name":"page_size","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Page Size"}},{"name":"page_token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Token"}},{"name":"read_mask","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Read Mask"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Policies Endpoint Api Policies Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Create Policy","description":"Create only (ADP's CreatePolicy): a name a policy already holds is a\n409, never a silent overwrite. The console's Create form PUT before, so\ncreating under a taken name replaced that policy — its body, its switch,\nits tags — under an audit row that read as an ordinary save.\n\nThe name is a DNS label (policy.CREATE_NAME_RE); the Cedar comes from\nexactly one of body, spec and template_link and is exactly one statement,\nvalidated by the engine. A create weakens nothing — there is nothing\nstored to switch off — so it takes policy.create alone (access.write\nincludes it), as adding a forbid through PUT does, and Cedar\n`configure` on the policy as it would be stored. 201 with the stored\nrow, its ETag and Location.","operationId":"create_policy_api_policies_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CedarPolicyCreateBody"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Policy Api Policies Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/policies/compile":{"post":{"summary":"Compile Policy","description":"Cedar text and a one-line summary for a builder spec, compiled by the\nreal engine — the live preview under the policy form.","operationId":"compile_policy_api_policies_compile_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Compile Policy Api Policies Compile Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/policies/system":{"get":{"summary":"System Policies Endpoint","description":"The role bindings as read-only Policy resources (ADP's\nListSystemPolicies). `policies` is what this route has always returned,\neach row now a Policy too; `system_policies` is the same list under\nADP's name; `revision_id` is the snapshot both this and\nGET /api/policies/action-groups were read from (policy.system_snapshot).\n\nAIP-160 `filter` over name, principal, role, enabled and cedar_text\n(`cedar_text:\"agents\"` is a case-insensitive substring), AIP-158\n`page_size` (default 50, clamped to 1000, negative a 400) and\n`page_token` (bound to this list, the filter and revision_id), with\nnext_page_token and total_size — the matches, across every page.\n\nsystempolicy.list (access.read and policy.list include it) and Cedar\n`list` on SystemPolicy::\"system\".","operationId":"system_policies_endpoint_api_policies_system_get","parameters":[{"name":"filter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filter"}},{"name":"page_size","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Page Size"}},{"name":"page_token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response System Policies Endpoint Api Policies System Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/policies/action-groups":{"get":{"summary":"Action Groups Endpoint","description":"Every role as the bundle of permissions a system policy's\n`role:<name>` action stands for (ADP's ListActionGroups): the legend for\nGET /api/policies/system, joined by a policy's tags[\"ticketiq.io/role\"]\nto a group's name, with the revision_id both carry for one snapshot.\n\nFiltered (name, display_name, builtin, defined, member_actions —\n`member_actions = \"agents.read\"` holds it, `NOT …` does not) and paged\nas the system policies are, under the same gate: every role and its\npermissions is already readable there, so a narrower one here would\nhide nothing, and a wider one would hand the org's role names to whoever\nlacks it.","operationId":"action_groups_endpoint_api_policies_action_groups_get","parameters":[{"name":"filter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filter"}},{"name":"page_size","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Page Size"}},{"name":"page_token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Action Groups Endpoint Api Policies Action Groups Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/permissions":{"get":{"summary":"Agent Permissions","description":"Both directions for one agent: who may act ON it, and what it may do\nas its own principal.","operationId":"agent_permissions_api_agents__key__permissions_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Permissions Api Agents  Key  Permissions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/permissions/keep-access":{"post":{"summary":"Agent Keep Access","description":"What the Permissions tab asks before saving an agent's first\nprincipal-side policy (_keep_people_access).","operationId":"agent_keep_access_api_agents__key__permissions_keep_access_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Keep Access Api Agents  Key  Permissions Keep Access Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/permissions/defaults":{"post":{"summary":"Agent Permission Defaults","description":"Create the least-privilege policies for one of Liya's subagents\n(agenttree.LEAST_PRIVILEGE): Forbids on what its job never needs — Scribe\nmay not call tools, so it cannot close a ticket. A policy already under\nthe name is left as it is. Each is audited as policy.save.","operationId":"agent_permission_defaults_api_agents__key__permissions_defaults_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Permission Defaults Api Agents  Key  Permissions Defaults Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/policies/{name}":{"put":{"summary":"Put Policy","description":"Create-or-replace, the whole record — the upsert scripts were written\nagainst, kept as it was. POST creates only and PATCH changes only the\nfields its update_mask names. `If-None-Match: *` makes this a create\ntoo: a policy already under the name is a 412, with nothing written.\n\npolicy.update when the name is taken and policy.create when it is not\n(_policy_write_permission) — access.write includes both. Cedar\n`configure` on the policy first, before its existence is looked at, and\nagain on it as the save would store it. A create racing this one is the\n409 of _unchanged: `before` was None when the permission was judged.","operationId":"put_policy_api_policies__name__put","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CedarPolicyBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Policy Api Policies  Name  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Patch Policy","description":"Field-mask update (ADP's UpdatePolicy). `update_mask` (a list, or one\ncomma-separated string) is required and names the fields to write —\ndisplay_name, description, body, spec, template_link, tags, enabled —\nand every other field keeps what is stored; one the mask leaves out is\nignored even when the body sends it (policy.patched). An empty mask, an\nunknown path or two body sources is a 400; an unknown name a 404, since\nPATCH never creates.\n\nThe merged record then takes PUT's path: compiled and validated, judged\nfor weakening against the stored one (disabling any enabled policy, or\nrewriting an enabled forbid, needs governance.weaken and a reason),\nwritten under the registry lock with scope and version recomputed, and\nrefused (412) when If-Match names a version that is no longer stored.\nAudited as policy.update — policy.disable when it switches one off —\nwith the mask and the record before and after.\n\npolicy.update (access.write includes it), and Cedar `configure` on the\npolicy as stored — before it is looked up — and as the merge would\nleave it.","operationId":"patch_policy_api_policies__name__patch","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Patch Policy Api Policies  Name  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Policy","description":"Deleting an enabled policy weakens for the reason disabling one does\n(see _cedar_weakening); a disabled one decides nothing, so it goes freely.\npolicy.delete (access.write includes it), and Cedar `configure` on the\npolicy, before it is looked up.","operationId":"delete_policy_api_policies__name__delete","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ReasonBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Policy Api Policies  Name  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Get Policy Endpoint","description":"One Cedar policy (ADP's GetPolicy): the stored record with its derived\nscope, attribution and tags, and its etag — also the ETag header, the\nIf-Match a later PUT or DELETE sends back. read_mask trims it to the\nfields named (the name always among them); an unknown field is a 400.\n\npolicy.get (access.read includes it), then Cedar `read` on the policy,\nbefore it is looked up: a refusal is the same 404 as a name nobody saved,\nso a hidden policy is not confirmed to exist. Audited as policy.get —\nwhich policy and which fields, never its body.","operationId":"get_policy_endpoint_api_policies__name__get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"read_mask","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Read Mask"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Policy Endpoint Api Policies  Name  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/policies/{name}/shadow-hits":{"get":{"summary":"Policy Shadow Hits","description":"What a log-only policy would have refused: the running total and the\nnewest samples (at most shadow.MAX_SAMPLES), newest first. policy.get\nand Cedar `read` on the policy, as reading the policy itself.","operationId":"policy_shadow_hits_api_policies__name__shadow_hits_get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Policy Shadow Hits Api Policies  Name  Shadow Hits Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/policies/{name}/promote":{"post":{"summary":"Promote Policy","description":"Switch a log-only policy to enforce — one click, gated by what it was\nseen to do: a policy that would have refused requests while in log-only\nmode is promoted only with acknowledge_would_deny equal to that count\n(_promotion_gate). A policy already enforcing is a 409.\n\nTakes PATCH's path for the one field (policy.patched, _save_cedar):\npolicy.update, Cedar `configure` on the policy as stored and as\npromoted, the gitops guard, If-Match. Promotion only ever makes a\npolicy decide, so it needs no weakening reason. The would-deny evidence\nis cleared — from now on the policy's refusals are decisions, audited as\nsuch — and the promotion is audited as policy.promote with the count\nit was promoted over.","operationId":"promote_policy_api_policies__name__promote_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/PromoteBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Promote Policy Api Policies  Name  Promote Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/policies/validate":{"post":{"summary":"Validate Policy","description":"Compile without storing, so the editor can say what is wrong while the\noperator is still typing rather than on save. For whoever may write a\npolicy — create or update, the two the editor is open for. `diagnostics` says it in\nstructured form (policy.diagnose) — every finding, errors and the\nschema's warnings, each with its statement and where that starts,\ncounted in `body` exactly as sent.","operationId":"validate_policy_api_policies_validate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CedarPolicyBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Validate Policy Api Policies Validate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/policies/analyze":{"post":{"summary":"Analyze Policies","description":"Automated reasoning over the policy set (policy.analyze) — as it\nstands, or as `draft` would leave it: which statements can never match,\nare shadowed by a forbid, repeat or add nothing to another, or grant far\nmore than meant; whether an agent is left that no owner may configure or\ncontain (`lockout`); and, for a draft, what each principal gains and\nloses.\n\npolicy.list, and — as for the effective set it analyses — only for a\ncaller who may `read` every enabled policy: a finding names the policy it\nis about, and one hidden from the caller would be named here. The\nper-principal `diff` lists who may do what, which is the access reader's\nto see (access.read); without it the diff is left out and `diff_withheld`\nsays why; the rows it keeps name only agents, servers, clients and other\nrecords the caller may read (_analysis_visible), and `diff_withheld_rows`\ncounts the rest. `blocking` is a new lockout the caller has not\noverridden: what the console's editor refuses to save unticked.\n\nAdvisory: nothing is stored, and the policy write routes do not run it.\nA lockout is refused by the console's editor, not by the API — a\nchange saved through the API directly is not analysed, so a script that\nwrites policies should ask here first.","operationId":"analyze_policies_api_policies_analyze_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PolicyAnalyzeBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Analyze Policies Api Policies Analyze Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/permissions/schema":{"get":{"summary":"Permissions Schema","description":"The Cedar schema and the entity/verb catalogue, plus the RBAC\npermission list. Names verbs and entities, never decisions — so it needs\na session and nothing more.\n\nread_mask (repeated or comma-separated) narrows the answer to the fields\nnamed, and only those are computed; an unknown field is a 400 so a typo\nnever reads as \"the server has no such data\". The ETag is the\nschema_version, so a client revalidates with If-None-Match and gets a 304\nuntil the catalogue itself changes.","operationId":"permissions_schema_api_permissions_schema_get","parameters":[{"name":"read_mask","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Read Mask"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Permissions Schema Api Permissions Schema Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/permissions/check":{"post":{"summary":"Permissions Check","description":"Would I be allowed? Through both layers, and a denial names what denied\nit — the missing role permission, or the Cedar policy. Advisory: every\nreal request is still enforced.\n\nEvery (entity, verb) the schema route catalogues is checkable, in the\nmode its catalogue row names (policy.check_mode):\n- self: the caller asks about itself. With a name, on that resource; with\n  an empty name, on a top-level kind at TYPE scope — may I configure\n  agents at all — which RBAC and any type-wide policy answer.\n- agent: the caller asks what an agent could do — agents/{a}/providers/\n  {p}, agents/{a}/mcpservers/{s}, agents/{a} for its own token. Only for\n  an agent the caller may read; otherwise the answer is a \"read\" denial\n  that says nothing about the policies on the rest. Answered as the gate\n  the agent meets answers it: a contained agent is refused (kill_switch),\n  and what only the agent's own call can supply — its address, its\n  channel, the model on a provider it is not bound to — is left out and\n  named in the reason when a policy that could apply reads it. A tool on\n  any server but TicketIQ's own is answered as the runtime decides it:\n  the server, the agent's tool list for it, then the tool.\n  A verb both perform (call_tool on a tool) takes either name.\n- none: a verb neither a person nor an agent performs is refused.\nA child entity's verb (a Tool, under its McpServer) may also be named by\nthe PARENT — mcpservers/{s}, or agents/{a}/mcpservers/{s} — the catalogue's\nparent_check_name_pattern: scope \"parent\", answered as the gate that\nfilters the parent's children answers it (_tool_parent_check: which of\nTicketIQ's own tools would be offered, listed in `tools`; for any other\nserver, the gate that offers all of its tools or none, and then its\nrecord: one missing, disabled or paused is denied — not_found, disabled,\npaused — as it contributes nothing, and a paused or drifted tool is\nlisted in `withheld`).\nEach result says which it was (scope, and as — the agent answered for),\nand `errors` names any statement Cedar skipped because its condition\ncould not be evaluated for the request.\n\nA pair outside the catalogue, or a name that does not fit its pattern,\nfails the whole request (400) before anything is evaluated: a typo must\nnot read as \"no access\".\n\nWhat-if (Entra's What If, for both layers and every principal kind): with\n`principal` and/or `context` every check is answered for that principal,\nin that context, instead of for the caller as they are now — through the\nsame functions, so the answer is the one its gates would give:\n- a User: as that person, with their role (RBAC and Cedar), exactly as\n  their own check would answer them — agent checks included, through\n  the read gate THEY would meet.\n- an Agent: as that agent, each check named as the resource is\n  (providers/p, mcpservers/s/tools/t, or the agents/{a}/… form),\n  answered as an agent check (_agent_check) — kill switch first — for an\n  agent the caller may read. A verb no agent performs is refused\n  (denied_by \"principal\"), never evaluated as one.\n- a Client: its one verb, invoke on an agent, as A2A and a webhook\n  trigger decide it — enabled, the agents.invoke scope, the resources\n  it may reach, the agent's kill switch, then Cedar.\n`context` lays ip, hour, weekday, channel and model over whatever\ncontext each check's gate builds (policy.what_if). access.read — who\nmay do what is the access reader's to see — and audited as\npermissions.what_if, refusals included. Naming yourself with no context\nis an ordinary check.","operationId":"permissions_check_api_permissions_check_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PermissionCheckBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Permissions Check Api Permissions Check Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/playground/simulate":{"post":{"summary":"Agent Playground Simulate","description":"Simulate-as: would THIS person (or client) be let run this agent,\nfrom where, when, through which channel — answered by the permission\ncheck's what-if (permissions_check), so it is the answer the playground's\nown gates would give them: RBAC agents.operate, then Cedar `invoke` on\nthe agent in their context. The channel defaults to the playground's.\n\nA dry run by design: nothing is sent to a model and nothing runs as\nthem. Running an agent as someone else would be acting as them —\ntheir data, their tools, their budget — which no operator is granted.\nIt needs what any what-if needs (access.read, audited as\npermissions.what_if), and Cedar `read` on the agent first, so the answer\nnever tells someone about an agent they may not see.","operationId":"agent_playground_simulate_api_agents__key__playground_simulate_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaygroundSimulateBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Playground Simulate Api Agents  Key  Playground Simulate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/policy-postures":{"get":{"summary":"Get Policy Postures","description":"The Cedar postures in force (policy.postures): off, the additive\ncontract; invoke_default_deny, no agent is invokable without a permit;\nstrict, Cedar's default deny on every check.","operationId":"get_policy_postures_api_policy_postures_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Policy Postures Api Policy Postures Get"}}}}}},"put":{"summary":"Put Policy Postures","description":"Switch a posture. Turning one OFF widens access and so needs a\nreason (a weakening, audited as one); turning strict ON is refused\nunless the caller could still configure agents under it — the lockout\nguard (policy.save_postures).","operationId":"put_policy_postures_api_policy_postures_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PosturesBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Put Policy Postures Api Policy Postures Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/policies/effective":{"get":{"summary":"Effective Policy Set","description":"Every enabled policy's Cedar text, as evaluated (ADP's\nListEffectivePolicySets). The body is the one set, as it always was —\nname, etag, policies and cedar — and the same set again as the list\nADP's RPC returns, effective_policy_sets with total_size 1. read_mask\n(name, etag, policies, cedar_text) trims both; `name,etag` carries no\nCedar. ETag / If-None-Match as on Get.","operationId":"effective_policy_set_api_policies_effective_get","parameters":[{"name":"read_mask","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Read Mask"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Effective Policy Set Api Policies Effective Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/policies/effective/{set_id}":{"get":{"summary":"Get Effective Policy Set","description":"One effective policy set by name (ADP's GetEffectivePolicySet):\neffectivePolicySets/`set_id`. Only `default` exists; any other\nwell-formed id is a 404 and a malformed one a 400 — both after the\npermission, before Cedar, since neither says anything about the set.","operationId":"get_effective_policy_set_api_policies_effective__set_id__get","parameters":[{"name":"set_id","in":"path","required":true,"schema":{"type":"string","title":"Set Id"}},{"name":"read_mask","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Read Mask"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Get Effective Policy Set Api Policies Effective  Set Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/policy-templates":{"get":{"summary":"List Policy Templates","description":"Every policy template (ADP's ListPolicyTemplates): `filter` (AIP-160\nover name, display_name, description, actions and builtin), `order_by`\n(name or display_name, asc or desc; name by default and as tie-break),\n`page_size` (1-100; absent is every match), `page_token` (bound to the\nfilter and order) and `read_mask`, with next_page_token and total_size\nalways beside the page. A bad query is a 400 that says which part.\n\nWith custom templates on, they are listed after the built-ins' names\nsort among them, `custom_templates` says so (the console's cue to offer\nNew, Edit and Delete), and read_mask may name what a stored template\ncarries beside (policy.CUSTOM_TEMPLATE_FIELDS).","operationId":"list_policy_templates_api_policy_templates_get","parameters":[{"name":"filter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filter"}},{"name":"order_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order By"}},{"name":"page_size","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Page Size"}},{"name":"page_token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Token"}},{"name":"read_mask","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Read Mask"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Policy Templates Api Policy Templates Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Create Policy Template","description":"A custom policy template (ADP's CreatePolicyTemplate), with custom\ntemplates on — 404 otherwise. The name is a DNS label that neither a\nbuilt-in nor another template holds (409); the text is one Cedar\nstatement with ?principal, ?resource or both, at most 65536 characters,\nand is validated by instantiation — bound to a sample principal and\nresource and compiled as a policy — with a refusal's diagnostics beside\nits detail. A new template is linked by nothing, so it changes no one's\naccess: access.write alone. 201 with the record, its ETag and Location.","operationId":"create_policy_template_api_policy_templates_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PolicyTemplateCreateBody"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Policy Template Api Policy Templates Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/policy-templates/{name}":{"get":{"summary":"Get Policy Template","description":"One policy template (ADP's GetPolicyTemplate): its Cedar text with the\nslots a link binds, the actions it bundles and whether it is built in.\nread_mask trims it (read_mask=name,display_name leaves the text out); an\nunknown field is a 400 and an unknown template a 404 — a custom one too,\nwhile custom templates are off.","operationId":"get_policy_template_api_policy_templates__name__get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"read_mask","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Read Mask"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Policy Template Api Policy Templates  Name  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Patch Policy Template","description":"Field-mask update of a custom template (ADP's UpdatePolicyTemplate),\nwith custom templates on — 404 otherwise, and for a built-in, which is\ncode. `update_mask` is required and names display_name, description or\ncedar_text; If-Match, when sent, must name the stored version (412).\n\nNew text is checked as a create's is, then linked into every policy\nthat links the template, each compiled as any policy is. All or none:\none the new text cannot be linked into refuses the whole edit (400,\n`relink_failures` naming each and why), and the template and its\npolicies are written together under the registry lock. A rewrite of an\nenforced forbid among them weakens it, as editing that policy would\n(_cedar_weakening): it takes governance.weaken and a reason. Audited as\npolicytemplate.update, and policy.relink for each policy rewritten.\nAnswers the template with `relinked`, the policies whose text changed.","operationId":"patch_policy_template_api_policy_templates__name__patch","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Patch Policy Template Api Policy Templates  Name  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Policy Template","description":"Delete a custom template (ADP's DeletePolicyTemplate), with custom\ntemplates on — 404 otherwise, and for a built-in. Refused with 409 —\nADP's FAILED_PRECONDITION — while any policy links to it, naming them\n(`linked_policies`): the link would dangle. Checked under the registry\nlock every policy write holds, so a link landing meanwhile is either\nseen here or refused by its own save. If-Match, when sent, must name\nthe stored version (412). A template nothing links decides nothing, so\ndeleting it weakens nothing and takes no reason.","operationId":"delete_policy_template_api_policy_templates__name__delete","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Policy Template Api Policy Templates  Name  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/clients/cimd":{"get":{"summary":"Get Cimd","description":"The registration settings, as far as the caller may read them:\nclients.cimd.read shows the CIMD half, clients.dcr.read the DCR half\n(clients.read, which every role that read them before holds, shows\nboth). Cedar `read` on every half shown: a forbid on either is a\nrefusal of the answer, never a quietly shorter one — a half is left out\nonly for want of its RBAC permission, and `halves` says which are here.","operationId":"get_cimd_api_clients_cimd_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Cimd Api Clients Cimd Get"}}}}}},"put":{"summary":"Put Cimd","description":"Save the registration settings. clients.cimd.write for a change to\nthe CIMD half, clients.dcr.write for one to the DCR half (both implied\nby clients.settings.write), never clients.write: who may admit clients\nis not who may edit one, and who may trust a host's metadata document\nis not who may open self-registration.\n\nCedar `configure` on the half of the record the save changes — the\nCIMD trust (the switch, the trust policy, the allowlists) and the DCR\nadmission (mode, issuers, cap, rate, sweeper, default scopes) — judged on\nthe record as the save would store it (agentgw.changed_settings), not on\nwhich fields the form sent, since the console sends them all. A save\nthat changes nothing is checked on both: it is a write of the whole\nrecord, and a caller forbidden either half has no business making it.","operationId":"put_cimd_api_clients_cimd_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CimdBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Put Cimd Api Clients Cimd Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/clients/initial-tokens":{"get":{"summary":"List Initial Tokens Endpoint","operationId":"list_initial_tokens_endpoint_api_clients_initial_tokens_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Initial Tokens Endpoint Api Clients Initial Tokens Get"}}}}}},"post":{"summary":"Mint Initial Token Endpoint","description":"An invitation to self-register one client. Shown once.","operationId":"mint_initial_token_endpoint_api_clients_initial_tokens_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InitialTokenBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Mint Initial Token Endpoint Api Clients Initial Tokens Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/clients/initial-tokens/{iat_id}":{"delete":{"summary":"Revoke Initial Token Endpoint","description":"ADP's RevokeInitialAccessToken. 200 for any invitation that exists:\nan active one is revoked, and one already revoked, consumed or expired\nis left as it was (changed false) — so a retried DELETE, or one racing\nthe registration that spent it, is not an error, and a consumed\ninvitation still says who consumed it. 404 only for an id never minted.","operationId":"revoke_initial_token_endpoint_api_clients_initial_tokens__iat_id__delete","parameters":[{"name":"iat_id","in":"path","required":true,"schema":{"type":"string","title":"Iat Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Revoke Initial Token Endpoint Api Clients Initial Tokens  Iat Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/clients":{"get":{"summary":"List Inbound Clients","description":"ADP's ListOAuthClients: narrowed on the server by name_contains (id or\nlabel) and an AIP-160 filter, ordered by order_by, paged with signed\nkeyset tokens bound to the query. No parameters is the whole list by id,\nas before, plus next_page_token and total_size; the scope catalogue and\nthe well-known setups ride along on every page.\n\nclients.read, which it once was agents.read: the list is an inventory\nof who may call in and where their sign-in codes go, and a viewer's\noperational reads do not cover it. A client a Cedar policy forbids the\ncaller to `read` is left out (_readable_clients) before the filter and\nthe paging, so a page is never short and total_size never counts a\nclient the caller could not open.","operationId":"list_inbound_clients_api_clients_get","parameters":[{"name":"name_contains","in":"query","required":false,"schema":{"type":"string","default":"","title":"Name Contains"}},{"name":"filter","in":"query","required":false,"schema":{"type":"string","default":"","title":"Filter"}},{"name":"order_by","in":"query","required":false,"schema":{"type":"string","default":"","title":"Order By"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Page Size"}},{"name":"page_token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Page Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Inbound Clients Api Clients Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Create Inbound Client","description":"ADP's CreateOAuthClient: create only. A client already stored under the\nid is 409 ALREADY_EXISTS and is left exactly as it was — unlike PUT, which\nreplaces it, so the console's Add client can never overwrite a client whose\nid an operator happened to retype. A new id must be in the strict ADP\nformat (agentgw.STRICT_CLIENT_ID_RE); a stored legacy id stays editable\nthrough PUT and PATCH.","operationId":"create_inbound_client_api_clients_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboundClientCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Inbound Client Api Clients Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/clients/{client_id}/token":{"delete":{"summary":"Revoke Inbound Client Token","description":"Stop a client's token working immediately — a lost laptop, a leaked\nconfig file — without deleting the client.\n\nThe same call as revoke-all below, under its older name and audit action.\nIt ends every person's OAuth grant to the client too: the operator pressing\nit is cutting the CLIENT off, and a laptop that leaked its config leaked\nits users' refresh tokens along with it. Idempotent since revoke-all: a\nclient with nothing live answers 200 and revoked_count 0, where it used to\nbe a 404 that a retry after a lost response could not tell from a typo.","operationId":"revoke_inbound_client_token_api_clients__client_id__token_delete","parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Revoke Inbound Client Token Api Clients  Client Id  Token Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Issue Inbound Client Token","description":"A new bearer for the client, replacing its last. Cedar `configure`:\nhanding a client a credential changes what it can do, where `revoke`\nonly takes that away.","operationId":"issue_inbound_client_token_api_clients__client_id__token_post","parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}},{"name":"ttl_hours","in":"query","required":false,"schema":{"type":"number","default":72.0,"title":"Ttl Hours"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Issue Inbound Client Token Api Clients  Client Id  Token Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/clients/{client_id}/revoke-all":{"post":{"summary":"Revoke All Inbound Client Tokens","description":"ADP's RevokeAllTokens: end the client's own token and every token it\nholds for its users, so each of them has to sign in again, and say how\nmany live ones that was. Idempotent (a repeat answers 0); 404 only for a\nclient that does not exist; the client stays registered. Cedar `revoke`,\nnot `configure`: cutting a client off is an incident responder's act,\nwhich a policy may allow someone who may not edit the client.","operationId":"revoke_all_inbound_client_tokens_api_clients__client_id__revoke_all_post","parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Revoke All Inbound Client Tokens Api Clients  Client Id  Revoke All Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/clients/{client_id}":{"get":{"summary":"Get Inbound Client","operationId":"get_inbound_client_api_clients__client_id__get","parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Inbound Client Api Clients  Client Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Patch Inbound Client","description":"ADP's UpdateOAuthClient. Unlike PUT it never creates, and it changes only\nwhat the mask names, so two operators editing different fields do not\noverwrite each other.","operationId":"patch_inbound_client_api_clients__client_id__patch","parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboundClientPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Patch Inbound Client Api Clients  Client Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Put Inbound Client","description":"Create or replace, kept for every script written against it. The\npreconditions make it safe to share: If-None-Match: * is create-only (412\nwhen the id is taken, as POST /clients says 409), and If-Match with the\netag GET returned refuses (412) a save over a record changed since.","operationId":"put_inbound_client_api_clients__client_id__put","parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboundClientBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Inbound Client Api Clients  Client Id  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Inbound Client","operationId":"delete_inbound_client_api_clients__client_id__delete","parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Inbound Client Api Clients  Client Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/clients/{client_id}/secret":{"post":{"summary":"Rotate Inbound Client Secret","description":"A new client secret for a confidential client, shown once; the old one\nstops working at /oauth/token at once. Grants already made through the\nclient are left alone — their refresh tokens are bound to the client, and\nthe next refresh needs the new secret anyway; ending them too is what\nrevoke-all is for. Cedar `configure`, as issuing a token is: a secret is\na credential that lets the client act. 409 for a client without a\nrecognised confidential method: a public one has no secret (switching\nits token_endpoint_auth_method mints one), and a damaged one is not given\na secret for a method nobody can name.","operationId":"rotate_inbound_client_secret_api_clients__client_id__secret_post","parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Rotate Inbound Client Secret Api Clients  Client Id  Secret Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{parent}/delegate/{child}":{"post":{"summary":"Delegate To Subagent","description":"Run `child` as a subagent of `parent`, under the PARENT's budget.\n\nThis is what makes the relationship real rather than decorative. A\nsubagent that spent from its own budget would let a parent route around\nits cap by delegating, which is the one thing a spend limit exists to\nprevent — so the budget is checked against the parent before the child\nruns, and the child's tokens are metered to the parent.\n\nThe child's own provider binding and guardrails still apply: delegation\nchanges who PAYS, not what the child is allowed to say or which model it\nis allowed to use. On top of those, three checks here keep a subagent\nfrom being the way round a restriction placed on its parent: the caller\nmay invoke the child as well as the parent, the child may be delegated\nto, and the PARENT may call_model on every provider the child can reach\nfor it — the child's own binding and, for a managed child, each of its\nruntime subagents' bindings.\n\nThat is not yet the full intersection of both ends. The parent's\ncall_tool forbids are not applied (the managed runtime checks MCP servers\nagainst the child alone), and a parent whose profile is disabled is not\nrefused here. Carrying the parent into the child's governed steps would\nclose both.","operationId":"delegate_to_subagent_api_agents__parent__delegate__child__post","parameters":[{"name":"parent","in":"path","required":true,"schema":{"type":"string","title":"Parent"}},{"name":"child","in":"path","required":true,"schema":{"type":"string","title":"Child"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DelegateBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delegate To Subagent Api Agents  Parent  Delegate  Child  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/gateway/blueprints":{"get":{"summary":"Gateway Blueprints","description":"Prebuilt agent definitions an operator can add with one click.","operationId":"gateway_blueprints_api_gateway_blueprints_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Gateway Blueprints Api Gateway Blueprints Get"}}}}}}},"/api/gateway/blueprints/{key}/install":{"post":{"summary":"Install Blueprint","operationId":"install_blueprint_api_gateway_blueprints__key__install_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlueprintInstallBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Install Blueprint Api Gateway Blueprints  Key  Install Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/gateway/agents/{agent_id}/convert":{"post":{"summary":"Convert Gateway Agent","description":"Change who runs an agent — managed by TicketIQ, or self-managed —\nthe one change PUT refuses. Nothing else moves: its label, tags, prompt\nand credentials are kept as every save keeps them, and its managed\nruntime configuration and lifecycle stay stored — read only while it is\nmanaged, so converting back finds them as they were.\n\nCedar `update` (with the `configure` it refines) on both ends, as a PUT\nis gated: the agent as it is, and as it would be — so a forbid on\nmanaged agents refuses turning one\ninto managed, and a forbid on self-managed ones the reverse, which is\nwhat a policy scoped on `kind` exists to stop.","operationId":"convert_gateway_agent_api_gateway_agents__agent_id__convert_post","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentConvertBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Convert Gateway Agent Api Gateway Agents  Agent Id  Convert Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent-change-requests":{"get":{"summary":"Agent Change Requests","description":"Change requests, newest first — the ones on agents the caller may\n`get` — with the setting in force.","operationId":"agent_change_requests_api_agent_change_requests_get","parameters":[{"name":"agent","in":"query","required":false,"schema":{"type":"string","maxLength":128,"default":"","title":"Agent"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","maxLength":16,"default":"","title":"Status"}},{"name":"kind","in":"query","required":false,"schema":{"type":"string","maxLength":16,"default":"","title":"Kind"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Change Requests Api Agent Change Requests Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent-change-requests/{rid}":{"get":{"summary":"Agent Change Request","operationId":"agent_change_request_api_agent_change_requests__rid__get","parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","title":"Rid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Change Request Api Agent Change Requests  Rid  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent-change-requests/{rid}/approve":{"post":{"summary":"Approve Agent Change","description":"Approve: intake makes the agent callable; a change is replayed\nthrough its route as the approver; an offboarding retires the agent.\nRefused (403) to the requester and to anyone without Cedar `promote`;\na change whose live values moved since it was filed is marked stale\n(409) and never applied.","operationId":"approve_agent_change_api_agent_change_requests__rid__approve_post","parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","title":"Rid"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ChangeDecisionBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Approve Agent Change Api Agent Change Requests  Rid  Approve Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent-change-requests/{rid}/reject":{"post":{"summary":"Reject Agent Change","description":"Reject: nothing is applied. A rejected intake leaves the agent\nrefused (delete it, or re-create it for a new review). The same four\neyes as an approval: the requester withdraws instead.","operationId":"reject_agent_change_api_agent_change_requests__rid__reject_post","parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","title":"Rid"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ChangeDecisionBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reject Agent Change Api Agent Change Requests  Rid  Reject Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent-change-requests/{rid}/withdraw":{"post":{"summary":"Withdraw Agent Change","description":"Withdraw: the requester's own, and only theirs.","operationId":"withdraw_agent_change_api_agent_change_requests__rid__withdraw_post","parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","title":"Rid"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ChangeDecisionBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Withdraw Agent Change Api Agent Change Requests  Rid  Withdraw Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/offboard":{"post":{"summary":"Offboard Agent","description":"File an agent's retirement. Nothing happens until someone else\napproves it: then its token and credentials are revoked, its triggers\nswitched off and its kill switch engaged. agents.delete and Cedar\n`delete` to file, as a delete would need.","operationId":"offboard_agent_api_agents__key__offboard_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/OffboardBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Offboard Agent Api Agents  Key  Offboard Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/gateway/safety-preamble":{"get":{"summary":"Get Safety Preamble","operationId":"get_safety_preamble_api_gateway_safety_preamble_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Safety Preamble Api Gateway Safety Preamble Get"}}}}}},"put":{"summary":"Put Safety Preamble","description":"Set the estate-wide safety preamble every agent's calls are framed\nby (agentspec.with_instructions). Clearing it, or replacing it with a\ntext that drops any of its lines, removes a control from every agent at\nonce: governance.weaken and a reason, as switching off any control is.\n\nAny other change to a preamble already set takes a reason too, and the\naudit row carries the lines added: a line added can undo every line\nkept (\"ignore the rules above\"), which no line-by-line diff calls a\ndrop, so a reviewer must be able to read what was added and why. Only\nthe first text, on an empty preamble, is written without one.","operationId":"put_safety_preamble_api_gateway_safety_preamble_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SafetyPreambleBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Put Safety Preamble Api Gateway Safety Preamble Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/gateway/agent-tombstones":{"get":{"summary":"Agent Tombstones","description":"Deleted agents, newest first; `agent` narrows to one id's (an id\nmay have been deleted, re-created and deleted again).","operationId":"agent_tombstones_api_gateway_agent_tombstones_get","parameters":[{"name":"agent","in":"query","required":false,"schema":{"type":"string","default":"","title":"Agent"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Tombstones Api Gateway Agent Tombstones Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/gateway/agents/{agent_id}/token":{"post":{"summary":"Issue Gateway Token","description":"Mint a token, returned ONCE. Only its hash is stored, and issuing\nreplaces any previous token so rotation revokes the old one immediately.","operationId":"issue_gateway_token_api_gateway_agents__agent_id__token_post","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Issue Gateway Token Api Gateway Agents  Agent Id  Token Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Revoke Gateway Token","operationId":"revoke_gateway_token_api_gateway_agents__agent_id__token_delete","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Revoke Gateway Token Api Gateway Agents  Agent Id  Token Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/credentials":{"get":{"summary":"Agent Credentials","description":"An agent's credentials — ADP's ListAgentCredentials. Cedar `list` on\nthe agent's credentials as a whole (policy.LIST_SCOPE), then on each\none, both decided with `read` on the agent (policy.REFINES): a refusal\nof the whole is a 403, and one credential a policy keeps from the caller\nis left out of the list and the count.","operationId":"agent_credentials_api_agents__key__credentials_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Credentials Api Agents  Key  Credentials Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Create Agent Credential","description":"The secret is in this response and nowhere else, ever.\n\nCedar `create` on the credential it would mint — its id drawn before the\ncheck, so a policy is judged on the very AgentCredential that lands —\ndecided with `configure` on the agent (policy.REFINES).","operationId":"create_agent_credential_api_agents__key__credentials_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CredentialBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Agent Credential Api Agents  Key  Credentials Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/credentials/{cred_id}":{"get":{"summary":"Get Agent Credential","description":"One credential's metadata — ADP's GetAgentCredential; never its\nsecret, which was shown once. Cedar `get` on it, decided with `read` on\nthe agent (policy.REFINES), BEFORE the lookup: a caller the policy keeps\nout learns nothing of which ids are live.","operationId":"get_agent_credential_api_agents__key__credentials__cred_id__get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"cred_id","in":"path","required":true,"schema":{"type":"string","title":"Cred Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Agent Credential Api Agents  Key  Credentials  Cred Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Patch Agent Credential","description":"Change what a credential says it is for — ADP's UpdateAgentCredential\non its description. Cedar `update` on it (with `configure` on the agent),\nbefore the lookup, as GET is gated. Audited with the description either\nside.","operationId":"patch_agent_credential_api_agents__key__credentials__cred_id__patch","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"cred_id","in":"path","required":true,"schema":{"type":"string","title":"Cred Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CredentialPatchBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Patch Agent Credential Api Agents  Key  Credentials  Cred Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Agent Credential","description":"Delete one named credential, idempotently — ADP's DeleteAgentCredential.\nA credential that is not there is already revoked: 200 with\n`existed: false` and no audit row, since nothing changed — so a rotation\nscript retried after a lost response does not fail on its own success.\n\nThe agent is still checked first (an unknown one is a 404, not a quiet\nsuccess that would hide a mistyped key), and so is Cedar `delete` on the\ncredential (with `configure` on the agent), whether or not it exists:\notherwise the answer would tell a caller the policy keeps out which\ncredential ids are live.","operationId":"delete_agent_credential_api_agents__key__credentials__cred_id__delete","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"cred_id","in":"path","required":true,"schema":{"type":"string","title":"Cred Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Agent Credential Api Agents  Key  Credentials  Cred Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/keys":{"get":{"summary":"Agent Keys","description":"The public keys an agent signs client assertions with, and how to use\nthem: the token URL (the assertion's aud) and its iss/sub.","operationId":"agent_keys_api_agents__key__keys_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Keys Api Agents  Key  Keys Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Register Agent Key","description":"Register a public JWKS — pasted, or a jwks_uri the agent publishes,\nfetched through safe_http when an assertion names it. Private material,\nHMAC keys and RSA under 2048 bits are refused (idp.clean_jwks). Cedar\n`create` on the AgentCredential that will land, its id drawn first.","operationId":"register_agent_key_api_agents__key__keys_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentKeyBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Register Agent Key Api Agents  Key  Keys Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/keys/{key_id}":{"delete":{"summary":"Delete Agent Key","description":"Remove a key, idempotently as a credential is; access tokens minted\nwith it stop working at once.","operationId":"delete_agent_key_api_agents__key__keys__key_id__delete","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Agent Key Api Agents  Key  Keys  Key Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/secrets":{"put":{"summary":"Put Agent Secrets","description":"Switch the agent's shared secrets off (or back on). Off, its legacy\ntoken and named credentials are refused as bearers and at the token\nendpoint, and every access token minted from one stops working: only a\nregistered key or a federated identity gets in. Turning them back on\nre-admits secrets, so it needs a reason, which is audited. Cedar\n`configure` on the agent, as its exchange-only flag is.","operationId":"put_agent_secrets_api_agents__key__secrets_put","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretsSwitchBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Agent Secrets Api Agents  Key  Secrets Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/gateway/sightings":{"get":{"summary":"List Caller Sightings","description":"Callers the gateway, MCP, A2A and OTLP ingest turned away for a\ncredential nobody here issued (sightings.py) — Entra's shadow-agent\ndiscovery: an agent already running against the estate, ungoverned.\nMost recently seen first; a window (the network graph's) bounds when\nthey were last seen. Instance-wide: a sighting has no tenant, so a\ncaller confined to one is refused rather than shown every tenant's.","operationId":"list_caller_sightings_api_gateway_sightings_get","parameters":[{"name":"include_promoted","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Promoted"}},{"name":"window","in":"query","required":false,"schema":{"type":"string","default":"","title":"Window"}},{"name":"start_time","in":"query","required":false,"schema":{"type":"string","default":"","title":"Start Time"}},{"name":"end_time","in":"query","required":false,"schema":{"type":"string","default":"","title":"End Time"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Caller Sightings Api Gateway Sightings Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/gateway/sightings/{fingerprint}/promote":{"post":{"summary":"Promote Caller Sighting","description":"Register the agent a sighting was: a self-managed agent, created\nthrough PUT /gateway/agents/{id} itself — so every control on a create\n(agents.create, Cedar `create`, required tags, the id rule) applies as\nit would to one typed in by hand. Create only: an id already registered\nis a 409, never an edit of that agent. No credential is issued — the\none the caller holds is not ours to accept — so it still has to be given\none before it gets through.","operationId":"promote_caller_sighting_api_gateway_sightings__fingerprint__promote_post","parameters":[{"name":"fingerprint","in":"path","required":true,"schema":{"type":"string","title":"Fingerprint"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SightingPromoteBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Promote Caller Sighting Api Gateway Sightings  Fingerprint  Promote Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/telemetry/feedback":{"get":{"summary":"Telemetry Feedback","description":"The validation log: one issue per rejection reason in the window --\na preset (`window`), or `start` <= ts < `end` (see _feedback_window) --\nfor the agent named, or aggregated over every agent the caller may read\nthe log of (_feedback_scope). ADP's IngestFeedbackService, gated and\naudited as it is: Cedar read_telemetry on the log, then on the agent,\nand a telemetry.feedback.read row per call.","operationId":"telemetry_feedback_api_telemetry_feedback_get","parameters":[{"name":"agent","in":"query","required":false,"schema":{"type":"string","default":"","title":"Agent"}},{"name":"window","in":"query","required":false,"schema":{"type":"string","default":"24h","title":"Window"}},{"name":"start","in":"query","required":false,"schema":{"type":"string","default":"","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","default":"","title":"End"}},{"name":"reason_class","in":"query","required":false,"schema":{"type":"string","default":"","title":"Reason Class"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Telemetry Feedback Api Telemetry Feedback Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/gateway/framework-tools":{"get":{"summary":"Get Framework Tools","description":"The record that governs a framework's own tools on the decision API\n(decide.KV_KEY): data policies and write postures, as a server's.","operationId":"get_framework_tools_api_gateway_framework_tools_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Framework Tools Api Gateway Framework Tools Get"}}}}}},"put":{"summary":"Put Framework Tools","description":"Replace it. A save that loosens a posture or a data policy takes\ngovernance.weaken and a reason, as the same save of a server does.","operationId":"put_framework_tools_api_gateway_framework_tools_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FrameworkToolsBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Put Framework Tools Api Gateway Framework Tools Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vault":{"get":{"summary":"Vault Status","description":"Where the key comes from, which data key is active, how many\ncredentials are sealed, how many values each data key holds, and the\nlatest rotation (live progress while one is open) — never a key or a\nvalue. A read across every person's sealed connections, so Cedar asks\nlist_connections on all of them (_admin_connection_gate).","operationId":"vault_status_api_vault_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Vault Status Api Vault Get"}}}}}}},"/api/vault/rotate":{"post":{"summary":"Vault Rotate","description":"New data key, everything re-encrypted, old keys retired. Resumable: a\nrotation left open by a crash is finished toward its own target key, not\nrestarted — unless the body says {\"fresh\": true}, which abandons it and\nstarts over under a new key. {\"rewrap\": true} rotates the KEK instead\n(vault.rewrap_keys), audited as vault.rewrap. 409 while another rotation\nor rewrap runs (here or on another replica), or when the vault cannot\nproceed (the wrong vault key, a KMS that refuses, a credential it cannot\nopen) — the job stays open for the retry.","operationId":"vault_rotate_api_vault_rotate_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/RotateVaultBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Vault Rotate Api Vault Rotate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vault/tenants/{tenant_id}/rotate":{"post":{"summary":"Vault Rotate Tenant","description":"A new data key for one tenant (vault.rotate_tenant): its memory and\nsealed content re-encrypted, its old keys retired, no other tenant's\ntouched. The caller must hold the tenant. 409 while another rotation\nruns, or when tenant keys are off.","operationId":"vault_rotate_tenant_api_vault_tenants__tenant_id__rotate_post","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Vault Rotate Tenant Api Vault Tenants  Tenant Id  Rotate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/signing/keys":{"get":{"summary":"Signing Keys","description":"Every platform signing key and where it stands — never a private key.","operationId":"signing_keys_api_signing_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Signing Keys Api Signing Keys Get"}}}}}}},"/api/signing/rotate":{"post":{"summary":"Signing Rotate","description":"New active signing key. The one it replaces signs nothing from now on\nand stays in the JWKS for the overlap, so what it signed still verifies.","operationId":"signing_rotate_api_signing_rotate_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/RotateSigningBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Signing Rotate Api Signing Rotate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/signing/keys/{kid}/retire":{"post":{"summary":"Signing Retire","description":"Take a replaced key out of the JWKS before its overlap ends — it\nleaked, or everything it signed has expired.","operationId":"signing_retire_api_signing_keys__kid__retire_post","parameters":[{"name":"kid","in":"path","required":true,"schema":{"type":"string","title":"Kid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Signing Retire Api Signing Keys  Kid  Retire Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/connections/all":{"get":{"summary":"Connections All","description":"Every user's OAuth connections (metadata only) — who has linked which\nthird-party account, so an administrator can revoke one when someone\nleaves or a provider is compromised. ADP's ListAllConnections: filter by\nprovider_name (alias provider) and status, page with page_size /\npage_token. With no parameters it is the first page of 50 under the same\n`connections` key as before, plus next_page_token (\"\" when that is all).\n\nCedar asks list_connections on AdminConnection::\"*/<provider>\" — the\nprovider filtered to, or \"*\" for every one — so a grant scoped to one\nprovider lists that provider's connections and is refused the rest.\nEvery call is audited (connection.admin.list, with its filters), refused\nand failed ones included: who looked at whose grants is the question an\nidentity audit is asked, and ADP audits the list as a call.","operationId":"connections_all_api_connections_all_get","parameters":[{"name":"provider_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider Name"}},{"name":"provider","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"page_size","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Page Size"}},{"name":"page_token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Connections All Api Connections All Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/connections/users/{username}/{provider}":{"delete":{"summary":"Admin Revoke Connection","operationId":"admin_revoke_connection_api_connections_users__username___provider__delete","parameters":[{"name":"username","in":"path","required":true,"schema":{"type":"string","title":"Username"}},{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Revoke Connection Api Connections Users  Username   Provider  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/connections":{"get":{"summary":"Connections List","description":"What this user has connected, and what they could connect.\n\nScoped to the caller by construction — there is no parameter for reading\nsomebody else's connections, because there is no reason to have one.","operationId":"connections_list_api_connections_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Connections List Api Connections Get"}}}}}}},"/api/connections/providers":{"get":{"summary":"Connection Providers","description":"Providers, filtered and paged server-side. No parameters is the whole\nlist by name, as before, plus next_page_token, total_size and the\ncallback URL. A provider a Cedar policy forbids the caller to\nread_provider is left out before the filter and the page\n(_readable_oauth_providers). Audited as connection.provider.list,\nnaming the providers it returned (_audit_provider_read).","operationId":"connection_providers_api_connections_providers_get","parameters":[{"name":"name_contains","in":"query","required":false,"schema":{"type":"string","default":"","title":"Name Contains"}},{"name":"filter","in":"query","required":false,"schema":{"type":"string","default":"","title":"Filter"}},{"name":"order_by","in":"query","required":false,"schema":{"type":"string","default":"","title":"Order By"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Page Size"}},{"name":"page_token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Page Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Connection Providers Api Connections Providers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/connections/providers/{name}":{"get":{"summary":"Get Connection Provider","description":"One provider by name: the list's shape (secret masked, registration\ntoken reference stripped) plus the callback URL. Cedar read_provider,\nbefore the name is looked up; audited as connection.provider.get.","operationId":"get_connection_provider_api_connections_providers__name__get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Connection Provider Api Connections Providers  Name  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Put Connection Provider","description":"Create or replace a provider. name, client_id and a Slack provider's\nslack_token_type are fixed once it exists (400: delete and re-create);\ncreated_*/updated_* are the server's. To change a few fields and keep\nthe rest, PATCH. The client\nsecret is stored in the secret store, never on the record; a reference\nto a secret that does not exist is a 400. So is a change to a discovered\nprovider's token_endpoint_auth_method or pkce_required (its\nregistration's), and a public client without PKCE — \"none\", or a\nprovider with no client secret, whatever method it names.\n\nCedar create_provider when there is no such provider, else\nupdate_provider on it as stored — here, before the body is validated —\nand then, under the provider lock, on the record as stored and as the\nsave would store it (_oauth_provider_write_check).","operationId":"put_connection_provider_api_connections_providers__name__put","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnProviderBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Connection Provider Api Connections Providers  Name  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Patch Connection Provider","description":"Change some fields of an existing provider (oauth.patch_provider).\n\nFields left out, or sent null, keep their stored values; an optional\n`update_mask` (a list, or a comma-separated string) names exactly the\nfields to write, and a named field sent null returns to its default. An\nunknown or server-owned field is a 400 rather than ignored, and so are a\nchanged name, client_id or slack_token_type — every connection was\ngranted to that client, as that kind of token, so another one is\nanother provider. A client_secret sent blank or masked\nkeeps the stored one; a new one is filed in the secret store, and\nclient_secret_ref points at a secret already there (400 when there is\nno such secret). The merged record is validated as a PUT is; 404\nwhen there is no such provider — PATCH never creates one. Audited as\nconnection.provider.update with the changed field names and the\nredacted before and after.\n\nCedar update_provider on the provider as stored, before the name is\nlooked up, and again under the provider lock on the record as stored\nand as the merge would store it (_oauth_provider_write_check).","operationId":"patch_connection_provider_api_connections_providers__name__patch","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Patch Connection Provider Api Connections Providers  Name  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Connection Provider","description":"Remove a provider and every person's grant against it, revoked\nupstream. Cedar delete_provider on it as stored, before the name is\nlooked up — and again under the provider lock, just before the removal\n(oauth.delete_provider's `check`), as a save is re-checked: a tag a\ncolleague added in between is on the record the verdict reads.","operationId":"delete_connection_provider_api_connections_providers__name__delete","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Connection Provider Api Connections Providers  Name  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/connections/providers/discover":{"post":{"summary":"Discover Connection Provider","description":"Read-only: what would a provider for this MCP server look like?\nDiscovery only — nothing is registered and nothing is saved.\n\nexisting_provider_name (ADP's DiscoverOAuthProviderResponse field) names\na provider already configured for the same issuer and origin, \"\" when\nthere is none: the console offers it instead of registering another.\ncimd_supported and cimd_client_id (the draft's, as ADP's response has\nthem) say whether the server accepts a client ID metadata document and\nwhether TicketIQ can use its own there — cimd_unavailable_reason why not.\n\nCedar create_provider on the draft (oauthdisco.proposed_record) — the\nprovider this discovery is the first step of creating, carrying `tags`\nwhen the caller sends the ones it will register with — named `name`\nwhen the caller gives one, else at TYPE scope (policy.TYPE_SCOPE): a\ndiscovery the console makes before anyone has named the provider is\nanswered by the policies on providers as a whole, and one naming a\nsingle provider says nothing about it. So a caller a policy stops\ncreating a provider pinned to an issuer does not get to see what that\nissuer's registration would look like either.\n\nThe verdict comes after the discovery, which fetches the server's\nprotected-resource and authorization-server metadata: the proposed\nrecord a policy reads (its issuer, its auth method) is what discovery\nfinds, so there is nothing to judge before it. A caller Cedar refuses\noutright still costs those fetches — through the SSRF-safe client, rate\nlimited (require_rate_limit) — and each attempt is on the record: as\nconnection.provider.discover when it was allowed or failed, as the\ngate's refusal when it was not.\n\nAudited as connection.provider.discover: the URL, the issuer found and\nthe provider already configured for it — an outbound call to a URL the\ncaller chose is worth a row whether or not anything is saved.","operationId":"discover_connection_provider_api_connections_providers_discover_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscoverBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Discover Connection Provider Api Connections Providers Discover Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/connections/providers/register":{"post":{"summary":"Register Connection Provider","description":"Discover and register TicketIQ as a client (RFC 7591), then save it —\nor, with method cimd (or auto at a server with no registration endpoint\nthat accepts one), save it with TicketIQ's client metadata document as\nits client_id, registering nothing.\n\nCedar create_provider on the provider the registration would store\n(oauthdisco.proposed_record: discovered, pinned to the draft's issuer),\nafter discovery and before anything is asked of the registration\nendpoint — so a refusal leaves no client registered upstream.\n\nA name already taken is refused first, with no network call, as it was\nbefore the gate: registering over it can never succeed\n(oauthdisco.register refuses it too), so the discovery would be an\noutbound fetch for nothing. Otherwise discovery egress comes before the\nverdict, as on discover.","operationId":"register_connection_provider_api_connections_providers_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Register Connection Provider Api Connections Providers Register Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/connections/providers/{name}/refresh":{"post":{"summary":"Refresh Connection Provider","description":"Re-read the pinned metadata; adopt moved endpoints, refuse a changed\nissuer or resource, and confirm the registration still exists.\n\nCedar update_provider on the provider as stored, before the name is\nlooked up. Only as stored: a refresh moves endpoints, and never what a\npolicy can test — the issuer is pinned (a changed one is refused), and\nthe source, switch, method and tags are not the metadata's to change.","operationId":"refresh_connection_provider_api_connections_providers__name__refresh_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Refresh Connection Provider Api Connections Providers  Name  Refresh Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/connections/{provider}/authorize":{"post":{"summary":"Connection Authorize","description":"Start connecting the caller's account: {url, state, flow} to send\nthem to, or {already_authorized: true, connection} when the connection\nthey have already holds every scope asked for (force_reauthorization\nasks again regardless).","operationId":"connection_authorize_api_connections__provider__authorize_post","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"scopes","in":"query","required":false,"schema":{"type":"string","default":"","title":"Scopes"}},{"name":"scopes_mode","in":"query","required":false,"schema":{"type":"string","default":"","title":"Scopes Mode"}},{"name":"force_reauthorization","in":"query","required":false,"schema":{"type":"string","default":"","title":"Force Reauthorization"}},{"name":"success_redirect_url","in":"query","required":false,"schema":{"type":"string","default":"","title":"Success Redirect Url"}},{"name":"failure_redirect_url","in":"query","required":false,"schema":{"type":"string","default":"","title":"Failure Redirect Url"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/AuthorizeBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Connection Authorize Api Connections  Provider  Authorize Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/connections/{provider}/start":{"get":{"summary":"Connection Start","description":"The `authorize_url` in a step-up error: a plain link that sends the\nsigned-in user straight to the provider's consent screen for the scopes\nnamed. Safe as a GET — the flow it starts is bound to this user, and\nnothing is connected until they approve at the provider and the callback\nchecks the state belongs to them. When nothing needs asking (the\nconnection already covers it), straight to where a success would land.","operationId":"connection_start_api_connections__provider__start_get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"scopes","in":"query","required":false,"schema":{"type":"string","default":"","title":"Scopes"}},{"name":"scopes_mode","in":"query","required":false,"schema":{"type":"string","default":"","title":"Scopes Mode"}},{"name":"force_reauthorization","in":"query","required":false,"schema":{"type":"string","default":"","title":"Force Reauthorization"}},{"name":"success_redirect_url","in":"query","required":false,"schema":{"type":"string","default":"","title":"Success Redirect Url"}},{"name":"failure_redirect_url","in":"query","required":false,"schema":{"type":"string","default":"","title":"Failure Redirect Url"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/connections/callback":{"get":{"summary":"Connection Callback","description":"Where the provider sends the user back.\n\nReturns a small HTML page rather than JSON: a human's browser lands here,\nnot a script. The page carries no tokens and no state value — only whether\nit worked. Or, when the flow named a success or failure URL, a redirect\nthere with the outcome on its query (oauth.return_url).\n\nA provider error (error=access_denied&error_description=…, RFC 6749\n§4.1.2.1: the person pressed Deny, or the IdP refused the client) marks\nthe flow failed and is audited as connection.authorize.failed with the\ndescription, cleaned and cut (oauth.provider_error) — the leg of the flow\nthat otherwise leaves no trace but a support ticket.","operationId":"connection_callback_api_connections_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"type":"string","default":"","title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","default":"","title":"State"}},{"name":"error","in":"query","required":false,"schema":{"type":"string","default":"","title":"Error"}},{"name":"error_description","in":"query","required":false,"schema":{"type":"string","default":"","title":"Error Description"}},{"name":"iss","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Iss"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/connections/{provider}":{"get":{"summary":"Connection Get","description":"ADP's GetConnection: the caller's own record for one provider — its\nstatus (ACTIVE, EXPIRED, REVOKED, PENDING, FAILED), scopes, when it was\nconnected and last renewed, when the access and refresh tokens run out —\nand never a token. Self-scoped as the listing is: there is no username\nto name, so another person's connection is a 404 like a missing one,\nand whether they have one is not something this answers.\n\nRegistered after every fixed GET under /connections/ (all, providers,\ncallback), so none of those is read as a provider called that.","operationId":"connection_get_api_connections__provider__get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Connection Get Api Connections  Provider  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Connection Disconnect","operationId":"connection_disconnect_api_connections__provider__delete","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Connection Disconnect Api Connections  Provider  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/access":{"get":{"summary":"Access Overview","operationId":"access_overview_api_access_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Access Overview Api Access Get"}}}}}}},"/api/access/me":{"get":{"summary":"Access Me","description":"Every authenticated caller may read their OWN effective permissions —\nthe UI needs it to hide controls the user cannot use, and it discloses\nnothing they could not discover by clicking.","operationId":"access_me_api_access_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Access Me Api Access Me Get"}}}}}}},"/api/access/users/{name}":{"put":{"summary":"Put User","operationId":"put_user_api_access_users__name__put","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put User Api Access Users  Name  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete User Endpoint","operationId":"delete_user_endpoint_api_access_users__name__delete","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"reassign_to","in":"query","required":false,"schema":{"type":"string","default":"","title":"Reassign To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete User Endpoint Api Access Users  Name  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/service-accounts":{"get":{"summary":"List Service Accounts","operationId":"list_service_accounts_api_service_accounts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Service Accounts Api Service Accounts Get"}}}}}},"post":{"summary":"Create Service Account","description":"Issue a pipeline credential bound to an existing account (see\nsvcaccounts.py for the rules). The client secret is in this response and\nnowhere else, ever.","operationId":"create_service_account_api_service_accounts_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceAccountBody"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Service Account Api Service Accounts Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/service-accounts/{name}/rotate":{"post":{"summary":"Rotate Service Account","description":"A new client secret, in this response and nowhere else; the old one\nstops working at once and the sessions it minted end. Takes what issuing\ntakes: the caller must hold everything the bound account confers.","operationId":"rotate_service_account_api_service_accounts__name__rotate_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ServiceAccountRotateBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Rotate Service Account Api Service Accounts  Name  Rotate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/service-accounts/{name}":{"patch":{"summary":"Patch Service Account","description":"Disable (its secret stops exchanging and its sessions end now) or\nenable it again — which, handing the secret back its power, takes what\nissuing takes.","operationId":"patch_service_account_api_service_accounts__name__patch","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceAccountPatchBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Patch Service Account Api Service Accounts  Name  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Service Account","description":"Delete it, its secret with it. A reason (the console always asks for\none) is kept on the audit row.","operationId":"delete_service_account_api_service_accounts__name__delete","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ServiceAccountDeleteBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Service Account Api Service Accounts  Name  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/access/roles/{name}":{"put":{"summary":"Put Role","operationId":"put_role_api_access_roles__name__put","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Role Api Access Roles  Name  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Role Endpoint","operationId":"delete_role_endpoint_api_access_roles__name__delete","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Role Endpoint Api Access Roles  Name  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/access/policies":{"put":{"summary":"Put Access Policy","operationId":"put_access_policy_api_access_policies_put","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PolicyBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Access Policy Api Access Policies Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Policy Endpoint","operationId":"delete_policy_endpoint_api_access_policies_delete","parameters":[{"name":"principal","in":"query","required":true,"schema":{"type":"string","title":"Principal"}},{"name":"permission","in":"query","required":true,"schema":{"type":"string","title":"Permission"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Policy Endpoint Api Access Policies Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/access/role-bindings":{"get":{"summary":"List Role Bindings Endpoint","description":"Every role binding (or one person's, or those in one tenant), oldest\nfirst, and what a binding in one tenant can confer at all.","operationId":"list_role_bindings_endpoint_api_access_role_bindings_get","parameters":[{"name":"principal","in":"query","required":false,"schema":{"type":"string","default":"","title":"Principal"}},{"name":"tenant","in":"query","required":false,"schema":{"type":"string","default":"","title":"Tenant"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Role Bindings Endpoint Api Access Role Bindings Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Create Role Binding","description":"Bind a role to a person in one tenant, or in every tenant. Binding\nwhat is already bound answers 200 with that binding, and writes\nnothing.","operationId":"create_role_binding_api_access_role_bindings_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleBindingBody"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Role Binding Api Access Role Bindings Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/access/role-bindings/{binding_id}":{"delete":{"summary":"Delete Role Binding","operationId":"delete_role_binding_api_access_role_bindings__binding_id__delete","parameters":[{"name":"binding_id","in":"path","required":true,"schema":{"type":"integer","title":"Binding Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Role Binding Api Access Role Bindings  Binding Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/llm/providers":{"get":{"summary":"Llm Providers","description":"Both shapes leave out a provider a Cedar policy forbids the caller to\n`read`, or the tenant boundary keeps from them (_readable_providers) —\nbefore the filter and the page, so a page is never short and total_size\nnever counts a provider the caller cannot open.","operationId":"llm_providers_api_llm_providers_get","parameters":[{"name":"name_contains","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name Contains"}},{"name":"filter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filter"}},{"name":"order_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order By"}},{"name":"page_size","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Page Size"}},{"name":"page_token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Llm Providers Api Llm Providers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/llm/provider-types":{"get":{"summary":"Llm Provider Types","description":"The provider type catalogue (ADP ListLLMProviderTypes): label,\ndescription, docs link, icon and default endpoint for each kind. Any\nsigned-in user may read it — it is product metadata, the same for every\ninstance, and holds nothing about any configured provider.","operationId":"llm_provider_types_api_llm_provider_types_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Llm Provider Types Api Llm Provider Types Get"}}}}}}},"/api/llm/models":{"get":{"summary":"Llm Models","description":"ADP ListModels: the catalogue — every provider family's models when\nprovider_type is unset, one family's when it is — each with its label,\npublisher, capabilities, effort words, token limits and list-price rate\ncard; an AIP-160 filter, order_by and signed page tokens as every list\nhere takes. aws_region drops the Bedrock inference profiles that cannot\nbe invoked from that region. page_size out of range is refused, not\nclamped (see the provider list).","operationId":"llm_models_api_llm_models_get","parameters":[{"name":"provider_type","in":"query","required":false,"schema":{"type":"string","default":"","title":"Provider Type"}},{"name":"aws_region","in":"query","required":false,"schema":{"type":"string","default":"","title":"Aws Region"}},{"name":"filter","in":"query","required":false,"schema":{"type":"string","default":"","title":"Filter"}},{"name":"order_by","in":"query","required":false,"schema":{"type":"string","default":"","title":"Order By"}},{"name":"page_size","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Page Size"}},{"name":"page_token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Page Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Llm Models Api Llm Models Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/llm/models/{name}":{"get":{"summary":"Llm Model","description":"ADP GetModel: one catalogue entry by model id. provider_type names\nthe family when the id is several families' — refused (400) rather than\nanswered with whichever came first, and the refusal lists them. A name\nof the form family/id (the entry's own `name`) works too, and wins\nwhere it is also another family's id (modelcat.resolve).","operationId":"llm_model_api_llm_models__name__get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"provider_type","in":"query","required":false,"schema":{"type":"string","default":"","title":"Provider Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Llm Model Api Llm Models  Name  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Put Llm Model","description":"Override one catalogue entry, or add a model the shipped catalogue\ndoes not know, for the caller's tenant (_catalogue_tenant). The row is\nreplaced whole: a field it leaves out reads as the layer below says.","operationId":"put_llm_model_api_llm_models__name__put","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"provider_type","in":"query","required":false,"schema":{"type":"string","default":"","title":"Provider Type"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Llm Model Api Llm Models  Name  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Llm Model","description":"Remove the caller's tenant's override of one entry: the shipped entry\n(or the instance's override) applies again; a custom model is gone.","operationId":"delete_llm_model_api_llm_models__name__delete","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"provider_type","in":"query","required":false,"schema":{"type":"string","default":"","title":"Provider Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Llm Model Api Llm Models  Name  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/llm/providers/{name}":{"get":{"summary":"Llm Provider Get","description":"One provider by name — what the list holds for it, key masked, with\nits ETag in the header as well as the body. 404 when there is none.\nCedar `read` on the provider, gated before the name is looked up.\n\nDeclared before the /{name}/... routes only for readability: those have\none more path segment, so no request can match both.","operationId":"llm_provider_get_api_llm_providers__name__get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Llm Provider Get Api Llm Providers  Name  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Put Llm Provider","description":"Create or replace a provider. The connection fields are replaced as\nsent (governance attributes left null keep theirs — see save_provider);\nto change a few fields and keep the rest, PATCH. created_*/updated_*\nare set by the server and ignored when sent.\n\nCedar `configure` on the provider as it stands first (before anything\nabout it is read, so a caller every policy on the name refuses cannot\nlearn from the answer whether it is taken). Then the call it turned out\nto be — `update` when a provider holds the name, `create` when none does\n— its permission (_provider_write_permission) and its Cedar verb, on\nthe provider as it stands and as the save would leave it. A secret://\nkey the provider does not already hold needs governance.write as well\n(_secret_ref_gate).","operationId":"put_llm_provider_api_llm_providers__name__put","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Llm Provider Api Llm Providers  Name  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Patch Llm Provider","description":"Change some fields of an existing provider (agentconf.patch_provider).\n\nFields left out, or sent as null, keep their stored values. An optional\n`update_mask` (a list, or a comma-separated string) names exactly the\nfields to write, and a named field sent null returns to its default; a\nbody field the mask leaves out is a 400 too. An\nunknown field, in the body or the mask, is a 400 rather than ignored — a\ntypo'd field name silently dropped is a change the caller believes was\nmade. `kind` cannot change (400); an api_key sent empty or masked keeps\nthe key. The merged record is validated as a PUT is, and audited as\nllm.provider.save with the masked before and after. 404 when there is\nno such provider — PATCH never creates one.\n\nCedar `configure` on the provider before the 404, then on the record as\nthe patch would leave it, as a PUT is checked; and a new secret:// key\nneeds governance.write, as a PUT's does.\n\nA save that switches authorization_passthrough on releases the secret\nMove key to Secrets filed for the provider (agentconf._store_locked):\nthen, and only then, the audit row and the response carry\nsecret_dropped / secret_kept as a delete's do — the only record of that\nsecret going, since delete_secret writes none. The same holds for PUT.","operationId":"patch_llm_provider_api_llm_providers__name__patch","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Patch Llm Provider Api Llm Providers  Name  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Llm Provider","description":"Cedar `configure` on the provider, before the 404, as every write.","operationId":"delete_llm_provider_api_llm_providers__name__delete","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Llm Provider Api Llm Providers  Name  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/llm/breakers":{"get":{"summary":"Llm Breakers","description":"Circuit-breaker state per breaker key: closed, open or half_open, the\nconsecutive-failure count, and when the cooldown ends.\n\nA key is a provider name, or ``global:openai`` / ``global:anthropic`` for\nthe unbound default backend — shared by unbound agents and by calls made\noutside any agent, such as the /api/health probe, since they reach the\nsame endpoint on the same credentials. A provider name cannot contain a\ncolon, so the two never collide.\n\nThe one place an operator can see that an agent is serving heuristics\nbecause its provider's circuit is open, rather than because the model is\ngiving poor answers. Only keys called since this process started appear,\nso a provider with no entry is closed. Per process, like the breaker.","operationId":"llm_breakers_api_llm_breakers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Llm Breakers Api Llm Breakers Get"}}}}}}},"/api/llm/provider-health":{"get":{"summary":"Llm Provider Health List","description":"Every provider's health as the scheduled probes last found it: status\n(healthy, failing, not_probed, unknown), when it was probed and is next\ndue, the last check code, served-model drift and any quarantine.\n\nUnlike GET /llm/breakers, which is this process's circuits, this is the\none shared record every replica acts on. Leaves out a provider Cedar\nforbids the caller to `read`, as the provider list does.","operationId":"llm_provider_health_list_api_llm_provider_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Llm Provider Health List Api Llm Provider Health Get"}}}}}}},"/api/llm/providers/{name}/health":{"get":{"summary":"Llm Provider Health Get","description":"One provider's health record. Cedar `read`, before the 404.","operationId":"llm_provider_health_get_api_llm_providers__name__health_get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Llm Provider Health Get Api Llm Providers  Name  Health Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/llm/providers/{name}/health/probe":{"post":{"summary":"Llm Provider Health Probe","description":"Run the scheduled health probe now, due or not, and fold its result\ninto the shared record exactly as the schedule does: a failure opens the\nprovider's circuit, drift is alerted (once), a provider saved with\nquarantine_on_drift is quarantined. A switched-off provider is not\nprobed (409): nothing calls it.\n\nproviders.write, rate limited and Cedar `configure`, as the saved Test\nis — the stored credential goes to the endpoint on request — and it\nleaves the same llm.provider.probe row (probe \"health\").","operationId":"llm_provider_health_probe_api_llm_providers__name__health_probe_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Llm Provider Health Probe Api Llm Providers  Name  Health Probe Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/llm/providers/{name}/health/approve":{"post":{"summary":"Llm Provider Health Approve","description":"Re-approve a provider after its served-model drift was reassessed:\nlifts a quarantine, so its agents' calls go through again, and marks\nthe drift seen so far as reviewed — not alerted or quarantined on again\nwhile it lasts. A new drift still is.\n\nA reason is required, as for switching a provider off: it is what lets\nevery agent on a drifted model run again, and whoever finds that later\nreads why here. 409 when there is nothing to re-approve. Cedar\n`configure`, before the 404; audited llm.provider.drift.approve.","operationId":"llm_provider_health_approve_api_llm_providers__name__health_approve_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ProviderApproveBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Llm Provider Health Approve Api Llm Providers  Name  Health Approve Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/llm/providers/discover":{"post":{"summary":"Llm Provider Discover","description":"Same as llm_provider_models, before the provider has been saved.\n\nThe Add Provider form asks \"what will this endpoint actually serve\"\nwhile the operator is still typing the connection details, so there is\nno saved record to look up by name yet — the raw fields travel in the\nrequest body instead. providers.check_connection, and Cedar\n`check_connection` on the provider the draft proposes (_draft_probe_gate)\n— and governance.write for a secret:// key (_secret_ref_gate) — and an\nllm.provider.probe row (_probe_audit).","operationId":"llm_provider_discover_api_llm_providers_discover_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderDiscoverBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Llm Provider Discover Api Llm Providers Discover Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/llm/providers/{name}/leaderboard":{"get":{"summary":"Llm Provider Leaderboard","description":"Which callers lean on this provider, and which models they reach for.\n\nSorted by spend where rates exist and by tokens where they do not, because\non a self-hosted model every row costs $0.00 and a spend sort would rank\nthem arbitrarily — the ordering has to degrade to the signal that is\nactually present rather than to alphabetical noise. Cedar `read` on the\nprovider: who calls it, and for how much, is what its record shows.\n\nThe span is the last `days` whole days, or a `window` (\"24h\", \"7d\", …)\nor start/end pair as the spend reads take them (_spend_window) — the\nprovider page's one range control drives every panel with the same one.\n\n``callers`` are the agents (``type`` \"agent\"). ``principals`` are who\nthe work was FOR — a person, or a service account / inbound client\n(netobs.caller_type) — from the ledger's principal dimension: a call an\nagent made for a person counts under both, so the two rankings are\nread side by side, never summed. People are named only to a caller\nwho holds governance.read, as /usage?group_by=principal names them;\nwithout it ``principals`` is empty and ``principals_hidden`` says why.\nEvery row carries ``tokens`` (usage.TOKEN_BUCKETS), so a client can\nre-sort on calls, tokens or spend without re-deriving it.","operationId":"llm_provider_leaderboard_api_llm_providers__name__leaderboard_get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}},{"name":"window","in":"query","required":false,"schema":{"type":"string","default":"","title":"Window"}},{"name":"start","in":"query","required":false,"schema":{"type":"string","default":"","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","default":"","title":"End"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Llm Provider Leaderboard Api Llm Providers  Name  Leaderboard Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/llm/providers/test":{"post":{"summary":"Llm Provider Test","description":"List AND generate, so a provider is proven before an agent depends on\nit. See agentconf.test_provider. providers.check_connection and Cedar\n`check_connection` on the provider the draft proposes, as discover\n(governance.write too for a secret:// key); an llm.provider.probe row\nwith the check's code.","operationId":"llm_provider_test_api_llm_providers_test_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderTestBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Llm Provider Test Api Llm Providers Test Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/llm/providers/{name}/test":{"post":{"summary":"Llm Provider Test Saved","description":"The full test — list AND generate — of a SAVED provider, with what is\nstored: its key (a secret:// reference opened here, server-side), its\nURL, its default model and its retry overrides. 404 for an unknown name.\n\nThe draft route above cannot do this: the console never holds a stored\nkey, so an edit form re-testing a saved provider sent an empty one, and\n\"does the provider my agents run on still work?\" had no honest answer.\n\nA disabled provider — `enabled: false` on its record, or every binding to\nit switched off — is tested all the same. Switching it back on is the\nmoment an operator most wants proof it works, and the probe is not an\nagent's call: nothing is bound, metered or recorded by it.\n\nproviders.write and rate limited like the draft probe, because it is the\nsame act — a stored credential sent to an endpoint on request — and it\nleaves the same llm.provider.probe row, naming the provider, the secret's\nlabel and the host; never the value, never the full URL. Cedar\n`configure` on the provider, before the name is looked up: it sends\nwhat the provider stores, which is the provider's owners' to send.","operationId":"llm_provider_test_saved_api_llm_providers__name__test_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Llm Provider Test Saved Api Llm Providers  Name  Test Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/llm/providers/{name}/models":{"get":{"summary":"Llm Provider Models","description":"What THIS endpoint actually serves, asked live rather than trusted from\nthe free-text default_model an operator typed once. See discover_models.\n\nEach model comes back as the catalogue describes it (modelcat: label,\npublisher, capabilities, limits, list price), or with every field null\nand source \"discovered\" where the catalogue does not know it — the live\nlist is what is served, the catalogue only what is known about it.\n`?format=ids` keeps the bare id strings this route returned before.\n\nCedar `read` on the provider. A probe like the others — the provider's\nstored key goes to its endpoint — so it leaves an llm.provider.probe row\n(probe \"models\"), where it once left none.","operationId":"llm_provider_models_api_llm_providers__name__models_get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"format","in":"query","required":false,"schema":{"type":"string","default":"","title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Llm Provider Models Api Llm Providers  Name  Models Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/llm/providers/{name}/routing/versions":{"get":{"summary":"Llm Provider Routing Versions","description":"The provider's pool, version by version (versions.record_routing),\nnewest first, metadata only. Cedar `read` before the 404.","operationId":"llm_provider_routing_versions_api_llm_providers__name__routing_versions_get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Llm Provider Routing Versions Api Llm Providers  Name  Routing Versions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/llm/providers/{name}/routing/versions/diff":{"get":{"summary":"Llm Provider Routing Diff","description":"What changed between two of the provider's routing versions,\ndeployment by deployment. 404 for a version it does not have.","operationId":"llm_provider_routing_diff_api_llm_providers__name__routing_versions_diff_get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"a","in":"query","required":true,"schema":{"type":"string","title":"A"}},{"name":"b","in":"query","required":true,"schema":{"type":"string","title":"B"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Llm Provider Routing Diff Api Llm Providers  Name  Routing Versions Diff Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/llm/providers/{name}/routing/versions/{version_id}":{"get":{"summary":"Llm Provider Routing Version","description":"One routing version, its deployments included (key references only —\na pool holds no key itself).","operationId":"llm_provider_routing_version_api_llm_providers__name__routing_versions__version_id__get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"version_id","in":"path","required":true,"schema":{"type":"string","title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Llm Provider Routing Version Api Llm Providers  Name  Routing Versions  Version Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/llm/providers/{name}/routing/versions/{version_id}/restore":{"post":{"summary":"Llm Provider Routing Restore","description":"Roll the provider's pool back to a version (versions.restore_routing).\n\nA save of the provider in every respect but the fields it writes:\nCedar `configure` on the provider as it stands and as the restore would\nleave it; governance.write for a key reference the provider does not\nhold now (a version from before a deployment's key was changed names\nthe old one, and pointing an address at a secret is the secret\nadministrator's call, as on a save); today's validation, so a\ndeployment model since taken off the allow-list is a 422; If-Match\nagainst the provider's ETag. Audited as llm.provider.routing.restore\nwith the pool before and after.","operationId":"llm_provider_routing_restore_api_llm_providers__name__routing_versions__version_id__restore_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"version_id","in":"path","required":true,"schema":{"type":"string","title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Llm Provider Routing Restore Api Llm Providers  Name  Routing Versions  Version Id  Restore Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/llm/providers/{name}/deployments/usage":{"get":{"summary":"Llm Provider Deployment Usage","description":"Calls, errors, tokens, cost and p95 latency per deployment of the\nprovider's pool (usage.deployment_usage), with each deployment's\ncircuit as this process holds it.","operationId":"llm_provider_deployment_usage_api_llm_providers__name__deployments_usage_get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":1,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Llm Provider Deployment Usage Api Llm Providers  Name  Deployments Usage Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/llm/providers/{name}/externalize-key":{"post":{"summary":"Externalize Llm Provider Key","description":"Move a provider's inline API key into the Secrets store\n(agentconf.externalize_key): filed as secret://provider-<name>, with a\nnumeric suffix where that label is taken, and the record pointed at it.\n\nproviders.write and Cedar `configure`, as a save is: it rewrites the\nprovider and writes a secret. 404 for no such provider; 409 when the key\nis already a\nreference, or there is none to move; 412 for a stale If-Match; 503 when\nthe filed key would not read back (the provider keeps it inline; try\nagain). Audited as llm.provider.key.externalize naming the provider and\nthe label — the label only, never the value, which is never returned\neither. Works with llm_provider_inline_keys off: it is how an instance\ngets there. The ETag is the record this move wrote, never a later read:\na save landing in between would otherwise lend the console its tag.","operationId":"externalize_llm_provider_key_api_llm_providers__name__externalize_key_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Externalize Llm Provider Key Api Llm Providers  Name  Externalize Key Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/llm/providers/{name}/disable":{"post":{"summary":"Disable Llm Provider","description":"Switch a provider off without deleting it (ADP LLMProviderService\nenabled=false): every agent bound to it, every subagent that names it\nand every gateway call on it is refused — \"<agent>: LLM provider <name>\nis disabled\", a 409 at the gateway — and none falls back to the global\nbackend. Its bindings, key and terms stay as they are, for /enable.\n\nNot the circuit breaker (GET /llm/breakers), which opens and closes on\nits own; this stays until an operator changes it. Body {\"reason\"},\nrequired. providers.write and Cedar `configure`, as every provider write\n(so a forbid on team=platform keeps another team from stopping that\nteam's providers); audited llm.provider.disable with the reason and the\nagents bound. 404 for no such provider, 412 for a stale If-Match.","operationId":"disable_llm_provider_api_llm_providers__name__disable_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ProviderSwitchBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Disable Llm Provider Api Llm Providers  Name  Disable Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/llm/providers/{name}/enable":{"post":{"summary":"Enable Llm Provider","description":"Switch a provider back on: its agents resolve to it again, on the\nbindings they had. Every per-call check still applies — an allow-list,\nthe transport rule — so switching on never admits what a save would\nrefuse. Body {\"reason\"}, optional; providers.write and Cedar\n`configure`, audited llm.provider.enable.","operationId":"enable_llm_provider_api_llm_providers__name__enable_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ProviderSwitchBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Enable Llm Provider Api Llm Providers  Name  Enable Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents":{"get":{"summary":"Agents Catalogue","operationId":"agents_catalogue_api_agents_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Agents Catalogue Api Agents Get"}}}}}}},"/api/agents/{key}":{"put":{"summary":"Put Agent Profile","description":"Bind an agent to a provider and model. If-Match, optional, is the\nagent's row etag (GET /gateway/agents/{id}): a binding saved over a\nchange made since is refused 412, checked and written under the registry\nlock. A save that changed the binding moves the version; a repeat does\nnot.","operationId":"put_agent_profile_api_agents__key__put","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentProfileBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Agent Profile Api Agents  Key  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/shadow/report":{"get":{"summary":"Agent Shadow Report","description":"The agent's shadow model compared with its binding (shadowtraffic.report)\nover the last `days` (1-90): each side's latency p50/p95, tokens and\ncost; answer agreement (embedding cosine, or word overlap where no\nembedding model runs) and the judge's mean score; guardrail differences;\nshadows that did not run and why; today's spend against the caps; and\nthe newest `samples` pairs. A tenant-scoped caller's figures, samples\nand aggregates alike, cover only pairs recorded in a tenant it reads\n(_tenant_allows) — a total over every tenant says what the others spend\n— and it is not shown the unstamped skips and daily spend; the\nsamples' prompt and answers only for a caller with\ntranscripts.get: they are what a transcript would hold. Cedar `read` on\nthe agent.","operationId":"agent_shadow_report_api_agents__key__shadow_report_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":7,"title":"Days"}},{"name":"samples","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Samples"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Shadow Report Api Agents  Key  Shadow Report Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/arms":{"get":{"summary":"Agent Canary Arms","description":"The agent's canary arms compared (canary.report): per arm — the\nbinding as \"primary\" first — its weight, where it runs, its counters,\nand each metric (helpful rate, grounding, latency, cost per call, error\nrate, guardrail block rate) against the primary's with its 95% interval,\np-value and verdict; \"insufficient_data\" below the minimum sample. The\nETag is the agent's row etag, the If-Match a rollback or promotion\ntakes.","operationId":"agent_canary_arms_api_agents__key__arms_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Canary Arms Api Agents  Key  Arms Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/arms/{arm}/rollback":{"post":{"summary":"Rollback Canary Arm","description":"Take a canary arm out of traffic: its weight to 0, the arm and its\ncounters kept. Conversations stuck to it move back to the binding on\ntheir next call.","operationId":"rollback_canary_arm_api_agents__key__arms__arm__rollback_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"arm","in":"path","required":true,"schema":{"type":"string","title":"Arm"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Rollback Canary Arm Api Agents  Key  Arms  Arm  Rollback Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/arms/{arm}/promote":{"post":{"summary":"Promote Canary Arm","description":"Make a canary arm the agent's binding: its provider, model, effort,\nmax_tokens and timeout replace the binding's, and it leaves the arm\nlist. The binding it leaves is held to every rule a save is.","operationId":"promote_canary_arm_api_agents__key__arms__arm__promote_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"arm","in":"path","required":true,"schema":{"type":"string","title":"Arm"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Promote Canary Arm Api Agents  Key  Arms  Arm  Promote Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/tags":{"put":{"summary":"Put Builtin Tags","description":"Set the chargeback tags of a built-in agent that calls a model\n(copilot, scribe, enrichment) — the ones its spend is stamped with from\nnow on, as a registered agent's tags are (usage.by_tag). A registered\nagent is tagged on its own record (PUT /gateway/agents/{id}); naming one\nhere is a 404, as is any other id. The required tag schema applies\n(required_agent_tags): tags lacking a required key are a 422.\n\nagents.update and Cedar `update` on the agent, as a binding save;\nIf-Match, optional, is the agent's row etag (412 when it moved), and a\nsave that changed the tags moves the version, and every save writes a\nconfig version (source \"tags\"). Audited agent.tags.save with the tags\neither side. What the built-in is charged to and the tag budgets that\ncap it (usage._live_tags); Cedar still reads a built-in as untagged\n(agentconf's note).","operationId":"put_builtin_tags_api_agents__key__tags_put","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuiltinTagsBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Builtin Tags Api Agents  Key  Tags Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/approvals":{"get":{"summary":"List Approvals","description":"The queue: every request, newest first, or those in one status —\n``sort=risk`` riskiest first (approvals.list_requests), the order a\nreviewer should work it in.\n\nagents.read, as an agent's runs are: the arguments shown are the ones the\ncall would have sent, already shaped by the server's data policies. Only\nthe requests of agents a Cedar policy lets the caller read are listed.","operationId":"list_approvals_api_approvals_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"","title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Limit"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","default":"newest","title":"Sort"}},{"name":"mine","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Mine"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Approvals Api Approvals Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/approvals/metrics":{"get":{"summary":"Approval Metrics","description":"Reviewer metrics (approvals.reviewer_metrics): per reviewer, decisions,\napprove rate, time to decide and the rubber-stamp flag, plus each\nagent's queue. audit.read as well as agents.read: it is a read of how\nPEOPLE decide, which the audit log's readers are trusted with, not every\nreader of an agent. Only the agents the caller may read are counted.","operationId":"approval_metrics_api_approvals_metrics_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Approval Metrics Api Approvals Metrics Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/approvals:batch":{"post":{"summary":"Batch Approvals","description":"Approve or reject many requests at once. Each is decided exactly as\nPOST /approvals/{id}/approve or /reject decides it — Cedar's approve on\nits agent, claimed once, re-verified and executed on its own — and each\nanswers for itself: one refused never stops the rest. High-risk requests\nare left out of a batch approval unless allow_high_risk is set.","operationId":"batch_approvals_api_approvals_batch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovalBatchBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Batch Approvals Api Approvals Batch Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/approvals/{approval_id}":{"get":{"summary":"Get Approval","operationId":"get_approval_api_approvals__approval_id__get","parameters":[{"name":"approval_id","in":"path","required":true,"schema":{"type":"string","title":"Approval Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Approval Api Approvals  Approval Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Edit Approval","description":"Edit a held call's arguments before deciding it (approvals.edit): the\nedit is re-run through the call's guardrails, data-policy clamps and\nposture rules as the agent, and what they leave is stored — and is what\nan approval then sends. agents.approve and Cedar's approve on the agent,\nas a decision: rewriting what will be sent is part of deciding it.","operationId":"edit_approval_api_approvals__approval_id__patch","parameters":[{"name":"approval_id","in":"path","required":true,"schema":{"type":"string","title":"Approval Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovalEditBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Edit Approval Api Approvals  Approval Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/approvals/{approval_id}/approve":{"post":{"summary":"Approve Approval","description":"Approve once, and execute the call exactly as it was asked for.\n\nSync on purpose: the call runs to completion here, on the threadpool, so\nthe approver sees what the vendor answered rather than \"queued\".","operationId":"approve_approval_api_approvals__approval_id__approve_post","parameters":[{"name":"approval_id","in":"path","required":true,"schema":{"type":"string","title":"Approval Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ApprovalDecisionBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Approve Approval Api Approvals  Approval Id  Approve Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/approvals/{approval_id}/reject":{"post":{"summary":"Reject Approval","operationId":"reject_approval_api_approvals__approval_id__reject_post","parameters":[{"name":"approval_id","in":"path","required":true,"schema":{"type":"string","title":"Approval Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ApprovalDecisionBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reject Approval Api Approvals  Approval Id  Reject Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/devices":{"get":{"summary":"List Devices","description":"Whether this instance sends push notifications, and the caller's own\nregistered phones (never their tokens). The app asks before it asks the\nperson for permission: a prompt for notifications that never come is\none they learn to ignore.","operationId":"list_devices_api_devices_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Devices Api Devices Get"}}}}}},"post":{"summary":"Register Device","description":"Register the caller's phone for push notifications of the approvals\nthey may decide, or refresh it (the app does at every start). Anyone\nsigned in may: a phone is told only of what its person may decide, and\nonly while the session it was registered under lasts. 503 when push is\noff on this instance.","operationId":"register_device_api_devices_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Register Device Api Devices Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/devices/{token}":{"delete":{"summary":"Unregister Device","description":"Stop pushing to the caller's phone (the app does at sign-out). 404\nfor a token that is not one of the caller's phones.","operationId":"unregister_device_api_devices__token__delete","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Unregister Device Api Devices  Token  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/devices/test":{"post":{"summary":"Test Device","description":"Send the caller's own phones a test notification, now (the app's\nSettings): the one way a person can see their set-up work end to end\nwithout waiting for an agent. 409 when they have no phone registered\nunder a live session, 503 when push is off, 502 when Expo could not\ntake it. Rate-limited: each call is an outbound request.","operationId":"test_device_api_devices_test_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Test Device Api Devices Test Post"}}}}}}},"/api/me/push":{"get":{"summary":"My Push","description":"Whether this instance sends Web Push, the key a browser subscribes\nwith, and the caller's own subscribed browsers (never their endpoints).\nThe app asks before it offers the toggle: a switch for notifications\nthat never come is one people learn to ignore.","operationId":"my_push_api_me_push_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response My Push Api Me Push Get"}}}}}}},"/api/me/push/subscriptions":{"post":{"summary":"Subscribe Push","description":"Turn notifications on for the caller's browser, or refresh it (the app\ndoes at every start, under the session it is signed in with). Anyone\nsigned in may: a browser is told only of what waits on its person, and\nonly while that session lasts. 503 when push is not set up here, 422\nfor an endpoint that is not one of the push services this instance\nsends to (webpush_endpoint_hosts).","operationId":"subscribe_push_api_me_push_subscriptions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebPushSubscriptionBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Subscribe Push Api Me Push Subscriptions Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/push/subscriptions/{subscription_id}":{"delete":{"summary":"Unsubscribe Push","description":"Turn notifications off for one of the caller's browsers (the app does\nwhen they switch them off or sign out). 404 for an id that is not one\nof theirs.","operationId":"unsubscribe_push_api_me_push_subscriptions__subscription_id__delete","parameters":[{"name":"subscription_id","in":"path","required":true,"schema":{"type":"string","title":"Subscription Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Unsubscribe Push Api Me Push Subscriptions  Subscription Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/push/test":{"post":{"summary":"Test Push","description":"Send the caller's own browsers a test notification, now (the app's\nsettings): the one way a person can see it work end to end without\nwaiting for an agent. 409 when no browser of theirs is subscribed under\na live session, 503 when push is not set up, 502 when a push service\ncould not take it. Rate-limited: each call is an outbound request.","operationId":"test_push_api_me_push_test_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Test Push Api Me Push Test Post"}}}}}}},"/api/me/needs":{"get":{"summary":"My Needs","description":"Everything waiting on the caller across their agents, newest first:\napprovals they may decide, their runs waiting for an answer or a\nconnection, and SAP calls to confirm — each with the agent's name and\nwhat its action needs. For the app's \"Needs you\" and its badge. Open to\nanyone signed in, as /me/requests is: each lane asks the permission of\nthe action that settles it, and an empty list is the answer for a\ncaller who holds none. A lane whose read fails is left out rather than\nfailing the rest, and named in `partial`.","operationId":"my_needs_api_me_needs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response My Needs Api Me Needs Get"}}}}}}},"/api/sap/confirmations":{"get":{"summary":"Sap Confirmations","description":"SAP calls proposed by an agent and waiting for the person they are for\nto confirm them in their chat (sapconfirm): the Inbox's read-only\n\"waiting on requester\" lane. Read-only because only that person can\nanswer one; the console shows that the work is held and on whom.\n\nThe caller's tenant only (a proposal is stamped with the tenant its work\nwas in), and only proposals of agents a Cedar policy lets them read.\n``mine`` keeps those waiting on the caller themselves.\n\n``view=log`` is the SAP app's Confirmations tab instead: every proposal,\nwhatever became of it — who, what, which system, the result, the route —\nfiltered by status, module, server, age in days and text. A tenant\nwithout SAP is refused it (solution_not_enabled).","operationId":"sap_confirmations_api_sap_confirmations_get","parameters":[{"name":"mine","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Mine"}},{"name":"view","in":"query","required":false,"schema":{"type":"string","default":"waiting","title":"View"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"","title":"Status"}},{"name":"module","in":"query","required":false,"schema":{"type":"string","default":"","title":"Module"}},{"name":"server","in":"query","required":false,"schema":{"type":"string","default":"","title":"Server"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Days"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Sap Confirmations Api Sap Confirmations Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/solutions/{key}/summary":{"get":{"summary":"Solution Summary","description":"A solution's card on Home: its own numbers for the caller's tenant,\nnever a cross-tenant aggregate (solutions.CardSpec).","operationId":"solution_summary_api_solutions__key__summary_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Solution Summary Api Solutions  Key  Summary Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sap/overview":{"get":{"summary":"Sap Overview","description":"One tile per SAP module the tenant has: the systems connected, the\nlast call, confirmations waiting and calls refused this week.","operationId":"sap_overview_api_sap_overview_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Sap Overview Api Sap Overview Get"}}}}}}},"/api/sap/confirmations/{confirmation_id}":{"get":{"summary":"Sap Confirmation","description":"One confirmation, for the log's drawer. 404 for one the caller may\nnot see, as for none. Its raw arguments only for an instance owner —\nanyone else reads the sentence and the facts the person was shown.","operationId":"sap_confirmation_api_sap_confirmations__confirmation_id__get","parameters":[{"name":"confirmation_id","in":"path","required":true,"schema":{"type":"string","title":"Confirmation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Sap Confirmation Api Sap Confirmations  Confirmation Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sap/insights":{"get":{"summary":"Sap Insights","description":"SAP calls per module over 7, 30 or 90 days, by how each was allowed:\nconfirmed by a person, on an endorsed route, refused, or failed.","operationId":"sap_insights_api_sap_insights_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Sap Insights Api Sap Insights Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sap/catalog":{"get":{"summary":"Sap Catalog","description":"The SAP product API catalogues shipped with this release, the ones\nthe tenant has a connection for first. Needs the Product APIs module.","operationId":"sap_catalog_api_sap_catalog_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Sap Catalog Api Sap Catalog Get"}}}}}}},"/api/sap/catalog/{product}":{"get":{"summary":"Sap Catalog Product","operationId":"sap_catalog_product_api_sap_catalog__product__get","parameters":[{"name":"product","in":"path","required":true,"schema":{"type":"string","title":"Product"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Sap Catalog Product Api Sap Catalog  Product  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sap/catalog/{product}/apis/{api_name}":{"get":{"summary":"Sap Catalog Api","operationId":"sap_catalog_api_api_sap_catalog__product__apis__api_name__get","parameters":[{"name":"product","in":"path","required":true,"schema":{"type":"string","title":"Product"}},{"name":"api_name","in":"path","required":true,"schema":{"type":"string","title":"Api Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Sap Catalog Api Api Sap Catalog  Product  Apis  Api Name  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sap/dispatch":{"get":{"summary":"Sap Dispatch","description":"The dispatcher's view of one SAP Field Service Management connection:\ntoday's numbers, the unplanned backlog and today's planned activities;\none technician's schedule; or the backlog plan Liya would propose.\n\nREAD only, each part the person's own call (sapconfirm.person_call), and\nonly the read tools in sapapp.DISPATCH_TOOLS — planning, releasing and\napplying a plan are never a console write: they are proposed by Liya in\na chat and confirmed there by the person (sapcards' backlog card).","operationId":"sap_dispatch_api_sap_dispatch_get","parameters":[{"name":"server","in":"query","required":false,"schema":{"type":"string","default":"","title":"Server"}},{"name":"view","in":"query","required":false,"schema":{"type":"string","default":"today","title":"View"}},{"name":"technician","in":"query","required":false,"schema":{"type":"string","default":"","title":"Technician"}},{"name":"date","in":"query","required":false,"schema":{"type":"string","default":"","title":"Date"}},{"name":"timezone","in":"query","required":false,"schema":{"type":"string","default":"","title":"Timezone"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Sap Dispatch Api Sap Dispatch Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sap/setup":{"get":{"summary":"Sap Setup","description":"One card per SAP module the tenant has, the product agents as they\nstand against what an install would make, and the confirmation policy —\nshown, never set.","operationId":"sap_setup_api_sap_setup_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Sap Setup Api Sap Setup Get"}}}}}}},"/api/sap/product-agents":{"post":{"summary":"Sap Product Agents","description":"Install Liya's SAP product agents for the tenant's product\nconnections (sapagents): one agent per connected product and a router\nacross them, bound to the tenant. Idempotent — an agent already as\nplanned is left alone — and `dry_run` says what would change. Their SAP\ncalls stay person-confirmed: installing changes nothing about that.","operationId":"sap_product_agents_api_sap_product_agents_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ProductAgentsBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Sap Product Agents Api Sap Product Agents Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hr/overview":{"get":{"summary":"Hr Overview","description":"Requests in the last 7 days and how many were answered without a\nperson, the changes waiting on an employee's confirmation, onboardings\nin flight, and what needs an administrator.","operationId":"hr_overview_api_hr_overview_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Hr Overview Api Hr Overview Get"}}}}}}},"/api/hr/requests":{"get":{"summary":"Hr Requests","description":"Employees' requests to Liya HR and Liya Onboarding and what came of\neach — never what was asked — and the changes prepared for their own\nconfirmation.","operationId":"hr_requests_api_hr_requests_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}},{"name":"outcome","in":"query","required":false,"schema":{"type":"string","default":"","title":"Outcome"}},{"name":"agent","in":"query","required":false,"schema":{"type":"string","default":"","title":"Agent"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Hr Requests Api Hr Requests Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hr/onboarding":{"get":{"summary":"Hr Onboarding","description":"New hires' onboarding journeys, as Liya Onboarding last read each\nfrom the HR system, with the IT requests they confirmed.","operationId":"hr_onboarding_api_hr_onboarding_get","parameters":[{"name":"include_done","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Done"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Hr Onboarding Api Hr Onboarding Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hr/policies":{"get":{"summary":"Hr Policies","description":"The HR policy library Liya HR answers from, searched with `q`.","operationId":"hr_policies_api_hr_policies_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Hr Policies Api Hr Policies Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hr/setup":{"get":{"summary":"Hr Setup","description":"The HR system each HR agent reads, the guardrail pack, Liya HR and\nLiya Onboarding for this tenant, and where onboarding IT requests go.","operationId":"hr_setup_api_hr_setup_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Hr Setup Api Hr Setup Get"}}}}}}},"/api/hr/handoff":{"put":{"summary":"Put Hr Handoff","description":"Where this tenant's new hires' confirmed IT requests are filed: the\nIT service desk, an ITSM connection Liya Onboarding works through, or\nthe IT team's address.","operationId":"put_hr_handoff_api_hr_handoff_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrHandoffBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Put Hr Handoff Api Hr Handoff Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hr/guardrails":{"post":{"summary":"Install Hr Guardrails","description":"Install the HR guardrail pack's missing policies — the sensitive-matter\nescalation, the injection screen, PII masking. One present is left as\nit is, edited or switched off.","operationId":"install_hr_guardrails_api_hr_guardrails_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Install Hr Guardrails Api Hr Guardrails Post"}}}}}}},"/api/hr/library":{"put":{"summary":"Put Hr Library","description":"Choose the policy library Liya HR answers from: the synthetic demo\nhandbook, or a knowledge collection of the tenant's own HR documents,\nwith an optional link template to each policy on the customer's HR\nsite.","operationId":"put_hr_library_api_hr_library_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrLibraryBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Put Hr Library Api Hr Library Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/salesforce/overview":{"get":{"summary":"Salesforce Overview","description":"The Salesforce servers and who has connected, the agents' calls this\nweek by tool, the writes waiting for approval, and recent errors.","operationId":"salesforce_overview_api_salesforce_overview_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Salesforce Overview Api Salesforce Overview Get"}}}}}}},"/api/salesforce/setup":{"get":{"summary":"Salesforce Setup","description":"What Setup walks through: this instance's OAuth callback, the two\nsign-ins, the servers, and Liya for Salesforce as it stands.","operationId":"salesforce_setup_api_salesforce_setup_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Salesforce Setup Api Salesforce Setup Get"}}}}}}},"/api/salesforce/attach":{"post":{"summary":"Salesforce Attach","description":"Attach one of the tenant's Salesforce servers to Liya for Salesforce,\nwith a persona's tool set (Sales, Service, Data steward) or all of its\ntools — or change the persona of one already attached.","operationId":"salesforce_attach_api_salesforce_attach_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SfAttachBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Salesforce Attach Api Salesforce Attach Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/salesforce/org-model":{"get":{"summary":"Salesforce Org Model","description":"Each managed Salesforce server's org model as Liya for Salesforce\nhas it: when it was read and by whom, its counts, the objects, Flows,\nactions and templates by name, and the summary a turn is given. Metadata\nonly — never a record.","operationId":"salesforce_org_model_api_salesforce_org_model_get","parameters":[{"name":"server","in":"query","required":false,"schema":{"type":"string","default":"","title":"Server"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Salesforce Org Model Api Salesforce Org Model Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/salesforce/org-model/refresh":{"post":{"summary":"Salesforce Org Model Refresh","description":"Read the org model again now, as the administrator asking — through\ntheir own Salesforce connection — and keep it for the tenant. A read\nthat fails keeps the last good model and says why.","operationId":"salesforce_org_model_refresh_api_salesforce_org_model_refresh_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SfOrgRefreshBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Salesforce Org Model Refresh Api Salesforce Org Model Refresh Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/salesforce/playbooks":{"get":{"summary":"Salesforce Playbooks","description":"The tenant's saved Salesforce playbooks, each with its steps and its\nlast run.","operationId":"salesforce_playbooks_api_salesforce_playbooks_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Salesforce Playbooks Api Salesforce Playbooks Get"}}}}}},"post":{"summary":"Salesforce Playbook Save","description":"Save a playbook for the tenant: its steps as given (or as a draft\ngave them), or the Salesforce calls of a conversation that worked.","operationId":"salesforce_playbook_save_api_salesforce_playbooks_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SfPlaybookBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Salesforce Playbook Save Api Salesforce Playbooks Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/salesforce/playbooks/{pid}":{"put":{"summary":"Salesforce Playbook Update","description":"Change a saved playbook — by the person who saved it, or an\nadministrator.","operationId":"salesforce_playbook_update_api_salesforce_playbooks__pid__put","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SfPlaybookBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Salesforce Playbook Update Api Salesforce Playbooks  Pid  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Salesforce Playbook Delete","description":"Delete a saved playbook — by the person who saved it, or an\nadministrator. Writes it already holds for approval stay in the queue.","operationId":"salesforce_playbook_delete_api_salesforce_playbooks__pid__delete","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Salesforce Playbook Delete Api Salesforce Playbooks  Pid  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/salesforce/playbooks/draft":{"post":{"summary":"Salesforce Playbook Draft","description":"Draft a playbook from a description, with Liya for Salesforce's model\nand the org model — one model call, no tools, nothing sent to\nSalesforce, nothing saved: the person reads the steps and saves them.","operationId":"salesforce_playbook_draft_api_salesforce_playbooks_draft_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SfPlaybookDraftBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Salesforce Playbook Draft Api Salesforce Playbooks Draft Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/salesforce/playbooks/{pid}/run":{"post":{"summary":"Salesforce Playbook Run","description":"Run a playbook as the person asking: its reads now, through their own\nSalesforce connection; every write held for approval, together — the\napproval ids come back, to approve or reject in one batch.","operationId":"salesforce_playbook_run_api_salesforce_playbooks__pid__run_post","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SfPlaybookRunBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Salesforce Playbook Run Api Salesforce Playbooks  Pid  Run Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/finance/overview":{"get":{"summary":"Finance Overview","description":"The finance systems and who has connected, the invoices checked this\nweek and the variances found, the holds waiting for approval, the\nagents' calls by tool and recent errors.","operationId":"finance_overview_api_finance_overview_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Finance Overview Api Finance Overview Get"}}}}}}},"/api/finance/setup":{"get":{"summary":"Finance Setup","description":"What Setup walks through: this instance's OAuth callback, the finance\nsystems, Liya Finance as it stands, and the match tolerance.","operationId":"finance_setup_api_finance_setup_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Finance Setup Api Finance Setup Get"}}}}}}},"/api/finance/attach":{"post":{"summary":"Finance Attach","description":"Attach one of the tenant's finance servers to Liya Finance, and turn\nLiya's finance subagent on for the tenant.","operationId":"finance_attach_api_finance_attach_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinAttachBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Finance Attach Api Finance Attach Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/finance/tolerance":{"put":{"summary":"Finance Tolerance","description":"Set the tenant's invoice-match tolerance: a percentage, a fixed\namount, or both (whichever is less).","operationId":"finance_tolerance_api_finance_tolerance_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinToleranceBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Finance Tolerance Api Finance Tolerance Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/inbox/counts":{"get":{"summary":"Inbox Counts","description":"How much waits on the caller, lane by lane — Home's \"Needs attention\"\nrows (home.js), one per lane with its count and the action that settles\nit, and the Inbox's chips.\n\nA lane is counted only for a caller who may act on it (as the Inbox draws\na chip only then) and over exactly what its own list route would show\nthem — Cedar, tenant and all — by calling that route. A lane whose read\nfails is left out rather than failing the rest: Home is a summary, and\nthe lane's own list says why when it is opened. `waiting` (SAP calls\nheld for their requester) is shown but not in `total`: it waits on\nsomeone else.\n\n`next` names, per lane, the item a row's action opens first — read from\nthe same rows the count was, so it is never one the caller could not\nopen: the riskiest held write (the order a reviewer should work the\nqueue in), else a change request; the first draft; the case holding the\nfirst open incident action; the first review queue naming them.","operationId":"inbox_counts_api_inbox_counts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Inbox Counts Api Inbox Counts Get"}}}}}}},"/api/kill-switches":{"get":{"summary":"Kill Switches List","description":"Every engaged switch — what the console banner and fleet badges read.\n\nOnly for agents that exist. A switch left behind by an agent deleted\nbefore deletes cascaded is a phantom incident: counted on every page, and\nimpossible to lift, since lifting refuses an unknown agent. It is hidden\nhere rather than dropped, so it still holds if an agent is re-created\nunder that id — where it shows again, and can be lifted.\n\nAnd only for agents the caller may `read`, as every other list is: the\nswitch's detail route refuses them, and a banner counting \"1 agent\ncontained\" whose agent the fleet does not show both leaks that the agent\nexists and names it on hover.","operationId":"kill_switches_list_api_kill_switches_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Kill Switches List Api Kill Switches Get"}}}}}}},"/api/agents/{key}/kill-switch":{"get":{"summary":"Kill Switch Get","description":"ADP's GetKillSwitch: agents.killswitch.get and Cedar `get` on\nAgentKillSwitch::\"<agent>\", decided with `read` on the agent it refines\n(policy.REFINES), so every policy that kept the agent from a reader\nstill keeps its switch.","operationId":"kill_switch_get_api_agents__key__kill_switch_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Kill Switch Get Api Agents  Key  Kill Switch Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Kill Switch Put","description":"Engage (``{\"enabled\": true, \"reason\": ...}``) or lift\n(``{\"enabled\": false, \"reason\": ...}``, the reason optional).\n\nIts own permission, not governance.write — see killswitch.py. Both\ntransitions are audited under the kill-switch subsystem with the\nprincipal (the row's actor), the agent, the reason given for THAT\ntransition and the switch before and after (killswitch.audit_detail);\nthe no-op repeats are not, since they changed nothing and the standing\nswitch already names its author. ``enabled_by``/``enabled_at`` are the\nserver's: a body naming them is ignored (KillSwitchBody).\n\nADP's UpdateKillSwitch: agents.killswitch.update (held with\nagents.contain) and Cedar `update` on AgentKillSwitch::\"<agent>\",\ndecided with the `contain` on the agent it refines (policy.REFINES) —\nchecked on the switch as it stands and as this write would leave it,\nboth of which must pass, so `forbid … update … when { resource has\nenabled && !resource.enabled }` refuses a lift and leaves engaging open.","operationId":"kill_switch_put_api_agents__key__kill_switch_put","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KillSwitchBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Kill Switch Put Api Agents  Key  Kill Switch Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kill-switches/scoped/preview":{"post":{"summary":"Kill Switch Scoped Preview","description":"The agents a selector would contain now — the console's match count,\nbefore anyone engages anything. Changes nothing.","operationId":"kill_switch_scoped_preview_api_kill_switches_scoped_preview_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScopedPreviewBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Kill Switch Scoped Preview Api Kill Switches Scoped Preview Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kill-switches/scoped":{"get":{"summary":"Kill Switch Scoped List","operationId":"kill_switch_scoped_list_api_kill_switches_scoped_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Kill Switch Scoped List Api Kill Switches Scoped Get"}}}}}},"post":{"summary":"Kill Switch Scoped Engage","description":"Contain every agent a selector matches — now and any created later\n(killswitch's scoped switches). agents.contain, and Cedar's `contain` on\nEACH agent it matches now: a responder a policy forbids from containing\none agent may not contain it by naming its class instead. One audit row\nnames every agent it contained and every credential it revoked.","operationId":"kill_switch_scoped_engage_api_kill_switches_scoped_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScopedKillSwitchBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Kill Switch Scoped Engage Api Kill Switches Scoped Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kill-switches/scoped/{sid}":{"delete":{"summary":"Kill Switch Scoped Lift","description":"Lift one scoped switch: only what THAT episode contained is released\n— an agent its own switch or another scoped one holds stays contained.\nCedar's `contain` on each agent it holds, as engaging asked.","operationId":"kill_switch_scoped_lift_api_kill_switches_scoped__sid__delete","parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"string","title":"Sid"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ScopedLiftBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Kill Switch Scoped Lift Api Kill Switches Scoped  Sid  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/incident-hold":{"get":{"summary":"Incident Hold Get","description":"The agent's incident hold, and whether it is frozen (held or\ncontained) — what the console's evidence banner reads.","operationId":"incident_hold_get_api_agents__key__incident_hold_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Incident Hold Get Api Agents  Key  Incident Hold Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Incident Hold Put","description":"Place (``{\"enabled\": true, \"reason\": ...}``) or release an incident\nhold: the agent's configuration, transcripts and firings frozen as\nevidence (killswitch's incident hold) without stopping it. The kill\nswitch's permission and rules — a reason to place one, server-stamped\nwho and when, a repeat keeps the first placement — and audited under\nthe kill-switch subsystem as HOLD_PLACE / HOLD_RELEASE.","operationId":"incident_hold_put_api_agents__key__incident_hold_put","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentHoldBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Incident Hold Put Api Agents  Key  Incident Hold Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/kill-switch/history":{"get":{"summary":"Kill Switch History","description":"The agent's containment episodes, newest first — who engaged each,\nwhen and why, and who lifted it, when and why — rebuilt from the audit\nlog, which is where the switch's history lives (killswitch.history).\n`start`/`end` keep the episodes overlapping that window; paged by\n`page_size` (1-200, default 20) with a signed `page_token` bound to the\nagent, the window, the caller and their tenant scope.\n\nagents.killswitch.get and Cedar `get` on the switch, as the switch itself; the\nrows are read under the caller's audit tenant scope, so an episode\nrecorded in a tenant they may not read is not one here either. An id no\nswitch can apply to is a 404, as for the switch — unless the caller can\nread an engage recorded for it: a DELETED agent's containment history\n(the delete that ended its last episode included) is still its history,\nand the question after an incident is often about the agent that is\ngone. Recorded as a kill-switch read when audit_killswitch_reads is on.","operationId":"kill_switch_history_api_agents__key__kill_switch_history_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"start","in":"query","required":false,"schema":{"type":"string","maxLength":64,"default":"","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","maxLength":64,"default":"","title":"End"}},{"name":"page_size","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Page Size"}},{"name":"page_token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Page Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Kill Switch History Api Agents  Key  Kill Switch History Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/incidents":{"get":{"summary":"List Incidents","description":"Cases, newest first, filtered by state, agent, type or ``open``.","operationId":"list_incidents_api_incidents_get","parameters":[{"name":"state","in":"query","required":false,"schema":{"type":"string","maxLength":32,"default":"","title":"State"}},{"name":"agent","in":"query","required":false,"schema":{"type":"string","maxLength":128,"default":"","title":"Agent"}},{"name":"case_type","in":"query","required":false,"schema":{"type":"string","maxLength":16,"default":"","title":"Case Type"}},{"name":"open","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Open"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Incidents Api Incidents Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Create Incident","description":"Open an incident or inquiry by hand. An incident for an agent that\nalready has one open is a 409 naming it.","operationId":"create_incident_api_incidents_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaseCreateBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Incident Api Incidents Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/incidents/summary":{"get":{"summary":"Incidents Summary","description":"The case dashboard: time to triage, contain and root cause (median and\nmean hours, over the cases opened in the last `days`), how many open\ncases sit in each state and for how long — the stage holding the most\ncase-hours first — the corrective actions past due and the regulatory\nclocks still running. Over the cases this caller may see.","operationId":"incidents_summary_api_incidents_summary_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":3650,"minimum":1,"default":90,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Incidents Summary Api Incidents Summary Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/incidents/filings/redeliver":{"post":{"summary":"Redeliver Incident Filings","description":"Requeue every case filing the outbox gave up on (each reported as\nincident.filing.failed when it died): a containment is always owed its\ncase, and this is how an operator settles one the retries could not.\nInstance-wide, as the outbox is — so for a caller who sees every tenant.","operationId":"redeliver_incident_filings_api_incidents_filings_redeliver_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Redeliver Incident Filings Api Incidents Filings Redeliver Post"}}}}}}},"/api/incidents/{case_id}":{"get":{"summary":"Get Incident","description":"One case. ``reveal_reporter=true`` unseals a confidential concern's\nreporter — for an owner only, and recorded every time it is done.","operationId":"get_incident_api_incidents__case_id__get","parameters":[{"name":"case_id","in":"path","required":true,"schema":{"type":"string","title":"Case Id"}},{"name":"reveal_reporter","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Reveal Reporter"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Incident Api Incidents  Case Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Update Incident","description":"Change the title, description, severity, owner, root cause or\ncontributing factors.","operationId":"update_incident_api_incidents__case_id__patch","parameters":[{"name":"case_id","in":"path","required":true,"schema":{"type":"string","title":"Case Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaseUpdateBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Incident Api Incidents  Case Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/incidents/{case_id}/transition":{"post":{"summary":"Transition Incident","description":"Move a case along its states (incidents.TRANSITIONS); a step whose\nclaim is not yet true is a 409 saying what is missing.","operationId":"transition_incident_api_incidents__case_id__transition_post","parameters":[{"name":"case_id","in":"path","required":true,"schema":{"type":"string","title":"Case Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaseTransitionBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Transition Incident Api Incidents  Case Id  Transition Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/incidents/{case_id}/actions":{"post":{"summary":"Add Incident Action","description":"A corrective action: title, owner and due date, all required.","operationId":"add_incident_action_api_incidents__case_id__actions_post","parameters":[{"name":"case_id","in":"path","required":true,"schema":{"type":"string","title":"Case Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaseActionBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Add Incident Action Api Incidents  Case Id  Actions Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/incidents/{case_id}/actions/{action_id}":{"patch":{"summary":"Update Incident Action","operationId":"update_incident_action_api_incidents__case_id__actions__action_id__patch","parameters":[{"name":"case_id","in":"path","required":true,"schema":{"type":"string","title":"Case Id"}},{"name":"action_id","in":"path","required":true,"schema":{"type":"string","title":"Action Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaseActionBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Incident Action Api Incidents  Case Id  Actions  Action Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/incidents/{case_id}/regulatory":{"put":{"summary":"Set Incident Regulatory","description":"Mark a case a serious incident (EU AI Act Art. 73) — its reporting\nclock runs from ``aware_at`` (default now): 15 days, 10 for a death, 2\nfor a widespread infringement or critical infrastructure — or unmark one\nnot yet reported. Newly marked, its agent is put under a legal hold so\nits transcripts and memory, the evidence, cannot be deleted before the\nreport (holds.py).","operationId":"set_incident_regulatory_api_incidents__case_id__regulatory_put","parameters":[{"name":"case_id","in":"path","required":true,"schema":{"type":"string","title":"Case Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaseRegulatoryBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Incident Regulatory Api Incidents  Case Id  Regulatory Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/incidents/{case_id}/regulatory/report":{"post":{"summary":"Report Incident","description":"Record that the serious incident was reported: to which authority,\nunder which reference, when (default now). The clock stops; a report\nafter the deadline is recorded as late.","operationId":"report_incident_api_incidents__case_id__regulatory_report_post","parameters":[{"name":"case_id","in":"path","required":true,"schema":{"type":"string","title":"Case Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaseReportBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Report Incident Api Incidents  Case Id  Regulatory Report Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/concerns":{"post":{"summary":"Raise Concern","description":"Raise a concern about an agent — anyone signed in may, whatever their\nrole. ``confidential`` seals the reporter from everyone working the case\nexcept owners. The answer is the case's id and nothing of the case: a\nreporter is not thereby a reader of cases.","operationId":"raise_concern_api_concerns_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConcernBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Raise Concern Api Concerns Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/kill-switch/detectors":{"get":{"summary":"List Detectors","description":"This agent's detectors, their firings, and the raw signal windows the\ntuning view charts.\n\n`page_size` (1-200) pages the policies by name, `next_page_token` walks\nthe rest and `total_size` counts every page; without it the whole list\ncomes back, as it always has, so an older console is unchanged. `tag=k:v`\nkeeps the detectors carrying that tag (`tag=k` any value). A token is\nbound to the agent and the tag it was issued under.\n\nADP's ListKillSwitchPolicies: agents.killswitch_policy.list, and Cedar\n`list` on the agent's detectors as a whole (KillSwitchPolicy::\"<agent>/*\",\npolicy.LIST_SCOPE), decided with `read` on the agent — the signal windows\nare its traffic, errors and guardrail blocks, five minutes at a time,\nwhich is `read` — and then on each detector, so a forbid on one leaves\nthat one out without blanking the rest (_listable_children).","operationId":"list_detectors_api_agents__key__kill_switch_detectors_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"page_size","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Page Size"}},{"name":"page_token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Page Token"}},{"name":"tag","in":"query","required":false,"schema":{"type":"string","default":"","title":"Tag"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Detectors Api Agents  Key  Kill Switch Detectors Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/kill-switch/detectors/{name}":{"get":{"summary":"Get Detector","description":"One of this agent's detectors (ADP's GetKillSwitchPolicy:\nagents.killswitch_policy.get, Cedar `get` on KillSwitchPolicy::\n\"<agent>/<name>\", decided with `read` on the agent). Gated before the\nlookup, as delete is, so a caller Cedar forbids cannot probe which\nnames exist.","operationId":"get_detector_api_agents__key__kill_switch_detectors__name__get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Detector Api Agents  Key  Kill Switch Detectors  Name  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Put Detector","description":"Held with the kill switch's own permission: an enforce-mode detector\nengages it, so whoever may configure one may, in effect, contain.\nA whole-record replace that creates the detector when the name is new\n(ADP's CreateKillSwitchPolicy: agents.killswitch_policy.create, Cedar\n`create`) and replaces it otherwise (UpdateKillSwitchPolicy: .update,\n`update`) — both held with agents.contain; PATCH changes named fields\nof an existing one.","operationId":"put_detector_api_agents__key__kill_switch_detectors__name__put","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DetectorBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Detector Api Agents  Key  Kill Switch Detectors  Name  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Patch Detector","description":"Field-mask update (ADP's UpdateKillSwitchPolicy). `update_mask` (a\nlist, or one comma-separated string) is required and names the fields to\nwrite — display_name, tags, about, enabled, signal, mode, detector, or\none of the detector's own fields as detector.<field> — and every other\nfield keeps what is stored (ksdetect.patched). Any other path, an empty\nmask, a body field the mask leaves out, or a kind changed without the\nwhole detector is a 400; an unknown name a 404, since PATCH never\ncreates. Gated, judged for weakening and audited as a PUT of the merged\nrecord would be, with the mask on the audit row. A save that changes\nonly labels keeps the detector's drift state (ksdetect.save_policy).","operationId":"patch_detector_api_agents__key__kill_switch_detectors__name__patch","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Patch Detector Api Agents  Key  Kill Switch Detectors  Name  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Detector","description":"Idempotent, as ADP's DeleteKillSwitchPolicy is: a name this agent has\nno detector under — never created, already deleted, or another agent's —\nanswers 200 with `existed: false` and writes nothing, so a retried delete\nsucceeds instead of reading as a failure. Only a delete that removed\nsomething is audited. The detector's evaluation state goes with it\n(ksdetect.delete_policy), so one re-created under the name starts fresh.\nagents.killswitch_policy.delete (held with agents.contain).","operationId":"delete_detector_api_agents__key__kill_switch_detectors__name__delete","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ReasonBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Detector Api Agents  Key  Kill Switch Detectors  Name  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/kill-switch/signals/{signal}":{"get":{"summary":"Signal History","description":"One signal's windows for this agent over up to seven days (ADP's\nGetKillSwitchSignalHistory): per window, violations, observations and\ntheir rate, oldest first, with the range served, the window size and\nthe burst gate, so a threshold is tuned against a week of what this\nagent actually does.\n\n`start` and `end` (ISO-8601, naive is UTC) default to a week ago and\nnow and are clamped to them — nothing older is kept — and the answer\ncarries the range it served: `start` is where the first window served\nbegins (the start of the one the asked-for start falls in), so every\nwindow starts inside it. Backwards, in the future or wholly before the\nweek is a 400, as is a signal the detectors do not record.\n\n`read` on the agent, as the detectors list that charts the last 48\nhours of the same windows is — gated before the signal or the agent is\nlooked at, so a caller Cedar refuses learns neither. Audited as a\ndetector read when audit_killswitch_reads is on: ADP's is an RPC of the\nkill-switch service.\n\nCedar `list` on the agent's detectors as a whole (KillSwitchPolicy::\n\"<agent>/*\"), as the detectors list is — decided with `read` on the\nagent (policy.REFINES), so nothing that hid the agent stops hiding its\nwindows, and a `forbid get, list … resource is KillSwitchPolicy` that\nhides the detectors hides the windows they are tuned on too.","operationId":"signal_history_api_agents__key__kill_switch_signals__signal__get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"signal","in":"path","required":true,"schema":{"type":"string","title":"Signal"}},{"name":"start","in":"query","required":false,"schema":{"type":"string","maxLength":64,"default":"","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","maxLength":64,"default":"","title":"End"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Signal History Api Agents  Key  Kill Switch Signals  Signal  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/kill-switch/detectors:backtest":{"post":{"summary":"Backtest Detector","description":"Replay a candidate detector over this agent's windows of one signal\nand mark where it would have fired (ksdetect.backtest): per window the\ncounts, the statistic (Wilson lower bound or drift score), whether it was\njudged at all and `would_fire`, with `fired_count` — what ADP's tuning\npage computes client-side from GetKillSwitchSignalHistory, computed here\nby the step evaluate() takes so the preview cannot disagree with it.\n\n`read` on the agent, not `contain`: it shows the same windows the\nhistory route serves and saves, fires, alerts and contains nothing — a\nPOST only because a detector is a body. Gated before the agent is\nlooked up, as the history route is. A detector a save would refuse is\na 400 with the save's own words; so is a range the history route\nrefuses. Audited as a detector read when audit_killswitch_reads is on.\n\nCedar `list` on KillSwitchPolicy::\"<agent>/*\", as the history route: a\ncandidate has no name of its own to be judged by, and a policy that\nhides this agent's detectors must hide what one would have done.","operationId":"backtest_detector_api_agents__key__kill_switch_detectors_backtest_post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DetectorBacktestBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Backtest Detector Api Agents  Key  Kill Switch Detectors Backtest Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kill-switch/firings":{"get":{"summary":"Kill Switch Firings","description":"ADP's ListKillSwitchFirings across the fleet: every detector firing\nrecorded — shadow ones included — newest first, each with its evidence\n(violations, observations, rate, statistic, threshold, the window and\nits size) and what it did.\n\nNarrowed by `agent`, `policy` (the detector's name), `policy_uid`,\n`signal`, `mode` and `outcome` (each exact), `start`/`end` on the window\njudged, and an AIP-160 `filter` over the same fields and the evidence;\npaged by `page_size` (1-200, default 50) with signed keyset tokens bound\nto all of it and to the caller. `total_size` counts every page;\n`window_seconds` is the window every firing judged.\n\nagents.read, as each agent's detectors are, and only the firings of\nagents the caller may `read` under Cedar — dropped BEFORE the filter,\nthe page and the count, so neither a filter that matched a hidden\nagent's firing nor a total that counted one says it exists.\n\n`include_deleted=true` adds the firings kept as history after their\nagent or detector was deleted (detector_firings_keep_on_delete), marked\ndeleted_at, agent_deleted and policy_deleted — ADP's firings, which\noutlive both. A deleted agent's are still judged by Cedar's `read` on\nits id — as the agent it was when deleted (_readable_history), its tags,\nblueprint, owner and kind, so every forbid that hid its firings hides\nits history, and one on an agent re-created under the id does not decide\nfor its predecessor. Only here: an agent's own list is its current\ndetectors'.","operationId":"kill_switch_firings_api_kill_switch_firings_get","parameters":[{"name":"agent","in":"query","required":false,"schema":{"type":"string","maxLength":128,"default":"","title":"Agent"}},{"name":"policy","in":"query","required":false,"schema":{"type":"string","maxLength":64,"default":"","title":"Policy"}},{"name":"policy_uid","in":"query","required":false,"schema":{"type":"string","maxLength":64,"default":"","title":"Policy Uid"}},{"name":"signal","in":"query","required":false,"schema":{"type":"string","maxLength":64,"default":"","title":"Signal"}},{"name":"mode","in":"query","required":false,"schema":{"type":"string","maxLength":16,"default":"","title":"Mode"}},{"name":"outcome","in":"query","required":false,"schema":{"type":"string","maxLength":32,"default":"","title":"Outcome"}},{"name":"start","in":"query","required":false,"schema":{"type":"string","maxLength":64,"default":"","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","maxLength":64,"default":"","title":"End"}},{"name":"filter","in":"query","required":false,"schema":{"type":"string","default":"","title":"Filter"}},{"name":"page_size","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Page Size"}},{"name":"page_token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Page Token"}},{"name":"include_deleted","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Deleted"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Kill Switch Firings Api Kill Switch Firings Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/kill-switch/firings":{"get":{"summary":"Agent Kill Switch Firings","description":"This agent's firings (ADP's ListKillSwitchFirings under one agent),\nnarrowed and paged as the fleet list is. `read` on the agent, gated\nbefore it is looked up, as the detectors list that shows its first 100\nis; an id no detector can watch is a 404. A token is bound to the agent,\nso one issued here is refused under another agent or the fleet list.\n\nCedar `list` on KillSwitchPolicy::\"<agent>/*\" (decided with `read` on\nthe agent): a firing is its detector's record, so a policy hiding the\ndetectors hides their firings.","operationId":"agent_kill_switch_firings_api_agents__key__kill_switch_firings_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"policy","in":"query","required":false,"schema":{"type":"string","maxLength":64,"default":"","title":"Policy"}},{"name":"policy_uid","in":"query","required":false,"schema":{"type":"string","maxLength":64,"default":"","title":"Policy Uid"}},{"name":"signal","in":"query","required":false,"schema":{"type":"string","maxLength":64,"default":"","title":"Signal"}},{"name":"mode","in":"query","required":false,"schema":{"type":"string","maxLength":16,"default":"","title":"Mode"}},{"name":"outcome","in":"query","required":false,"schema":{"type":"string","maxLength":32,"default":"","title":"Outcome"}},{"name":"start","in":"query","required":false,"schema":{"type":"string","maxLength":64,"default":"","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","maxLength":64,"default":"","title":"End"}},{"name":"filter","in":"query","required":false,"schema":{"type":"string","default":"","title":"Filter"}},{"name":"page_size","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Page Size"}},{"name":"page_token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Page Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Kill Switch Firings Api Agents  Key  Kill Switch Firings Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kill-switch/triage":{"get":{"summary":"Kill Switch Triage List","description":"The triage queue: firings that warned or contained, newest first,\nwith their status, due time and whether they are overdue — Defender's\nalert queue, for agents. Only the agents the caller may `read`.","operationId":"kill_switch_triage_list_api_kill_switch_triage_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","maxLength":32,"default":"","title":"Status"}},{"name":"agent","in":"query","required":false,"schema":{"type":"string","maxLength":128,"default":"","title":"Agent"}},{"name":"overdue","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Overdue"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Kill Switch Triage List Api Kill Switch Triage Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kill-switch/firings/{firing_id}/triage":{"post":{"summary":"Kill Switch Triage","description":"Triage one firing: acknowledge it, dismiss it as a false positive\n(a reason required), reopen a dismissal, or confirm a compromise — which\ncontains the agent in this one call (_confirm_compromise). agents.contain\nand Cedar `contain` on the firing's agent, as engaging its switch is:\ndismissing a firing lowers the agent's risk and confirming one engages\nthe switch, so neither is a reader's step.","operationId":"kill_switch_triage_api_kill_switch_firings__firing_id__triage_post","parameters":[{"name":"firing_id","in":"path","required":true,"schema":{"type":"string","title":"Firing Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FiringTriageBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Kill Switch Triage Api Kill Switch Firings  Firing Id  Triage Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{key}/risk":{"get":{"summary":"Agent Risk","description":"The agent's risk: its triaged firings decayed and weighted into a\nscore (0-100) and a level (none, low, medium, high), and how many are\nopen, overdue, dismissed or confirmed (risktriage).","operationId":"agent_risk_api_agents__key__risk_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Risk Api Agents  Key  Risk Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kill-switch/risk":{"get":{"summary":"Fleet Risk","description":"Every readable agent's risk, riskiest first — Entra's risky users,\nfor agents.","operationId":"fleet_risk_api_kill_switch_risk_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Fleet Risk Api Kill Switch Risk Get"}}}}}}},"/api/security/summary":{"get":{"summary":"Security Summary","description":"Are the controls working: denials by type over time, the agents that\ntrip them most, manifest drift, quarantines and egress refusals, and the\nmedian and p90 time to remediate what they caught (secsummary) — the\nAI security posture overview Defender for Cloud and Purview's AI hub\ngive, read from the audit log as Postgres aggregates.\n\naudit.read, as every number is a count of audit rows; a tenant-confined\nreader counts only its tenants' rows, as the audit log shows it. The\nagent ranking drops agents the caller may not `read` under Cedar\nBEFORE it is cut, so a hidden agent neither appears nor shortens it.\nCurrent kill-switch state rides along (engaged switches the caller may\nread) so the page can say what is contained now, not only what was.","operationId":"security_summary_api_security_summary_get","parameters":[{"name":"window","in":"query","required":false,"schema":{"type":"string","maxLength":8,"default":"7d","title":"Window"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Security Summary Api Security Summary Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kill-switch/default-detectors":{"get":{"summary":"List Default Detectors","description":"The tenant default detectors, each with the agents it watches, and\nwhat the form needs to add one (the per-agent list's signal, mode and\nconfidence choices, with the caps). agents.read, as each agent's list is;\nno Cedar check of its own, since a default is no one agent's — the\nagents it names are only those the caller may read.","operationId":"list_default_detectors_api_kill_switch_default_detectors_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Default Detectors Api Kill Switch Default Detectors Get"}}}}}}},"/api/kill-switch/default-detectors/{name}":{"get":{"summary":"Get Default Detector","operationId":"get_default_detector_api_kill_switch_default_detectors__name__get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Default Detector Api Kill Switch Default Detectors  Name  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Put Default Detector","description":"Create or replace tenant default `name`. Gated on every containable\nagent as stored and as it would be saved (_default_detector_gate);\ndemoting, disabling or loosening an enforcing one takes governance.weaken\nand a reason, as for one agent's; written under the detectors' lock, 409\nif it moved meanwhile; audited as a detector save marked `default`.","operationId":"put_default_detector_api_kill_switch_default_detectors__name__put","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DetectorBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Default Detector Api Kill Switch Default Detectors  Name  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Default Detector","description":"Idempotent, as an agent's detector delete is: a name no default has\nanswers `existed: false` and writes nothing. Gated on every agent before\nthe lookup; an enforcing default takes governance.weaken and a reason,\nsince removing it stops it containing every agent it covers.","operationId":"delete_default_detector_api_kill_switch_default_detectors__name__delete","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ReasonBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Default Detector Api Kill Switch Default Detectors  Name  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kill-switch/effective-detectors":{"get":{"summary":"Effective Detectors","description":"What the detectors evaluate (ADP's ListEffectiveKillSwitchPolicies):\nevery agent's own detectors and every default resolved onto each agent it\ncovers, each with the `key` its state and firings go by and `default`.\nOnly agents the caller may read, dropped before `agent` narrows it, so\nnaming a hidden one reads as an agent with none.","operationId":"effective_detectors_api_kill_switch_effective_detectors_get","parameters":[{"name":"agent","in":"query","required":false,"schema":{"type":"string","maxLength":128,"default":"","title":"Agent"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Effective Detectors Api Kill Switch Effective Detectors Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/sso-enforcement":{"get":{"summary":"Sso Enforcement Get","operationId":"sso_enforcement_get_api_auth_sso_enforcement_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Sso Enforcement Get Api Auth Sso Enforcement Get"}}}}}},"put":{"summary":"Sso Enforcement Put","description":"Require SSO: password sign-in off for every account it covers, owners\nkept as break-glass.\n\nOwner-only either way. Switching it on shuts every non-owner's password\nout, and who may still use one (break_glass) is an exemption from a\ncontrol — both are the call of someone who holds everything. Anything\nthat lets a person back in by password is also a weakening, taking\ngovernance.weaken and a reason on the record, as switching off any other\ncontrol does.","operationId":"sso_enforcement_put_api_auth_sso_enforcement_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SSOEnforcementBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Sso Enforcement Put Api Auth Sso Enforcement Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/session-policy":{"get":{"summary":"Session Policy Get","operationId":"session_policy_get_api_auth_session_policy_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Session Policy Get Api Auth Session Policy Get"}}}}}},"put":{"summary":"Session Policy Put","description":"Set how long a person's console session lasts from sign-in, and after\nhow long without use it ends (0: no limit). Applied to the sessions\nalready open, not only the next sign-in's: a session older than a\nshortened lifetime, or idle past a new limit, ends now — the caller's\nown included.","operationId":"session_policy_put_api_auth_session_policy_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionPolicyBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Session Policy Put Api Auth Session Policy Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/sessions":{"get":{"summary":"Login Sessions List","description":"Every person signed in to the console now, most recently active\nfirst, with the policy their sessions live by. Service accounts' and\nMCP calls' sessions are not here: they are a machine's, listed where\nits credential is.","operationId":"login_sessions_list_api_auth_sessions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Login Sessions List Api Auth Sessions Get"}}}}}}},"/api/auth/sessions/{session_id}":{"delete":{"summary":"Login Session End","description":"Sign one session out, now. The account stays as it is; its holder\nsigns in again to carry on. 404 for an id that is no live session —\nalready ended, or never one.","operationId":"login_session_end_api_auth_sessions__session_id__delete","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Login Session End Api Auth Sessions  Session Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/access/users/{name}/sessions":{"delete":{"summary":"Login Sessions End User","description":"Sign ``name`` out everywhere: every console session they hold, ended\nnow, without disabling the account. Their service-account and MCP\nsessions are not touched (logintokens.revoke_human).","operationId":"login_sessions_end_user_api_access_users__name__sessions_delete","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Login Sessions End User Api Access Users  Name  Sessions Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/sso":{"get":{"summary":"Sso Providers Admin","operationId":"sso_providers_admin_api_auth_sso_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Sso Providers Admin Api Auth Sso Get"}}}}}}},"/api/auth/sso/{name}":{"put":{"summary":"Put Sso Provider","operationId":"put_sso_provider_api_auth_sso__name__put","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SSOProviderBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Sso Provider Api Auth Sso  Name  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Sso Provider","operationId":"delete_sso_provider_api_auth_sso__name__delete","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Sso Provider Api Auth Sso  Name  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/secrets":{"get":{"summary":"Secrets List","operationId":"secrets_list_api_secrets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Secrets List Api Secrets Get"}}}}}}},"/api/secrets/{label}":{"put":{"summary":"Put Secret","operationId":"put_secret_api_secrets__label__put","parameters":[{"name":"label","in":"path","required":true,"schema":{"type":"string","title":"Label"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Secret Api Secrets  Label  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Secret Endpoint","operationId":"delete_secret_endpoint_api_secrets__label__delete","parameters":[{"name":"label","in":"path","required":true,"schema":{"type":"string","title":"Label"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Secret Endpoint Api Secrets  Label  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/secret-store":{"get":{"summary":"Secret Store List","operationId":"secret_store_list_api_secret_store_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":25,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"label","in":"query","required":false,"schema":{"type":"string","default":"","title":"Label"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","default":"id","title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Secret Store List Api Secret Store Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Secret Store Create","operationId":"secret_store_create_api_secret_store_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretCreateBody"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Secret Store Create Api Secret Store Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/secret-store/{sid}":{"patch":{"summary":"Secret Store Update","operationId":"secret_store_update_api_secret_store__sid__patch","parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"string","title":"Sid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretPatchBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Secret Store Update Api Secret Store  Sid  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Secret Store Delete","operationId":"secret_store_delete_api_secret_store__sid__delete","parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"string","title":"Sid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Secret Store Delete Api Secret Store  Sid  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/guardrails":{"get":{"summary":"Guardrails List","description":"Every guardrail keyed by name, and the form's metadata. Given any query\nparameter it also answers the list as a query — `items` (name_contains,\nprovider, tag, filter, order_by, one keyset page), `next_page_token` and\n`total_size` — beside the unchanged map, so the console and older clients\nread what they always read.\n\n`filter` is ADP's Filter.filter: an AIP-160 expression over the row's\ncolumns (guardrails.FILTER_FIELDS — name, display_name, kind, enabled,\nmode, direction, action, fail_mode, the stamps, provider/engine,\nconfig.backend.region, tags.<key>, agents, and has(topics), has(entities),\nhas(patterns)), ANDed with the other filters. One it cannot honour — an\nunknown field, bad syntax — is a 400 naming the character it stopped at.\n\nBoth leave out a guardrail a Cedar policy forbids the caller to `read`\n(_readable_guardrails), before paging, so a page is never short and the\ntotal never counts a rule the caller cannot open.","operationId":"guardrails_list_api_guardrails_get","parameters":[{"name":"name_contains","in":"query","required":false,"schema":{"type":"string","default":"","title":"Name Contains"}},{"name":"provider","in":"query","required":false,"schema":{"type":"string","default":"","title":"Provider"}},{"name":"order_by","in":"query","required":false,"schema":{"type":"string","default":"","title":"Order By"}},{"name":"page_size","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Page Size"}},{"name":"page_token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Page Token"}},{"name":"tag","in":"query","required":false,"schema":{"type":"string","default":"","title":"Tag"}},{"name":"filter","in":"query","required":false,"schema":{"type":"string","default":"","title":"Filter"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Guardrails List Api Guardrails Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/guardrails/{name}":{"get":{"summary":"Get Guardrail","description":"One guardrail: the stored record, its etag (also the ETag header, the\nIf-Match a later PUT or DELETE sends), where it is decided, the agents it\nprotects today, and its live monitor evidence and evaluation errors —\nwhat the list gives for every rule, without reading every rule.\n\nCedar `read` on the guardrail (op \"get\"), on top of governance.read: a\npolicy can keep the rules tagged team=security to that team. One it\nkeeps from the caller is a 404, as a name nobody saved is — the list\nleaves it out, and a 403 here would confirm what the list hid. The\nrefusal is still audited, as policy.denied.","operationId":"get_guardrail_api_guardrails__name__get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Guardrail Api Guardrails  Name  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Put Guardrail","description":"Create a guardrail, or replace one whole: a field left out is saved\nas its default. To change some fields and keep the rest, PATCH. The kind\n(and a kind's fixed fields, such as an external detector's engine) of a\nstored rule cannot change, nor a content-safety rule's engine move it\nbetween local and external scoring — 409.","operationId":"put_guardrail_api_guardrails__name__put","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuardrailBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Guardrail Api Guardrails  Name  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Patch Guardrail","description":"Field-mask update (ADP's UpdateGuardrail): change some fields of a\nstored guardrail and keep the rest (guardrails.merged).\n\n`update_mask` (in the body or as a query parameter, not both; a list or\none comma-separated string, and in the query repeated or comma-separated)\nnames the fields to write; a body field it leaves out is ignored, not\nvalidated, and a named field the body leaves out or sends null goes back\nto its default.\nWithout a mask, the fields the body sends with a value are written and a\nnull keeps what is stored. A mask naming a field this rule does not\nhave, or an unknown body field without one, is a 400. `kind`, and a\nkind's fixed fields, may be sent only as stored, and a content-safety\nengine only within its provider (409). 404 when there is no such\nguardrail — PATCH never creates.\n\nThe merged record is typed as a PUT body is (422) and then takes PUT's\nexact path (_save_guardrail): validated whole, gated by Cedar as it\nstands and as it would be stored, judged for weakening — demoting,\ndisabling or narrowing an enforcing rule takes governance.weaken and a\n`reason` — refused (412) on a stale If-Match, written under the registry\nlock, stamped, its monitor evidence reset when it is promoted to\nenforce. Audited as the PUT is (guardrail.save, .enforce, .demote,\n.disable), with the fields it changed as update_mask.","operationId":"patch_guardrail_api_guardrails__name__patch","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"update_mask","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Update Mask"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Patch Guardrail Api Guardrails  Name  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Guardrail","description":"Deleting an enforcing guardrail weakens; one that still covers agents\nis refused with 409 naming them unless ?force=true — which, since it\nremoves their protection, is itself a weakening and needs the reason.","operationId":"delete_guardrail_api_guardrails__name__delete","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"force","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Force"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/EtagReasonBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Guardrail Api Guardrails  Name  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/guardrails/{name}/used-by":{"get":{"summary":"Guardrail Used By","description":"Where one guardrail applies (guardrails.used_by): its own scope, the\nsets that attach it — each saying which set in its chain lists the rule,\nitself or a base it extends — whether it is attached directly (in no\nset), and the agents whose calls it covers on their binding today. The\nconsole's \"used by\" view.\n\nCedar `read` on the rule, as GET one asks: a rule the caller may not\nread is the 404 an unknown name gets.","operationId":"guardrail_used_by_api_guardrails__name__used_by_get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Guardrail Used By Api Guardrails  Name  Used By Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/guardrail-sets":{"get":{"summary":"Guardrail Sets List","description":"Every named guardrail set, keyed by name (see _set_view), and the\nkeys a scope may name.","operationId":"guardrail_sets_list_api_guardrail_sets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Guardrail Sets List Api Guardrail Sets Get"}}}}}}},"/api/guardrail-sets/{name}":{"get":{"summary":"Guardrail Set Get","operationId":"guardrail_set_get_api_guardrail_sets__name__get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Guardrail Set Get Api Guardrail Sets  Name  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Put Guardrail Set","description":"Create a set, or replace one whole. 400 for a member no guardrail is\ncalled, a base set that does not exist or an `extends` chain that loops;\n412 on a stale If-Match; 403 without Cedar `configure` on a rule whose\nattachment it changes; and a save that leaves an enforcing rule applying\nto fewer calls — an estate-wide rule put in a scoped set, a set's scope\nnarrowed, a rule dropped from the one set that took it somewhere — takes\ngovernance.weaken and a `reason`, as narrowing the rule itself does.","operationId":"put_guardrail_set_api_guardrail_sets__name__put","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuardrailSetBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Guardrail Set Api Guardrail Sets  Name  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Guardrail Set","description":"Remove a set. Its rules go back to whatever else attaches them — their\nother sets, or everywhere when it was their only one; a delete that\nleaves an enforcing rule applying to fewer calls (it was also in a set\nscoped more widely than its other one) is a weakening, as a save is.\n409 while another set extends it.","operationId":"delete_guardrail_set_api_guardrail_sets__name__delete","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/EtagReasonBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Guardrail Set Api Guardrail Sets  Name  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/guardrail-bindings":{"get":{"summary":"Guardrail Bindings List","description":"Every agent's guardrail binding, keyed by agent, and the modes one may\ntake. An agent with none inherits the estate's rules.","operationId":"guardrail_bindings_list_api_guardrail_bindings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Guardrail Bindings List Api Guardrail Bindings Get"}}}}}}},"/api/guardrail-bindings/{agent}":{"get":{"summary":"Guardrail Binding Get","description":"One agent's binding, and every stage's rule set it comes to\n(guardrails.effective_stages) — 404 when the agent has none.","operationId":"guardrail_binding_get_api_guardrail_bindings__agent__get","parameters":[{"name":"agent","in":"path","required":true,"schema":{"type":"string","title":"Agent"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Guardrail Binding Get Api Guardrail Bindings  Agent  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Put Guardrail Binding","description":"Create or replace one agent's binding. 400 for a mode it does not\nknow or a guardrail that does not exist; 412 on a stale If-Match; 403\nwithout Cedar `configure` on a rule whose reach of the agent it changes;\nand a save that takes an enforcing rule off the agent — a replace\nbinding over the estate's rules, a rule dropped from one — takes\ngovernance.weaken and a `reason`, as narrowing the rule itself does.","operationId":"put_guardrail_binding_api_guardrail_bindings__agent__put","parameters":[{"name":"agent","in":"path","required":true,"schema":{"type":"string","title":"Agent"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuardrailBindingBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Guardrail Binding Api Guardrail Bindings  Agent  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Guardrail Binding","description":"Remove an agent's binding: it goes back to the estate's rules. A\ndelete that takes an enforcing rule off it — an inherit binding's own\nrule, one the agent is excluded from otherwise — is a weakening, as a\nsave is; going back from replace to the estate's rules only adds.","operationId":"delete_guardrail_binding_api_guardrail_bindings__agent__delete","parameters":[{"name":"agent","in":"path","required":true,"schema":{"type":"string","title":"Agent"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ReasonBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Guardrail Binding Api Guardrail Bindings  Agent  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/guardrails/{name}/monitor":{"post":{"summary":"Label Guardrail Monitor","description":"Label a monitor-mode match a false (or true) positive — the review a\nrollout is promoted on. Returns the row and the rule's label counts.\n\nConfiguring the rule under Cedar (op \"update\"): a label is part of the\ncase for enforcing it, so who may not change the rule may not make that\ncase either — concealed, as PATCH is, when they may not read it. 404\nfor an unknown rule or a row that is not among its recent ones; 400 for\na label this does not take. Audited, with the row's id and label only.","operationId":"label_guardrail_monitor_api_guardrails__name__monitor_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorLabelBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Label Guardrail Monitor Api Guardrails  Name  Monitor Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/guardrails/preview":{"post":{"summary":"Preview Guardrail","description":"Dry-run the configured policies over sample text.\n\nA redaction rule that nobody can test before enabling is a rule nobody\nenables — and one that silently mangles real tickets if they do.\n\nEvery enabled rule still runs, readable or not: a dry run that skipped\nthe rules a policy hides from the caller would answer \"passes\" for text\nthe live path refuses. What the caller may not `read` (as a list reads,\n_readable_guardrails) is named \"hidden policy\" in the answer instead\n(_hide_guardrail_names), so the dry run cannot be used to find it.","operationId":"preview_guardrail_api_guardrails_preview_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Preview Guardrail Api Guardrails Preview Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/guardrail-profiles":{"get":{"summary":"Gw Guardrails List","operationId":"gw_guardrails_list_api_guardrail_profiles_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"evaluation","in":"query","required":false,"schema":{"type":"string","default":"","title":"Evaluation"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"","title":"Status"}},{"name":"policy","in":"query","required":false,"schema":{"type":"string","default":"","title":"Policy"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Gw Guardrails List Api Guardrail Profiles Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Gw Guardrails Create","operationId":"gw_guardrails_create_api_guardrail_profiles_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Gw Guardrails Create Api Guardrail Profiles Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/guardrail-profiles/meta":{"get":{"summary":"Gw Guardrails Meta","operationId":"gw_guardrails_meta_api_guardrail_profiles_meta_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Gw Guardrails Meta Api Guardrail Profiles Meta Get"}}}}}}},"/api/guardrail-profiles/test-pattern":{"post":{"summary":"Gw Guardrails Test Pattern","description":"Try one custom pattern on sample text: its matches as offsets.","operationId":"gw_guardrails_test_pattern_api_guardrail_profiles_test_pattern_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Gw Guardrails Test Pattern Api Guardrail Profiles Test Pattern Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/guardrail-profiles/{gid}":{"get":{"summary":"Gw Guardrails Get","operationId":"gw_guardrails_get_api_guardrail_profiles__gid__get","parameters":[{"name":"gid","in":"path","required":true,"schema":{"type":"string","title":"Gid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Gw Guardrails Get Api Guardrail Profiles  Gid  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Gw Guardrails Update","operationId":"gw_guardrails_update_api_guardrail_profiles__gid__put","parameters":[{"name":"gid","in":"path","required":true,"schema":{"type":"string","title":"Gid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Gw Guardrails Update Api Guardrail Profiles  Gid  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Gw Guardrails Delete","operationId":"gw_guardrails_delete_api_guardrail_profiles__gid__delete","parameters":[{"name":"gid","in":"path","required":true,"schema":{"type":"string","title":"Gid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Gw Guardrails Delete Api Guardrail Profiles  Gid  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/guardrail-profiles/{gid}/duplicate":{"post":{"summary":"Gw Guardrails Duplicate","operationId":"gw_guardrails_duplicate_api_guardrail_profiles__gid__duplicate_post","parameters":[{"name":"gid","in":"path","required":true,"schema":{"type":"string","title":"Gid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Gw Guardrails Duplicate Api Guardrail Profiles  Gid  Duplicate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/guardrail-profiles/{gid}/test":{"post":{"summary":"Gw Guardrails Test","description":"Dry run: which policies fire on this text and what it becomes. Uses\nthe policies in the body when given (the unsaved edit), else the stored\nones. Records nothing; it is not an intervention.","operationId":"gw_guardrails_test_api_guardrail_profiles__gid__test_post","parameters":[{"name":"gid","in":"path","required":true,"schema":{"type":"string","title":"Gid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Gw Guardrails Test Api Guardrail Profiles  Gid  Test Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/guardrails/topics/preview":{"post":{"summary":"Preview Topics","description":"Score one sentence against topics as they are being written — before\nthey are saved, so a definition can be tuned against the phrasings it\nmust catch and the tickets it must not.\n\nDraft topics are scored as they stand (an empty one is skipped), but the\nsize limits hold: they bound the embedding work one call can ask for.","operationId":"preview_topics_api_guardrails_topics_preview_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Preview Topics Api Guardrails Topics Preview Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/guardrails/detect/families":{"get":{"summary":"Guardrail Detect Families","description":"The families POST /guardrails/detect serves and the engines each can\nbe asked for without a policy — what the console's detect panel offers.","operationId":"guardrail_detect_families_api_guardrails_detect_families_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Guardrail Detect Families Api Guardrails Detect Families Get"}}}}}}},"/api/guardrails/detect":{"post":{"summary":"Detect Guardrail","description":"ADP's GuardrailDetectorService.Detect: one detector family over one\ntext, answered as {flagged, score in [0, 1], spans of half-open UTF-8\nbyte offsets, engine, error} — the raw signal, with no policy decision\ntaken (guardrails.detect).\n\ngovernance.read, as the dry run is: it reads what the rules would find.\nNaming a stored `policy` to take configuration from is Cedar `read` on\nthat guardrail as well (op \"get\"); one the caller may not read is the\n404 an unknown name gets, so a detect call cannot be used to find it.\nA detector that fails answers 200, flagged, with `error` set — the\ncontract's fail-closed answer, not an HTTP error; a call that cannot be\nasked as put (unknown family, engine or direction, a text past the\nlimit, a family with no configuration and no policy) is a 400.","operationId":"detect_guardrail_api_guardrails_detect_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Detect Guardrail Api Guardrails Detect Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/usage":{"get":{"summary":"Usage Summary","description":"Totals and the by_agent/provider/model/day maps for the last `days` or\na window. `agent_uid` narrows every figure to one agent incarnation\n(_agent_uid_filter); by_agent stays per agent id, so without it an id\nre-created is still one row. `filter` is an AIP-160 expression over each\nledger cell (spendfilter: labels such as provider_name or provider_type,\ncounters such as cost_usd), ANDed with the equalities and the caller's\n`read` — it only ever narrows.\n\nChargeback: `tenant`, `channel`, `principal`, `ticket_id` or `tool` (one\nat a time) narrows every figure to the spend made for that value, and\n`group_by` — one of the same — adds ``by_<dimension>`` (usage.summary).\nSpend by tenant is an instance-wide reader's (_tenant_split_gate).","operationId":"usage_summary_api_usage_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":7,"title":"Days"}},{"name":"agent","in":"query","required":false,"schema":{"type":"string","default":"","title":"Agent"}},{"name":"provider","in":"query","required":false,"schema":{"type":"string","default":"","title":"Provider"}},{"name":"model","in":"query","required":false,"schema":{"type":"string","default":"","title":"Model"}},{"name":"window","in":"query","required":false,"schema":{"type":"string","default":"","title":"Window"}},{"name":"start","in":"query","required":false,"schema":{"type":"string","default":"","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","default":"","title":"End"}},{"name":"agent_uid","in":"query","required":false,"schema":{"type":"string","default":"","title":"Agent Uid"}},{"name":"filter","in":"query","required":false,"schema":{"type":"string","default":"","title":"Filter"}},{"name":"group_by","in":"query","required":false,"schema":{"type":"string","default":"","title":"Group By"}},{"name":"tenant","in":"query","required":false,"schema":{"type":"string","default":"","title":"Tenant"}},{"name":"channel","in":"query","required":false,"schema":{"type":"string","default":"","title":"Channel"}},{"name":"principal","in":"query","required":false,"schema":{"type":"string","default":"","title":"Principal"}},{"name":"ticket_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Ticket Id"}},{"name":"tool","in":"query","required":false,"schema":{"type":"string","default":"","title":"Tool"}},{"name":"user_email","in":"query","required":false,"schema":{"type":"string","default":"","title":"User Email"}},{"name":"organization_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Usage Summary Api Usage Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/usage/headline":{"get":{"summary":"Usage Headline","description":"The home page's three numbers — active agents, requests, spend in\nmicrocents — in one call (ADP InsightsService.GetInsights), with ADP's\nsemantics rather than the network view's: see usage.headline. The window\nis the network view's (netobs.resolve_window: a preset, start/end, or a\npreset day count; default the last 7 days), and the filters are /usage's\nsingle-value equalities, ANDed — agent_uid among them, ADP's\nGetInsights filter.agent_uid: one agent incarnation, by the uid minted\nwhen it was created (_agent_uid_filter).\n\ngovernance.read, as every spend figure is, and summed through the same\nCedar `read` as /usage: an agent the caller may not read is not counted\nactive and its calls and spend are in neither total; naming one is\nrefused. /network's kpis stay as they were — its \"active\" also counts an\nagent whose only activity was tool calls, which is the graph's question,\nnot this one.\n\n`filter` is GetInsights' filter.filter: /usage's AIP-160 expression,\nper hourly cell, ANDed with the rest — so an agent is active only if a\ncell the filter kept holds a call. The chargeback filters (`tenant` or\n`organization_id`, `channel`, `principal`, `user_email`, `ticket_id`,\n`tool` — GetInsights' filter.user_email and filter.organization_id among\nthem) are /usage's, ANDed, and the filter echo carries them when sent.\n\n`start_time`/`end_time` are GetInsights' own pair (RFC 3339, both\nrequired, never mixed with another window form). Any window is served\nto the minute (usage._exact_parts) and up to usage.WINDOW_MAX_DAYS\nlong, and the echo says what was really read: ``effective_start`` and\n``effective_end``, ``precision`` (\"minute\", or \"hour\" when an edge hour\nis older than the minute grain and was read whole), and\n``approximate_days`` — legacy days the window cut, counted by share.","operationId":"usage_headline_api_usage_headline_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days"}},{"name":"window","in":"query","required":false,"schema":{"type":"string","default":"","title":"Window"}},{"name":"start","in":"query","required":false,"schema":{"type":"string","default":"","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","default":"","title":"End"}},{"name":"start_time","in":"query","required":false,"schema":{"type":"string","default":"","title":"Start Time"}},{"name":"end_time","in":"query","required":false,"schema":{"type":"string","default":"","title":"End Time"}},{"name":"agent","in":"query","required":false,"schema":{"type":"string","default":"","title":"Agent"}},{"name":"provider","in":"query","required":false,"schema":{"type":"string","default":"","title":"Provider"}},{"name":"model","in":"query","required":false,"schema":{"type":"string","default":"","title":"Model"}},{"name":"agent_uid","in":"query","required":false,"schema":{"type":"string","default":"","title":"Agent Uid"}},{"name":"filter","in":"query","required":false,"schema":{"type":"string","default":"","title":"Filter"}},{"name":"tenant","in":"query","required":false,"schema":{"type":"string","default":"","title":"Tenant"}},{"name":"channel","in":"query","required":false,"schema":{"type":"string","default":"","title":"Channel"}},{"name":"principal","in":"query","required":false,"schema":{"type":"string","default":"","title":"Principal"}},{"name":"ticket_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Ticket Id"}},{"name":"tool","in":"query","required":false,"schema":{"type":"string","default":"","title":"Tool"}},{"name":"user_email","in":"query","required":false,"schema":{"type":"string","default":"","title":"User Email"}},{"name":"organization_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Usage Headline Api Usage Headline Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/usage/timeseries":{"get":{"summary":"Usage Timeseries","description":"Spend as a gap-filled hour or day series over a window (default the\nlast 7 days, hourly up to 48 hours — see _series_span). Summed through\nthe same `read` filter as /usage, and the same `filter` expression and\nchargeback filter, so the points add up to its totals for the same\nwindow.","operationId":"usage_timeseries_api_usage_timeseries_get","parameters":[{"name":"window","in":"query","required":false,"schema":{"type":"string","default":"","title":"Window"}},{"name":"start","in":"query","required":false,"schema":{"type":"string","default":"","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","default":"","title":"End"}},{"name":"granularity","in":"query","required":false,"schema":{"type":"string","default":"","title":"Granularity"}},{"name":"agent","in":"query","required":false,"schema":{"type":"string","default":"","title":"Agent"}},{"name":"provider","in":"query","required":false,"schema":{"type":"string","default":"","title":"Provider"}},{"name":"model","in":"query","required":false,"schema":{"type":"string","default":"","title":"Model"}},{"name":"agent_uid","in":"query","required":false,"schema":{"type":"string","default":"","title":"Agent Uid"}},{"name":"filter","in":"query","required":false,"schema":{"type":"string","default":"","title":"Filter"}},{"name":"tenant","in":"query","required":false,"schema":{"type":"string","default":"","title":"Tenant"}},{"name":"channel","in":"query","required":false,"schema":{"type":"string","default":"","title":"Channel"}},{"name":"principal","in":"query","required":false,"schema":{"type":"string","default":"","title":"Principal"}},{"name":"ticket_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Ticket Id"}},{"name":"tool","in":"query","required":false,"schema":{"type":"string","default":"","title":"Tool"}},{"name":"user_email","in":"query","required":false,"schema":{"type":"string","default":"","title":"User Email"}},{"name":"organization_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Usage Timeseries Api Usage Timeseries Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/usage/timeseries/by-dimension":{"get":{"summary":"Usage Timeseries By Dimension","description":"One spend series per key of ONE dimension — agent, provider, model,\nprovider_type, tag (with tag_key), agent_uid (each agent incarnation,\nlabelled with the agent_name it spent under) or a chargeback dimension\n(tenant, channel, principal, ticket_id, tool; tenant for an\ninstance-wide reader only) — for the top page_size keys by cost\n(default 50, at most 200), and truncated_key_count for the keys that\nranked below (ADP GetSpendingTimeSeriesByDimension). The stacked view of\n/usage/timeseries: same window, granularity and filters, same points.\n\nSummed through the same `read` filter as /usage, so an agent the caller\nmay not read is in no key's series — not only absent from the agent\ndimension, but out of every provider's, model's and team's too — and\nnaming one is refused. No page token: a chart that wants the keys below\nthe top N narrows the filters instead.","operationId":"usage_timeseries_by_dimension_api_usage_timeseries_by_dimension_get","parameters":[{"name":"dimension","in":"query","required":false,"schema":{"type":"string","default":"","title":"Dimension"}},{"name":"tag_key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Tag Key"}},{"name":"window","in":"query","required":false,"schema":{"type":"string","default":"","title":"Window"}},{"name":"start","in":"query","required":false,"schema":{"type":"string","default":"","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","default":"","title":"End"}},{"name":"granularity","in":"query","required":false,"schema":{"type":"string","default":"","title":"Granularity"}},{"name":"agent","in":"query","required":false,"schema":{"type":"string","default":"","title":"Agent"}},{"name":"provider","in":"query","required":false,"schema":{"type":"string","default":"","title":"Provider"}},{"name":"model","in":"query","required":false,"schema":{"type":"string","default":"","title":"Model"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Page Size"}},{"name":"agent_uid","in":"query","required":false,"schema":{"type":"string","default":"","title":"Agent Uid"}},{"name":"filter","in":"query","required":false,"schema":{"type":"string","default":"","title":"Filter"}},{"name":"tenant","in":"query","required":false,"schema":{"type":"string","default":"","title":"Tenant"}},{"name":"channel","in":"query","required":false,"schema":{"type":"string","default":"","title":"Channel"}},{"name":"principal","in":"query","required":false,"schema":{"type":"string","default":"","title":"Principal"}},{"name":"ticket_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Ticket Id"}},{"name":"tool","in":"query","required":false,"schema":{"type":"string","default":"","title":"Tool"}},{"name":"user_email","in":"query","required":false,"schema":{"type":"string","default":"","title":"User Email"}},{"name":"organization_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Usage Timeseries By Dimension Api Usage Timeseries By Dimension Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/usage/tags":{"get":{"summary":"Usage By Tag","description":"Spend grouped by an agent tag key (``team``, ``env``, ``cost_centre``…),\nas the agents were tagged when they spent it. `keys` are the keys spend in\nTHIS window carries, so the picker offers what the window can be split by.\n`filter` is /usage's expression, narrowing the groups and the keys alike,\nand so is its chargeback filter (`tenant`, `channel`, `principal`,\n`ticket_id` or `tool`).\n\n`agent_uid` is declared only to be refused: by_tag cannot narrow to one\nincarnation, and FastAPI drops an undeclared parameter silently — a\ncaller asking its sibling routes' filter here would get every agent's\nspend, unfiltered, as that one's. /usage/breakdown?dimension=tag takes it.","operationId":"usage_by_tag_api_usage_tags_get","parameters":[{"name":"key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Key"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":7,"title":"Days"}},{"name":"window","in":"query","required":false,"schema":{"type":"string","default":"","title":"Window"}},{"name":"start","in":"query","required":false,"schema":{"type":"string","default":"","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","default":"","title":"End"}},{"name":"agent_uid","in":"query","required":false,"schema":{"type":"string","default":"","title":"Agent Uid"}},{"name":"filter","in":"query","required":false,"schema":{"type":"string","default":"","title":"Filter"}},{"name":"tenant","in":"query","required":false,"schema":{"type":"string","default":"","title":"Tenant"}},{"name":"channel","in":"query","required":false,"schema":{"type":"string","default":"","title":"Channel"}},{"name":"principal","in":"query","required":false,"schema":{"type":"string","default":"","title":"Principal"}},{"name":"ticket_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Ticket Id"}},{"name":"tool","in":"query","required":false,"schema":{"type":"string","default":"","title":"Tool"}},{"name":"user_email","in":"query","required":false,"schema":{"type":"string","default":"","title":"User Email"}},{"name":"organization_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Usage By Tag Api Usage Tags Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/usage/breakdown":{"get":{"summary":"Usage Breakdown","description":"Spend grouped by ONE dimension — agent, provider, model, provider_type,\ntag (with tag_key), agent_uid (ADP's BREAKDOWN_DIMENSION_AGENT_UID, each\nentry labelled with its agent_name) or a chargeback dimension: tenant\n(ADP's organization, `organization_id` too; a confined reader sees their\nown), channel, principal (ADP's BREAKDOWN_DIMENSION_USER, `user` too — a\nperson, or the client that authenticated, each entry carrying the\nuser_email its calls resolved to), user_email, ticket_id or tool —\nlargest first, a page at a time (ADP GetSpendingBreakdown). agent_uid is\nalso a filter, ADP's SpendingFilter.agent_uid (_agent_uid_filter), and\nso is every chargeback value, ANDed (SpendingFilter.user_email and\norganization_id among them). /usage keeps returning its by_* maps whole;\nthis is for the dimension a caller wants ranked and paged.\n\nSummed through the same `read` filter as /usage, so the entries across\nevery page add up to its totals for the same window and filters. A\npage_token is bound to the query it came from AND to the caller and the\nwindow as asked (\"24h\", not the instant it resolved to, which moves\nbetween pages), so one replayed under another query or by another\ncaller is a 400 rather than a page of something else.","operationId":"usage_breakdown_api_usage_breakdown_get","parameters":[{"name":"dimension","in":"query","required":false,"schema":{"type":"string","default":"","title":"Dimension"}},{"name":"tag_key","in":"query","required":false,"schema":{"type":"string","default":"","title":"Tag Key"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":7,"title":"Days"}},{"name":"agent","in":"query","required":false,"schema":{"type":"string","default":"","title":"Agent"}},{"name":"provider","in":"query","required":false,"schema":{"type":"string","default":"","title":"Provider"}},{"name":"model","in":"query","required":false,"schema":{"type":"string","default":"","title":"Model"}},{"name":"window","in":"query","required":false,"schema":{"type":"string","default":"","title":"Window"}},{"name":"start","in":"query","required":false,"schema":{"type":"string","default":"","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","default":"","title":"End"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Page Size"}},{"name":"page_token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Page Token"}},{"name":"agent_uid","in":"query","required":false,"schema":{"type":"string","default":"","title":"Agent Uid"}},{"name":"filter","in":"query","required":false,"schema":{"type":"string","default":"","title":"Filter"}},{"name":"tenant","in":"query","required":false,"schema":{"type":"string","default":"","title":"Tenant"}},{"name":"channel","in":"query","required":false,"schema":{"type":"string","default":"","title":"Channel"}},{"name":"principal","in":"query","required":false,"schema":{"type":"string","default":"","title":"Principal"}},{"name":"ticket_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Ticket Id"}},{"name":"tool","in":"query","required":false,"schema":{"type":"string","default":"","title":"Tool"}},{"name":"user_email","in":"query","required":false,"schema":{"type":"string","default":"","title":"User Email"}},{"name":"organization_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Usage Breakdown Api Usage Breakdown Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/usage/activity":{"get":{"summary":"Usage Activity","description":"Recent individual calls, rather than the daily rollups.\n\nThe ledger is bucketed by day on purpose — per-call rows would grow without\nbound — so \"what happened in the last hour\" cannot be answered from it.\nConversations carry that resolution already, and refusals come from the\naudit log, which is where a governance decision is recorded. Two sources,\none ordered feed.\n\n`filter` is /usage's expression, answered per row on the fields a row\nhas — agent_name (agent) and agent_uid. Any other field is a 400 rather\nthan ignored: an unfiltered feed under a filter the caller believes\napplied would be the answer that looks right and is not.\n\nEach row carries `cost_usd`: a call's what its conversation cost, a\nrefusal's 0.","operationId":"usage_activity_api_usage_activity_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"agent","in":"query","required":false,"schema":{"type":"string","default":"","title":"Agent"}},{"name":"filter","in":"query","required":false,"schema":{"type":"string","default":"","title":"Filter"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Usage Activity Api Usage Activity Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/usage/compare":{"get":{"summary":"Usage Compare","description":"This window against the one immediately before it, same length.\n\nA total on its own answers \"what did it cost\"; the only question an\noperator actually acts on is \"is that more than it was\". Deltas are\nreturned rather than computed on screen so the CSV export and the chart\nagree on the arithmetic. `agent_uid` narrows both windows to one agent\nincarnation, as it narrows /usage (_agent_uid_filter), and both are\nnarrowed by the same `filter` and chargeback filter (`tenant`,\n`channel`, `principal`, `ticket_id` or `tool`). With `group_by` — one of\nthose dimensions — ``groups`` holds each value's own spend and calls\ndelta, so \"spend is up\" can be followed to the tenant or client it is up\nfor.","operationId":"usage_compare_api_usage_compare_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":7,"title":"Days"}},{"name":"agent","in":"query","required":false,"schema":{"type":"string","default":"","title":"Agent"}},{"name":"provider","in":"query","required":false,"schema":{"type":"string","default":"","title":"Provider"}},{"name":"model","in":"query","required":false,"schema":{"type":"string","default":"","title":"Model"}},{"name":"window","in":"query","required":false,"schema":{"type":"string","default":"","title":"Window"}},{"name":"start","in":"query","required":false,"schema":{"type":"string","default":"","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","default":"","title":"End"}},{"name":"agent_uid","in":"query","required":false,"schema":{"type":"string","default":"","title":"Agent Uid"}},{"name":"filter","in":"query","required":false,"schema":{"type":"string","default":"","title":"Filter"}},{"name":"group_by","in":"query","required":false,"schema":{"type":"string","default":"","title":"Group By"}},{"name":"tenant","in":"query","required":false,"schema":{"type":"string","default":"","title":"Tenant"}},{"name":"channel","in":"query","required":false,"schema":{"type":"string","default":"","title":"Channel"}},{"name":"principal","in":"query","required":false,"schema":{"type":"string","default":"","title":"Principal"}},{"name":"ticket_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Ticket Id"}},{"name":"tool","in":"query","required":false,"schema":{"type":"string","default":"","title":"Tool"}},{"name":"user_email","in":"query","required":false,"schema":{"type":"string","default":"","title":"User Email"}},{"name":"organization_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Usage Compare Api Usage Compare Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/usage/rates":{"get":{"summary":"Usage Rates","description":"The rate card. It takes /usage's `filter` only to refuse it: rates\nare prices, not spend, so no ledger field applies — and a filter\ndropped without a word would hand the whole card to a caller who asked\nfor a slice. Every field is refused at its position, with the tenant\nand syntax refusals the ledger reads give.","operationId":"usage_rates_api_usage_rates_get","parameters":[{"name":"filter","in":"query","required":false,"schema":{"type":"string","default":"","title":"Filter"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Usage Rates Api Usage Rates Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/usage/rates/{model}":{"put":{"summary":"Put Usage Rate","description":"`?provider=` scopes the rate to one provider; omit it for the default\nthat applies wherever no scoped rate exists.","operationId":"put_usage_rate_api_usage_rates__model__put","parameters":[{"name":"model","in":"path","required":true,"schema":{"type":"string","title":"Model"}},{"name":"provider","in":"query","required":false,"schema":{"type":"string","default":"","title":"Provider"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Usage Rate Api Usage Rates  Model  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Usage Rate","description":"Stop a rate pricing calls from now on; its history is kept, so what\nit priced stays explainable (GET /usage/rates/history).","operationId":"delete_usage_rate_api_usage_rates__model__delete","parameters":[{"name":"model","in":"path","required":true,"schema":{"type":"string","title":"Model"}},{"name":"provider","in":"query","required":false,"schema":{"type":"string","default":"","title":"Provider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Usage Rate Api Usage Rates  Model  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/usage/rates/resolve":{"get":{"summary":"Resolve Usage Rate","description":"Which line of the card prices each `model` (repeatable) via\n`provider` — an exact rate, a pattern, the catalogue's list price, or\nnothing — and at what, as of `at` (default now).","operationId":"resolve_usage_rate_api_usage_rates_resolve_get","parameters":[{"name":"model","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"default":[],"title":"Model"}},{"name":"provider","in":"query","required":false,"schema":{"type":"string","default":"","title":"Provider"}},{"name":"at","in":"query","required":false,"schema":{"type":"string","default":"","title":"At"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Resolve Usage Rate Api Usage Rates Resolve Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/usage/rates/history":{"get":{"summary":"Usage Rate History","description":"Every version of every rate (or of one), oldest first: what each\npriced, from when, and who saved it. A version with a null rate is a\ndelete.","operationId":"usage_rate_history_api_usage_rates_history_get","parameters":[{"name":"model","in":"query","required":false,"schema":{"type":"string","default":"","title":"Model"}},{"name":"provider","in":"query","required":false,"schema":{"type":"string","default":"","title":"Provider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Usage Rate History Api Usage Rates History Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/usage/rates/reprice":{"get":{"summary":"Usage Reprice","description":"What [start, end) would cost at the card, beside what was recorded.\nRead-only: recorded spend is never re-priced (usage.reprice). It reads\nevery tenant's ledger, so on a tenanted instance only an owner may ask.","operationId":"usage_reprice_api_usage_rates_reprice_get","parameters":[{"name":"start","in":"query","required":true,"schema":{"type":"string","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","default":"","title":"End"}},{"name":"basis","in":"query","required":false,"schema":{"type":"string","default":"effective","title":"Basis"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Usage Reprice Api Usage Rates Reprice Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/usage/tool-rates":{"get":{"summary":"Usage Tool Rates","description":"Per-call prices for MCP tools (\"mcp:<server>/<tool>\") and retrieval\n(\"retrieval:<collection>\"), globs allowed.","operationId":"usage_tool_rates_api_usage_tool_rates_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Usage Tool Rates Api Usage Tool Rates Get"}}}}}}},"/api/usage/tool-rates/{kind}/{name}":{"put":{"summary":"Put Usage Tool Rate","operationId":"put_usage_tool_rate_api_usage_tool_rates__kind___name__put","parameters":[{"name":"kind","in":"path","required":true,"schema":{"type":"string","title":"Kind"}},{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolRateBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Usage Tool Rate Api Usage Tool Rates  Kind   Name  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Usage Tool Rate","operationId":"delete_usage_tool_rate_api_usage_tool_rates__kind___name__delete","parameters":[{"name":"kind","in":"path","required":true,"schema":{"type":"string","title":"Kind"}},{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Usage Tool Rate Api Usage Tool Rates  Kind   Name  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/budgets":{"get":{"summary":"Budgets List","description":"Every budget the caller may see, as the map the console reads:\n{budgets: {default, overrides}, state per agent, default_state}.\n\n`view=resources` is ADP's ListBudgets instead (usage.query_budgets): the\nstored budgets as rows — name, uid, agent, the entry's fields and stamps,\nand each row's computed state — narrowed by name_contains and repeatable\ntag=k=v, newest first, paged by page_size (50, at most 200) and signed\ntokens bound to the filters and the caller. Opt-in, so the map every\nclient already reads is untouched: the whole set is one small document,\nand a page of it is a different answer that no existing caller asked for.\n\nThose parameters without the view are refused rather than ignored: the\nmap cannot filter or page, and a caller told nothing would take the\nwhole map for the budgets named `name_contains`.\n\n`view=schema` is the budget resource's declarations instead\n(usage.budget_schema) — ADP's storage and schema-generation options,\nanswered for an operator rather than a code generator: the record as a\nJSON Schema, where budgets are stored and what keeps each unique, whose\npartition the caller's are, the events they raise with an OCSF type each,\nand the Cedar entities a policy names them by. Opt-in like the rows, and\nno budget is read for it: it says what a budget is, not which there are,\nso it is neither filtered nor paged, and not a spending read to audit.\n\nOn an instance with tenants the map is one partition's — the caller's\nselected tenant's, or the instance's for an owner (_budget_tenant) — and\nsays whose in `tenant`; each resource row of a tenant's budget names it.\nThe agents' state rows are every readable agent's either way, but show\na tenant's caller an instance budget only as the meter reads it\n(_agent_budget_state). An owner's map also carries every tenant's\nbudgets, read only, in `tenants` (_owner_tenant_budgets).","operationId":"budgets_list_api_budgets_get","parameters":[{"name":"view","in":"query","required":false,"schema":{"type":"string","default":"","title":"View"}},{"name":"name_contains","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name Contains"}},{"name":"tag","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Tag"}},{"name":"page_size","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Page Size"}},{"name":"page_token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Budgets List Api Budgets Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Put Budget","description":"Set the default (no `agent`), or one agent's budget, whole.\n\nAn agent's budget passes the Cedar `read` gate its GET, PATCH and DELETE\ndo before anything else — this answers with the stored budget's name,\ntags, recipients and stamps, which `read` hides — and a refusal is the\nvery 400 an agent that does not exist gets. Not their 404: a body naming\nan unknown agent has always been a 400 here, so a 404 would itself say\nthe agent exists; and not `configure`'s 403 alone, whose reason differs\nbetween a capped agent (refused on the budget as stored) and an uncapped\none (\"as this change would leave it\"). Whether the agent exists is\nsettled first, for the same reason: validated after the limit, as\nsave_budget does, a bad limit would draw its own 400 for a missing agent\nand \"unknown agent\" for a hidden one.\n\nWritten to the caller's partition (_budget_tenant). An override in a\ntenant's budgets must name an agent bound to that tenant: another\ntenant's agent is the same \"unknown agent\" a hidden one gets (the tenant\nboundary hides it from `read`), and a shared agent is refused by\nsave_budget with why — its cap is the instance's.","operationId":"put_budget_api_budgets_put","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BudgetBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Budget Api Budgets Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Create Budget","description":"Create one budget (ADP's CreateBudget) — the default, or one agent's\n(filter_agent_name / filter_agent_uid) — named `name`, or given a name\nwhen it has none: the agent's key where that is a valid name, which is\nwhat reads showed before names existed. 201 with the budget; 409 when the\nname is taken in the caller's partition or the default / the agent has a\nbudget already (a PUT replaces; a create never does); 400 for a name off\nthe grammar (lowercase letters, digits, hyphens, from a letter, at most\n63), \"default\" on an agent's budget, a name that is another agent's key,\nor a field only the server sets.\n\nEverything else is PUT's: the same Cedar `read` gate on the agent, with\nits 400 for one hidden or unknown, `configure` on the budget as created,\nthe caller's partition (_budget_tenant, a `tenant` field refused), and a\nbudget.save row — with no before-image, so its OCSF type is a create.","operationId":"create_budget_api_budgets_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BudgetCreateBody"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Budget Api Budgets Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Budget Endpoint","description":"Remove the default, or one agent's budget (`agent`) — or the budget\n`name` addresses, as GET /budgets/{name} reads it (ADP's DeleteBudget).\nBoth sent must address the same budget.\n\nAn agent's budget first passes the Cedar `read` gate its GET and PATCH\ndo, with their 404: gated on `configure` alone, a caller refused that\nwould get a 403 where a budget exists and a 404 where none does — telling\nthem which agents are capped, which `read` hides. Then `configure`, on\nthe budget being removed (_budget_gate). From the caller's partition\n(_budget_tenant) only.","operationId":"delete_budget_endpoint_api_budgets_delete","parameters":[{"name":"agent","in":"query","required":false,"schema":{"type":"string","default":"","title":"Agent"}},{"name":"name","in":"query","required":false,"schema":{"type":"string","default":"","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Budget Endpoint Api Budgets Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/usage/forecast":{"get":{"summary":"Usage Forecast","description":"Each agent the caller may read, projected to the reset of the cap\nthat binds it tightest (usage.forecast): period-end spend, when it runs\nout (exhausts_on), and the capped ones at risk ranked soonest first —\nplus the month's projected spend over those agents. The same roster as\nGET /budgets, so a forecast never names an agent the budgets page hides.","operationId":"usage_forecast_api_usage_forecast_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Usage Forecast Api Usage Forecast Get"}}}}}}},"/api/usage/forecast/settings":{"get":{"summary":"Usage Forecast Settings","description":"Whether a projected overrun is announced before the warning threshold\n(forecast_warn), and which spend report is sent (report).","operationId":"usage_forecast_settings_api_usage_forecast_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Usage Forecast Settings Api Usage Forecast Settings Get"}}}}}},"put":{"summary":"Put Usage Forecast Settings","description":"Change forecast_warn (true/false) and/or report (off, day, week,\nmonth). Anything else is refused, never dropped.","operationId":"put_usage_forecast_settings_api_usage_forecast_settings_put","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Put Usage Forecast Settings Api Usage Forecast Settings Put"}}}}}}},"/api/usage/spend-report":{"get":{"summary":"Usage Spend Report","description":"The spend report the scheduler sends (usage.spend_report) for the last\nclosed day, week or month, answered now — what the digest will say,\nwhether or not reports are switched on.","operationId":"usage_spend_report_api_usage_spend_report_get","parameters":[{"name":"period","in":"query","required":false,"schema":{"type":"string","default":"week","title":"Period"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Usage Spend Report Api Usage Spend Report Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/budgets/{name}":{"get":{"summary":"Budget Get","description":"One budget by name — \"default\" or an agent key — with its computed\nstate: the same entry and the same state row GET /budgets carries for it,\nwithout listing every budget to pick one out.\n\nA name addresses a STORED budget. An agent with no override of its own is\n404 even though the default caps it: answering with the default's entry\nunder the agent's name would read as the agent having a budget, and a\ndelete of that name would then 404 on the very thing the read returned.\nThe detail says the default governs it, so the caller knows where to look.\n\n`default` is the default, never an agent of that name — the same\nreading PUT and DELETE give an empty agent. Both are the caller's\npartition's (_budget_tenant): their tenant's, or the instance's.\n\nAny other name is the stored budget of that name — the one its creator\nchose (POST) — and, when no budget has it, an agent key, as it always\nwas: a budget created without a name is named by its agent's key.","operationId":"budget_get_api_budgets__name__get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Budget Get Api Budgets  Name  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Patch Budget","description":"Change some fields of one budget, \"default\" or an agent key, and keep\nthe rest (ADP's UpdateBudget; usage.update_budget decides what is written).\n\nUnlike PUT, a field left out keeps its stored value, so a pipeline that\nsends only the limit cannot reset the period or switch the warning off —\nand two operators changing different fields do not undo each other. An\n`update_mask` (in the body or as a query parameter, not both; a list or\none comma-separated string) names exactly the fields to write, and a\nnamed field the body leaves out is cleared. name, agent, effective_from\nand the stamps cannot change, and an unknown field is a 400 rather than\nignored. 404 when no budget of that name is stored: PATCH never creates.\n\nAn agent's budget passes the same Cedar `read` gate its GET does, with\nthe same 404 for a refusal — this answers with the budget, and a 403\nwould confirm the agent is capped — and then `configure`, on the budget\nas stored and as merged (_budget_gate), a 403 with the policy's reason:\nthe caller may already see it. Audited as budget.save with the\nbudget before and after and the fields written, as a PUT is.\n\nThe budget is the caller's partition's (_budget_tenant); a `tenant` in\nthe body is refused, not read as a field to write.","operationId":"patch_budget_api_budgets__name__patch","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"update_mask","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Update Mask"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BudgetPatchBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Patch Budget Api Budgets  Name  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/rate-limits":{"get":{"summary":"Get Rate Limits","description":"The rate-limit rules (ratelimit.py), with their ETag for the next PUT.\n\nOne list for the whole instance, naming every tenant's agents, clients\nand people, with the refusals each rule has made: not for an account\nconfined to one tenant (_instance_wide), as the analytics cube is not.","operationId":"get_rate_limits_api_rate_limits_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Rate Limits Api Rate Limits Get"}}}}}},"put":{"summary":"Put Rate Limits","description":"Replace the rate-limit rules, whole.\n\nA save that LOOSENS a rule — removes or disables it, raises or drops a\nlimit, moves it to another scope, match or pool, or overrides it with a\nnew, more specific rule that allows more — switches off part of an\nactive control, so it takes governance.weaken and a reason, as a\nguardrail's demotion does (ratelimit.weakened decides, from the stored\nrules and the proposed ones). Tightening needs neither. If-Match, when\nsent, must be the ETag of the rules as they stand: a form opened before\na colleague's change cannot put it back.\n\nThe rules hold every tenant — {agent \"*\" rpm 0} halts every tenant's\nagents — so on a multi-tenant instance a save needs ``*`` (or an owner),\nas instance retention does: an account confined to one tenant with\ngovernance.write may not set another tenant's pace.","operationId":"put_rate_limits_api_rate_limits_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitsBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Put Rate Limits Api Rate Limits Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/risky-users":{"get":{"summary":"Get Risky Users","description":"Every person with a risk row, re-scored as their windows stand now,\nthe ones to look at first: at risk, then confirmed, then by score.\n`status` and `level` filter (one value each). Scores, counts and the\nhold in force — never what anyone typed; the evidence windows are on\none person's page.","operationId":"get_risky_users_api_security_risky_users_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"","title":"Status"}},{"name":"level","in":"query","required":false,"schema":{"type":"string","default":"","title":"Level"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Risky Users Api Security Risky Users Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/risky-users/{pid}":{"get":{"summary":"Get Risky User","description":"One person's risk: the list's row plus the windows that crossed a\nbar, each with the correlation ids of the refused calls — the audit\nlog's filter for them, which is where their detail is.","operationId":"get_risky_user_api_security_risky_users__pid__get","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Risky User Api Security Risky Users  Pid  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/risky-users/{pid}/confirm":{"post":{"summary":"Confirm Risky User","description":"Confirm the person is a risk: status confirmed, and a hold on their\ngoverned calls — for `hold_minutes`, or the policy's cooldown in enforce\nmode. Tightening: no weakening gate.","operationId":"confirm_risky_user_api_security_risky_users__pid__confirm_post","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonReviewBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Confirm Risky User Api Security Risky Users  Pid  Confirm Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/risky-users/{pid}/dismiss":{"post":{"summary":"Dismiss Risky User","description":"Dismiss the person's risk: status dismissed, any hold lifted, and the\nevidence counted so far set aside. Lifts a control, so it takes\ngovernance.weaken and a reason, on the record.","operationId":"dismiss_risky_user_api_security_risky_users__pid__dismiss_post","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonReviewBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Dismiss Risky User Api Security Risky Users  Pid  Dismiss Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/person-risk":{"get":{"summary":"Get Person Risk Policy","description":"The person-risk policy: mode, the burst and drift bars, the hold's\ncooldown and whether names are pseudonymized.","operationId":"get_person_risk_policy_api_security_person_risk_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Person Risk Policy Api Security Person Risk Get"}}}}}},"put":{"summary":"Put Person Risk Policy","description":"Change the person-risk policy. Making it less watchful — a lower\nmode, a higher bar, a shorter hold, names shown again — takes\ngovernance.weaken and a reason (ksdetect.person_policy_loosened).","operationId":"put_person_risk_policy_api_security_person_risk_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonRiskPolicyBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Put Person Risk Policy Api Security Person Risk Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/egress":{"get":{"summary":"Get Egress Policy","description":"The egress policy: mode (off, audit, enforce), the default, the\nordered organisation rules and each agent's and MCP server's, and the\nproxy. First match wins, most specific scope first (egress.py).","operationId":"get_egress_policy_api_security_egress_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Egress Policy Api Security Egress Get"}}}}}},"put":{"summary":"Put Egress Policy","description":"Change the egress policy. A change that lets through anything the\npolicy held — a lower mode, a default turned to allow, an allow rule\nadded or moved, a deny removed, the proxy changed — takes\ngovernance.weaken and a reason (egress.loosened).","operationId":"put_egress_policy_api_security_egress_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EgressPolicyBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Put Egress Policy Api Security Egress Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/egress/test":{"post":{"summary":"Try Egress Policy","description":"What the policy — the stored one, or a draft `policy` merged over it —\ndecides for a request to `url` from `agent` through `server`: the\nverdict, the scope and rule that decided, the headers a rule adds and\nwhere a redirect sends it. Nothing is sent, resolved or audited; an\naddress-block rule is judged against `addresses` (else the URL's own\nliteral IP).","operationId":"try_egress_policy_api_security_egress_test_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EgressTestBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Try Egress Policy Api Security Egress Test Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/budgets/scoped/{name}":{"get":{"summary":"Scoped Budget Get","description":"One scoped budget of the caller's partition (_budget_tenant), with its\nspend, what calls in flight hold against it, and its status. GET\n/api/budgets lists them all under `scoped`.","operationId":"scoped_budget_get_api_budgets_scoped__name__get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Scoped Budget Get Api Budgets Scoped  Name  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Put Scoped Budget","description":"Create or replace a scoped budget: one cap over the summed spend of\neverything its scope matches — the instance, a tenant, a tag, a model, a\nprovider or a person — per period, in USD and/or tokens, refusing at the\nlimit or (action \"fallback\") sending calls to a cheaper model. It only\never tightens: every budget that applies to a call is enforced on its\nown (usage \"scoped budgets\").\n\nWritten to the caller's partition (_budget_tenant): a tenant's scoped\nbudgets cap only its own agents, and a tenant scope there can only name\nthat tenant. Gated by Cedar `configure` on Budget::\"default\"\n(_scoped_budget_gate), audited as budget.scoped.save with the budget\nbefore and after.","operationId":"put_scoped_budget_api_budgets_scoped__name__put","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScopedBudgetBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Scoped Budget Api Budgets Scoped  Name  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Scoped Budget Endpoint","description":"Remove a scoped budget from the caller's partition. Gated by Cedar\n`configure` on the budget being removed (_scoped_budget_gate), audited\nas budget.scoped.delete with what the cap was.","operationId":"delete_scoped_budget_endpoint_api_budgets_scoped__name__delete","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Scoped Budget Endpoint Api Budgets Scoped  Name  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mcp/servers/{name}/data-policies":{"get":{"summary":"Get Data Policies","description":"The server's policies, plus each tool's schema and the argument names\nthat look personal or secret, for the editor. Cedar `read` on the\nserver; audited as mcp.datapolicy.read.","operationId":"get_data_policies_api_mcp_servers__name__data_policies_get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Data Policies Api Mcp Servers  Name  Data Policies Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Put Data Policies","operationId":"put_data_policies_api_mcp_servers__name__data_policies_put","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataPoliciesBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Data Policies Api Mcp Servers  Name  Data Policies Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mcp/servers/{name}/data-policies/{policy_name}/shadow-hits":{"get":{"summary":"Data Policy Shadow Hits","description":"What a log-only data policy would have refused: the running total\nand the newest samples. governance.read and Cedar `read` on the server,\nas the policies themselves.","operationId":"data_policy_shadow_hits_api_mcp_servers__name__data_policies__policy_name__shadow_hits_get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"policy_name","in":"path","required":true,"schema":{"type":"string","title":"Policy Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Data Policy Shadow Hits Api Mcp Servers  Name  Data Policies  Policy Name  Shadow Hits Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mcp/servers/{name}/data-policies/{policy_name}/promote":{"post":{"summary":"Promote Data Policy","description":"Switch one log-only data policy to enforce, gated on what it would\nhave refused as the Cedar promotion is (_promotion_gate). Cedar\n`configure` on the server, the gitops guard and the registry lock, as a\nsave of the policies; promotion only ever adds protection, so it needs\nno weakening reason. Audited as mcp.datapolicy.promote.","operationId":"promote_data_policy_api_mcp_servers__name__data_policies__policy_name__promote_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"policy_name","in":"path","required":true,"schema":{"type":"string","title":"Policy Name"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/PromoteBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Promote Data Policy Api Mcp Servers  Name  Data Policies  Policy Name  Promote Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mcp/servers/{name}/data-policies/preview":{"post":{"summary":"Preview Data Policies","description":"What the gateway would do to one call of one tool — without calling it.\n\nRuns the SAME functions enforcement runs, over the caller's sample\narguments and sample response, and returns the shaped result with a trace\nof which rule did what. A preview computed by different code from the\nenforcement path would show an operator a policy nobody runs.\n\nAnd explains the composition (datapolicy.explain): per field the rule\nthat decides it and every rule that touched it, each argument's clamps\nas the one clamp they compose to, the row filters, what each allow-list\nremoves, and the path universe all of it was worked out over. Its\n`diagnostics` are datapolicy.diagnose()'s: each finding with a code\n(unenforceable, contradictory_clamps, shadowed_rule, ...), severity,\nmessage, paths and policy.\n\nAnd the `gate`: whether the call would run at all for `principal` (the\ncaller, when none is named) — ALLOW or DENY with the deny_reason, as the\nenforcement points it would meet decide it (_preview_gate).\n\nCedar `read` on the server: a preview shows its stored policies at work.\nAudited as mcp.datapolicy.preview, with the tool and caller previewed as\n— never the sample, the arguments or what they were shaped into.","operationId":"preview_data_policies_api_mcp_servers__name__data_policies_preview_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataPolicyPreviewBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Preview Data Policies Api Mcp Servers  Name  Data Policies Preview Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mcp/servers":{"get":{"summary":"Mcp Servers","description":"Every registered server keyed by name, masked, with its pin state and\nlast discovery, and the catalogue's templates.\n\nGiven any query parameter it is ADP's ListMCPServers: narrowed by\nname_contains (a substring of the name) and an AIP-160 filter, ordered\nby order_by (name, created_at, updated_at, each optionally desc; by name\nwhen not given), one page of page_size (1-200, 50 when not given) at a\ntime with signed keyset tokens bound to the query. `servers` and `pins`\nthen hold that page only, `names` its servers in order — the map's key\norder says the same to a client that keeps it, but JSON does not promise\none, and a browser moves a digit-only legacy name to the front — and\nnext_page_token and total_size are added. Filtered in Python over the\nregistry document (mcp_client.query_servers says why). With no query\nparameter the response is exactly what it was before these existed, so\nthe console and older clients read what they always read.\n\nBoth leave out a server a Cedar policy forbids the caller to `list` —\nor to `read`, which it refines — (_readable_servers), before the filter and the page, so a page is never\nshort and the total never counts a server the caller cannot open.\nAudited as mcp.server.list, naming the servers it returned.","operationId":"mcp_servers_api_mcp_servers_get","parameters":[{"name":"name_contains","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name Contains"}},{"name":"filter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filter"}},{"name":"order_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order By"}},{"name":"page_size","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Page Size"}},{"name":"page_token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Servers Api Mcp Servers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Create Mcp Server","description":"Create only (ADP's CreateMCPServer): a name already registered is a 409,\nnever a silent overwrite. PUT replaces whatever holds the name, so an\n\"add\" that collided with an existing server rewrote it — its credential,\ncommand and posture — under an audit row that read as a save.","operationId":"create_mcp_server_api_mcp_servers_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MCPServerCreateBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Mcp Server Api Mcp Servers Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mcp/managed-types":{"get":{"summary":"Mcp Managed Types","description":"The catalogue an operator adds servers from (ADP's ListManagedMCPTypes):\neach type's display name, description, categories (the first is where it\nis listed), icon_id, search tags and docs_url — server-owned, so the\nconsole and any other client render the same cards (mcp_catalogue says\nwhy). Narrowed by name_contains (a case-insensitive substring of the\nname, display name, description or tags) and category, repeatable or\ncomma-separated, any-of. `categories` is the chip row with each chip's\ncount under name_contains alone.\n\nAn unknown category matches nothing rather than failing: a client built\nagainst a newer catalogue asks a fair question. A malformed one, or a\nfilter past its bounds, is a 400.\n\ngovernance.read, like the server list beside it: the catalogue is the\nsame for every tenant, but only people who may see which servers are\nregistered are shown what could be. The setup forms still read templates\nfrom /api/mcp/servers, which is unchanged.","operationId":"mcp_managed_types_api_mcp_managed_types_get","parameters":[{"name":"name_contains","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name Contains"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Category"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Managed Types Api Mcp Managed Types Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mcp/servers/{name}":{"get":{"summary":"Mcp Server Get","description":"One server (ADP's GetMCPServer): the record as the list shows it —\nenv masked, stamps kept — with its data policies, and the tools its last\nlisting returned and when (`tools`, `tools_refreshed_at`), both left out\nfor a server not listed since it was registered — and gateway_url and\ncode_mode_url, the absolute addresses an MCP client connects to for it\nthrough the gateway, \"\" when it is not served there (_mcp_gateway_urls).\n\nStored rows only: nothing is dialled, no credential bound, so this is as\nsafe to call for a paused or unreachable server as for any other. A\nlive listing is GET .../tools. Declared before the /{name}/... routes only\nfor readability: those have one more segment, so no request matches both.\n\nCedar `get` on the server (refining `read`), gated before the name is\nlooked up; audited as mcp.server.get.","operationId":"mcp_server_get_api_mcp_servers__name__get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Server Get Api Mcp Servers  Name  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Put Mcp Server","description":"Create-or-replace: the whole record, as the form has it. PATCH is the\npartial update and POST the create that refuses a taken name. Which of\nthe two this PUT is decides its permission (_mcp_write_permission) and\nits Cedar verb (_save_mcp_server).","operationId":"put_mcp_server_api_mcp_servers__name__put","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MCPServerBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Mcp Server Api Mcp Servers  Name  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Patch Mcp Server","description":"Field-mask update (ADP's UpdateMCPServer). Only the masked fields come\nfrom the request; every other field is the stored record's own, so a\ndescription edit cannot reset an env the form never saw (the console\nshows env values as ***) or drop an allow-list. A masked field the body\nleaves out goes back to its default — that is how a mask clears one.\nFor a remote server's auth and identity_forwarding that default is said\noutright (no credential, no forwarding), because a save that leaves\neither out KEEPS the stored one (mcp_client._merged, for a PUT that\nre-sends a server to change its URL): a mask naming one exists to change\nit, and must not quietly keep the credential it was sent to clear.\nThe merged record is validated whole, and judged for weakening exactly\nas a PUT of it would be.","operationId":"patch_mcp_server_api_mcp_servers__name__patch","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MCPServerPatchBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Patch Mcp Server Api Mcp Servers  Name  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Mcp Server","description":"Deleting a server that is read-only, or shapes its data, weakens: the\nname is how agents reach it, so a delete and a re-add under that name\nhands them the same tools without the posture or the policies — both\nMCP gates, bypassed in two calls. A server with neither goes freely.","operationId":"delete_mcp_server_api_mcp_servers__name__delete","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ReasonBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Mcp Server Api Mcp Servers  Name  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mcp/servers/{name}/pause":{"post":{"summary":"Pause Mcp Server","description":"Stop every agent reaching this server: its tools leave every listing,\nit is not dialled, and each call is refused with the reason. Its\nconfiguration, credentials and data policies are kept.","operationId":"pause_mcp_server_api_mcp_servers__name__pause_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/MCPPauseBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Pause Mcp Server Api Mcp Servers  Name  Pause Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mcp/servers/{name}/resume":{"post":{"summary":"Resume Mcp Server","description":"Lift a server's pause. Tools paused one by one stay paused.","operationId":"resume_mcp_server_api_mcp_servers__name__resume_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Resume Mcp Server Api Mcp Servers  Name  Resume Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mcp/servers/{name}/tools/{tool}/pause":{"post":{"summary":"Pause Mcp Tool","description":"Stop agents reaching one tool — the misbehaving one — while the rest\nof the server stays in service.","operationId":"pause_mcp_tool_api_mcp_servers__name__tools__tool__pause_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"tool","in":"path","required":true,"schema":{"type":"string","title":"Tool"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/MCPPauseBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Pause Mcp Tool Api Mcp Servers  Name  Tools  Tool  Pause Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mcp/servers/{name}/tools/{tool}/resume":{"post":{"summary":"Resume Mcp Tool","operationId":"resume_mcp_tool_api_mcp_servers__name__tools__tool__resume_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"tool","in":"path","required":true,"schema":{"type":"string","title":"Tool"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Resume Mcp Tool Api Mcp Servers  Name  Tools  Tool  Resume Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mcp/servers/{name}/tools":{"get":{"summary":"Mcp Server Tools","description":"The server's tools, listed live (ADP's ListTools). Cedar `tools_list`\non the server (refining `read`: a forbid on it keeps the live listing\nfrom someone who may still open the record), gated before the name is\nlooked up; audited as mcp.tools.list with the tool names it returned.","operationId":"mcp_server_tools_api_mcp_servers__name__tools_get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Server Tools Api Mcp Servers  Name  Tools Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mcp/servers/{name}/resources":{"get":{"summary":"Mcp Server Resources","operationId":"mcp_server_resources_api_mcp_servers__name__resources_get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Cursor"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Server Resources Api Mcp Servers  Name  Resources Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mcp/servers/{name}/resources/read":{"post":{"summary":"Mcp Server Resource Read","operationId":"mcp_server_resource_read_api_mcp_servers__name__resources_read_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpResourceReadBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Server Resource Read Api Mcp Servers  Name  Resources Read Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mcp/servers/{name}/tools/pin":{"post":{"summary":"Pin Mcp Tools","description":"Re-pin quarantined tools, or approve ones pinned on first use.\n\ngovernance.write, like saving the server: approving what a tool tells\nevery agent is the same decision as registering the server that serves\nit, and is audited as one. No listing happens here — what is pinned is\nwhat the last listing recorded and the operator was shown.","operationId":"pin_mcp_tools_api_mcp_servers__name__tools_pin_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolPinBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Pin Mcp Tools Api Mcp Servers  Name  Tools Pin Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mcp/servers/{name}/openapi/spec":{"get":{"summary":"Openapi Spec Status","description":"An OpenAPI server's spec pin: unpinned, pinned or drifted, the live\nand pinned digests, and the operation-level diff an operator reviews\nbefore re-pinning. Fetches the live spec; never refused for drift —\nshowing the drift is what this is for. `content=true` adds the inline\nspec and the pinned operations themselves, which the server listing\n(mcp_client.masked) shows only as a digest and a count.","operationId":"openapi_spec_status_api_mcp_servers__name__openapi_spec_get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"content","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Content"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Openapi Spec Status Api Mcp Servers  Name  Openapi Spec Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mcp/servers/{name}/openapi/pin":{"post":{"summary":"Pin Openapi Spec","description":"Pin (or re-pin, after a drift) an OpenAPI server's spec — the\napproval its operations are then held to. governance.write and Cedar\n`configure`, as re-pinning a remote server's tools; audited as\nmcp.openapi.pin with the digests before and after.","operationId":"pin_openapi_spec_api_mcp_servers__name__openapi_pin_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpecPinBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Pin Openapi Spec Api Mcp Servers  Name  Openapi Pin Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mcp/servers/{name}/call":{"post":{"summary":"Mcp Server Call","operationId":"mcp_server_call_api_mcp_servers__name__call_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MCPCallBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Server Call Api Mcp Servers  Name  Call Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/metrics/agents":{"get":{"summary":"Agent Metrics","description":"Per-agent performance from the recent pipeline runs: how often each agent\nran, its latency (avg/p95), and the distribution of the decisions it made.\nThis is the 'how is each agent performing' window.","operationId":"agent_metrics_api_metrics_agents_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":500,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Metrics Api Metrics Agents Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/metrics/dedup-bench":{"get":{"summary":"Dedup Bench","description":"Calibration bench: replay recent deduplicator decisions at a candidate\nthreshold (no re-embedding — reads the scores already stored in the run\ntraces) and report how many merges/uniques would flip. Lets an operator tune\nthe dedup threshold with evidence instead of blind.","operationId":"dedup_bench_api_metrics_dedup_bench_get","parameters":[{"name":"threshold","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Threshold"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":1000,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Dedup Bench Api Metrics Dedup Bench Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/metrics/triage-eval":{"get":{"summary":"Last Triage Eval","description":"The last triage evaluation of the live configuration in the caller's\nscope, the last candidate (what-if) run beside it, and the history of\nruns under the live configuration (each with its fingerprint).","operationId":"last_triage_eval_api_metrics_triage_eval_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Last Triage Eval Api Metrics Triage Eval Get"}}}}}},"post":{"summary":"Start Triage Eval","description":"Score triage — the classifier, the router's team and priority, and\ndedup's merges — against the labels on terminal tickets (source labels\nkept at ingest, and people's overrides), as a background job; the report\nis kept for GET /api/metrics/triage-eval. With candidate parameters, it\nscores those instead, and that report is kept apart as the candidate's,\nleaving the live report (and its trend) as they were.","operationId":"start_triage_eval_api_metrics_triage_eval_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TriageEvalBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Start Triage Eval Api Metrics Triage Eval Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/metrics/routing-bench":{"get":{"summary":"Routing Bench","description":"Replay routing through a candidate table (`table`, a JSON object of\ncategory -> team, merged over the table in force unless `replace`) on\nthe labelled terminal tickets in the caller's scope: team accuracy now\nand under the candidate, the tickets it fixes and breaks, and each\nre-routed category's effect — evidence before the table is changed\n(PUT /api/routing), as dedup-bench is for the dedup threshold.","operationId":"routing_bench_api_metrics_routing_bench_get","parameters":[{"name":"table","in":"query","required":true,"schema":{"type":"string","maxLength":65536,"title":"Table"}},{"name":"replace","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Replace"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":2000,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Routing Bench Api Metrics Routing Bench Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/audit/export":{"get":{"summary":"Export Audit","description":"The audit log as a file, filtered exactly as the screen was.\n\nExports the FILTERED set rather than everything, because the export an\nauditor asks for is the view you were just looking at. CSV for a\nspreadsheet, JSON Lines for anything that has to keep the nested detail\nintact — flattening it into a CSV cell loses the structure a SIEM wants.\nThe CSV's resource columns (resource_type … resource_parent_id), then\nits message column, then activity, service and source_service, then\noperation_status, response_code, response_error and status_detail, then\nfinding_count (how many guardrail findings the row carries — the\nfindings themselves are a list, which JSON Lines keeps whole), then\nactor_groups (a JSON list), then request_flags (a JSON list) and the\ncaptured request_data and response_data, then ocsf_class_uid and\nocsf_type_uid (the OCSF class and type JSON Lines carries as `ocsf`,\nempty on a row of an action with none), come last, after every older one, so a\nreader taking columns by position is undisturbed. A CSV text cell a\nspreadsheet would run as a formula (one starting =, +, -, @, tab or\nCR) is led with a single quote; JSON Lines\ncarries every value as written. ``match`` scopes the free text as on\n/audit/query (``all`` or ``message``).\n\n``fmt=bundle`` is the exception, and ignores the filters on purpose: the\nevidence bundle is the whole hash-chained log (plus, with ``archive=1``,\nthe sealed archive segments), a signed manifest, and nothing else. A\nfiltered chain has holes that look exactly like deletions, so a bundle of\n\"the view\" could never verify. See ticketiq.auditkeep.\n\n``fields`` (repeated or comma-separated) is the read mask of\n/audit/query: JSON Lines carries just those fields, CSV just those of its\ncolumns (ts always, in the usual order), and the read selects only what\nthey need. A field with no CSV column (id, tenant, the snapshots, the\ndiff) is a 400 on a CSV, pointing at JSON Lines. A bundle refuses a mask,\nas a projected row could never re-hash.\n\n``ordered=1`` with ``fields`` makes the file the table on screen: the\nCSV's columns are the fields named, in the order named (ts first unless\nnamed elsewhere), each ``detail.<key>`` a column of its own; JSON Lines\nwrites each object's keys in that order. Without it the columns keep\ntheir fixed order, as every script reading them by position expects.\n\nCedar's `read` on AuditLog::\"log\" first (_audit_read_gate); each file\ncut is an audit.read row unless audit_read_logging is off (_audit_read).","operationId":"export_audit_api_audit_export_get","parameters":[{"name":"fmt","in":"query","required":false,"schema":{"type":"string","default":"csv","title":"Fmt"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":10000,"title":"Limit"}},{"name":"actor","in":"query","required":false,"schema":{"type":"string","default":"","title":"Actor"}},{"name":"subsystem","in":"query","required":false,"schema":{"type":"string","default":"","title":"Subsystem"}},{"name":"search","in":"query","required":false,"schema":{"type":"string","default":"","title":"Search"}},{"name":"since","in":"query","required":false,"schema":{"type":"string","default":"","title":"Since"}},{"name":"until","in":"query","required":false,"schema":{"type":"string","default":"","title":"Until"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"window","in":"query","required":false,"schema":{"type":"string","default":"","title":"Window"}},{"name":"archive","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Archive"}},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Fields"}},{"name":"match","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Match"}},{"name":"ordered","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Ordered"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/audit/signing-key":{"get":{"summary":"Audit Signing Key","description":"The audit evidence signing keys, public halves only: the active one\n(made now if there is none yet, so it can be pinned before the first\nexport) and every one before it with its validity window. Save this\ndocument beside a bundle and scripts/verify_audit_bundle.py checks the\nbundle against it, with no access to this instance.","operationId":"audit_signing_key_api_audit_signing_key_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Audit Signing Key Api Audit Signing Key Get"}}}}}}},"/api/audit/signing-key/rotate":{"post":{"summary":"Rotate Audit Signing Key","description":"A new audit signing key. The one it replaces signs nothing from now\non; its validity window ends now and its public half stays listed, so\nthe bundles it signed still verify — unless `compromised`, which lists\nit as revoked. A compromise needs a reason, recorded in the audit log.","operationId":"rotate_audit_signing_key_api_audit_signing_key_rotate_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/AuditKeyRotateBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Rotate Audit Signing Key Api Audit Signing Key Rotate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/audit/retention":{"get":{"summary":"Get Audit Retention","description":"Retention window, legal hold, and the state of the chain and archive.\n\nBehind Cedar's `read` on AuditLog::\"log\" like every audit read, but never\nan audit.read row: it answers with the log's settings and counts, no row\nof it, and the audit page loads it on every visit.","operationId":"get_audit_retention_api_audit_retention_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Audit Retention Api Audit Retention Get"}}}}}},"put":{"summary":"Put Audit Retention","description":"Set the retention window and/or place or lift a legal hold.\n\nAdmin-only, and each change is its own audit event with before/after, so\nshortening retention to hide something leaves a record of exactly that —\nand the rows it would release are archived, not destroyed, either way.\n\n409 when ``expect_hold`` no longer matches the hold in force, and when a\nhold in force is lifted without ``expect_hold: true`` — so two admins'\nforms cannot silently undo each other's hold.","operationId":"put_audit_retention_api_audit_retention_put","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Put Audit Retention Api Audit Retention Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/holds":{"get":{"summary":"List Holds","description":"The legal holds in force (``all=true``: released ones too, with who\nlifted them and why), those of the caller's tenant only on a\nmulti-tenant instance — plus ``*``-wide ones for an owner or ``*``\nholder, as ReadScope has it.","operationId":"list_holds_api_holds_get","parameters":[{"name":"all","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"All"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Holds Api Holds Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Create Hold","description":"Place a legal hold on a ticket, requester, tenant, conversation or\nagent. From this call on, every deletion path keeps what it covers — the\nretention purge, eviction, the TTL sweep, erasure and every delete\nroute — and a delete of it is refused naming this hold.","operationId":"create_hold_api_holds_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HoldBody"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Hold Api Holds Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/holds/{hold_id}":{"get":{"summary":"Get Hold","operationId":"get_hold_api_holds__hold_id__get","parameters":[{"name":"hold_id","in":"path","required":true,"schema":{"type":"integer","title":"Hold Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Hold Api Holds  Hold Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Release Hold","description":"Lift a hold. It needs a reason — the release is as much a part of the\nmatter's record as the hold — and the row is kept, released, with who\nlifted it and why. What it kept becomes subject to retention again on\nthe next purge, so lifting one switches a protection off: it needs\nadmin.write (as lifting the audit legal hold does) or governance.weaken,\nnot only the access.write that placed it.","operationId":"release_hold_api_holds__hold_id__delete","parameters":[{"name":"hold_id","in":"path","required":true,"schema":{"type":"integer","title":"Hold Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/HoldReleaseBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Release Hold Api Holds  Hold Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/meetings/config":{"get":{"summary":"Meetings Config","description":"Whether Liya Meeting is on here, the personas, the voice service's\naddress and the announcement to give the meeting.","operationId":"meetings_config_api_meetings_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Meetings Config Api Meetings Config Get"}}}}}},"put":{"summary":"Put Meetings Config","description":"Turn Liya Meeting (and its raw archive) on or off for this workspace.","operationId":"put_meetings_config_api_meetings_config_put","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Put Meetings Config Api Meetings Config Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/meetings":{"get":{"summary":"List Meetings","operationId":"list_meetings_api_meetings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Meetings Api Meetings Get"}}}}}},"post":{"summary":"Start Meeting","description":"Start a meeting. Refused without the consent record it needs.","operationId":"start_meeting_api_meetings_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Start Meeting Api Meetings Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/meetings/{meeting_id}/ticket":{"post":{"summary":"Meeting Ticket","description":"A one-minute ticket the voice service takes audio on.","operationId":"meeting_ticket_api_meetings__meeting_id__ticket_post","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","title":"Meeting Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Meeting Ticket Api Meetings  Meeting Id  Ticket Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/meetings/{meeting_id}/lines":{"post":{"summary":"Meeting Line","operationId":"meeting_line_api_meetings__meeting_id__lines_post","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","title":"Meeting Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Meeting Line Api Meetings  Meeting Id  Lines Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/meetings/{meeting_id}/ask":{"post":{"summary":"Meeting Ask","description":"A short answer to a question asked in the meeting (``elaborate`` for\nthe fuller one), through the AI gateway as the caller.","operationId":"meeting_ask_api_meetings__meeting_id__ask_post","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","title":"Meeting Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Meeting Ask Api Meetings  Meeting Id  Ask Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/meetings/{meeting_id}/stop":{"post":{"summary":"Meeting Stop","operationId":"meeting_stop_api_meetings__meeting_id__stop_post","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","title":"Meeting Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Meeting Stop Api Meetings  Meeting Id  Stop Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/meetings/{meeting_id}":{"delete":{"summary":"Meeting Delete","description":"Delete one of your meetings everywhere (409 under a legal hold).","operationId":"meeting_delete_api_meetings__meeting_id__delete","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","title":"Meeting Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Meeting Delete Api Meetings  Meeting Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/recall/meetings":{"get":{"summary":"Recall Meetings","description":"Search your own meetings' transcripts (redacted). Audited.","operationId":"recall_meetings_api_recall_meetings_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Recall Meetings Api Recall Meetings Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/recall/meetings/{meeting_id}":{"get":{"summary":"Recall Meeting","operationId":"recall_meeting_api_recall_meetings__meeting_id__get","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","title":"Meeting Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Recall Meeting Api Recall Meetings  Meeting Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/archive/verify":{"get":{"summary":"Archive Verify","description":"Check this workspace's archive manifest: chain, signatures, objects.","operationId":"archive_verify_api_archive_verify_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Archive Verify Api Archive Verify Get"}}}}}}},"/api/archive/meetings/{meeting_id}/open-requests":{"post":{"summary":"Archive Open Request","description":"Ask to open one meeting's raw archive. Someone else approves it in\nthe approval queue before it can be opened.","operationId":"archive_open_request_api_archive_meetings__meeting_id__open_requests_post","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","title":"Meeting Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Archive Open Request Api Archive Meetings  Meeting Id  Open Requests Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/archive/meetings/{meeting_id}/open":{"post":{"summary":"Archive Open","operationId":"archive_open_api_archive_meetings__meeting_id__open_post","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","title":"Meeting Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Archive Open Api Archive Meetings  Meeting Id  Open Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/grants":{"get":{"summary":"List Grants","description":"Entitlement grants, newest first: ``status`` is a comma list of\npending, active, expired, revoked, rejected, withdrawn (every one when\nempty); ``agent`` narrows to one agent's.","operationId":"list_grants_api_grants_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"","title":"Status"}},{"name":"agent","in":"query","required":false,"schema":{"type":"string","default":"","title":"Agent"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Grants Api Grants Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Request Grant","description":"Ask for a time-bound permission for an agent. Pending until someone\nelse, holding access.write, approves it; nothing is permitted before.","operationId":"request_grant_api_grants_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GrantRequestBody"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Request Grant Api Grants Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/grants/{grant_id}":{"get":{"summary":"Get Grant","description":"One grant, with the permit it wrote while it is in force.","operationId":"get_grant_api_grants__grant_id__get","parameters":[{"name":"grant_id","in":"path","required":true,"schema":{"type":"integer","title":"Grant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Grant Api Grants  Grant Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/grants/{grant_id}/extend":{"post":{"summary":"Extend Grant","description":"Request an extension: a new pending grant from the old one's end,\napproved like any other. The active grant is untouched and lapses on\ntime if the extension is not approved.","operationId":"extend_grant_api_grants__grant_id__extend_post","parameters":[{"name":"grant_id","in":"path","required":true,"schema":{"type":"integer","title":"Grant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GrantExtendBody"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Extend Grant Api Grants  Grant Id  Extend Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/grants/{grant_id}/approve":{"post":{"summary":"Approve Grant","description":"Approve a pending grant and write its permit (``grant-<id>``). Never\nby its requester: that refusal is audited as ``audit.grant.approve.denied``\n— the attempt is what a separation-of-duties reviewer looks for.","operationId":"approve_grant_api_grants__grant_id__approve_post","parameters":[{"name":"grant_id","in":"path","required":true,"schema":{"type":"integer","title":"Grant Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/GrantDecisionBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Approve Grant Api Grants  Grant Id  Approve Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/grants/{grant_id}/reject":{"post":{"summary":"Reject Grant","description":"Refuse a pending grant (access.write), or withdraw one's own request.","operationId":"reject_grant_api_grants__grant_id__reject_post","parameters":[{"name":"grant_id","in":"path","required":true,"schema":{"type":"integer","title":"Grant Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/GrantDecisionBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reject Grant Api Grants  Grant Id  Reject Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/grants/{grant_id}/revoke":{"post":{"summary":"Revoke Grant","description":"End an active grant now: its permit is removed and the row records\nwho ended it and why. Takes a permission away, so access.write suffices.","operationId":"revoke_grant_api_grants__grant_id__revoke_post","parameters":[{"name":"grant_id","in":"path","required":true,"schema":{"type":"integer","title":"Grant Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/GrantDecisionBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Revoke Grant Api Grants  Grant Id  Revoke Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/retention":{"get":{"summary":"Get Retention","description":"Per-store retention: the floor, the instance windows, each visible\ntenant's windows (what it set and what is in force), which stores have\na purger, the holds in force and the last purge's report.","operationId":"get_retention_api_retention_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Retention Api Retention Get"}}}}}},"put":{"summary":"Put Retention","description":"Set instance windows per store and/or raise the retention floor.\nRefused (422) below the floor, and for a floor lower than the one in\nforce. Audited with before and after.","operationId":"put_retention_api_retention_put","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Put Retention Api Retention Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/retention/purge":{"post":{"summary":"Post Retention Purge","description":"Run the retention purge now — every store, or the ones named — or with\n``dry_run`` (the default) count what it would delete and what holds\nkeep. The scheduler runs it daily. One audit row per real run.","operationId":"post_retention_purge_api_retention_purge_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RetentionPurgeBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Post Retention Purge Api Retention Purge Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/privacy/search":{"post":{"summary":"Privacy Search","description":"Where a person is, store by store: counts, the records by id and why\nthey matched (their own, or a mention), and the legal holds that would\nrefuse erasing them (in ``mode``). No content — that is the export.","operationId":"privacy_search_api_privacy_search_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubjectBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Privacy Search Api Privacy Search Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/privacy/export":{"post":{"summary":"Privacy Export","description":"The DSAR access copy: every record that is the person's or names\nthem, with its content, as one JSON document to hand them. Audited: an\nexport of one person's data is itself a disclosure.","operationId":"privacy_export_api_privacy_export_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubjectBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/privacy/dsar":{"post":{"summary":"Privacy Dsar","description":"The data-subject access request as one route: the search (where the\nperson is), or with ``export: true`` the access copy to hand them —\nexactly POST /api/privacy/search and /api/privacy/export, audited as\nthey are.","operationId":"privacy_dsar_api_privacy_dsar_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DsarBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Privacy Dsar Api Privacy Dsar Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/privacy/erase":{"post":{"summary":"Privacy Erase","description":"Erase a person from every store (or the ``stores`` named): their own\nrecords deleted, mentions of them redacted, their tickets pseudonymised\n(``mode=redact``) or deleted with the ticket cascade (``delete``), then a\nresidual re-search. Returns the job with a receipt per store.\n\nRefused (409, naming it) when a legal hold covers any match. With\n``erasure_four_eyes`` on, the job waits (202) for a second\nadministrator's POST /api/privacy/erasures/{id}/approve instead.","operationId":"privacy_erase_api_privacy_erase_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EraseBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Privacy Erase Api Privacy Erase Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/privacy/erasures/{job_id}/approve":{"post":{"summary":"Approve Erasure","description":"The second pair of eyes: a different administrator runs a pending\nerasure. The one who asked for it cannot — that is the whole control.","operationId":"approve_erasure_api_privacy_erasures__job_id__approve_post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ErasureDecisionBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Approve Erasure Api Privacy Erasures  Job Id  Approve Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/privacy/erasures/{job_id}/reject":{"post":{"summary":"Reject Erasure","description":"Turn a pending erasure down, with a reason; its sealed subject is\ndropped with it.","operationId":"reject_erasure_api_privacy_erasures__job_id__reject_post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ErasureDecisionBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reject Erasure Api Privacy Erasures  Job Id  Reject Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/privacy/erasures":{"get":{"summary":"List Erasures","description":"The erasure register: every job, its status, receipts and residual —\nnaming each person only by digest and hint. For an auditor as much as\nan administrator, so audit.read; instance-wide, as the jobs are.","operationId":"list_erasures_api_privacy_erasures_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Erasures Api Privacy Erasures Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/privacy/erasures/{job_id}":{"get":{"summary":"Get Erasure","description":"One job's receipts. Each receipt carries a digest of itself, the job a\ndigest over them all, and that digest is on the job's audit row — so a\nreceipt shown here can be checked against the hash chain.","operationId":"get_erasure_api_privacy_erasures__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Erasure Api Privacy Erasures  Job Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/audit/verify":{"get":{"summary":"Verify Audit Chain","description":"Walk the live chain now, with this instance's key: edits, deletions,\nreorderings and forged checkpoints, each named by row.\n\nRate-limited like the other expensive calls: it reads every row and every\narchive file while holding the lock prune and bundle export wait on, and\nany audit reader can call it. Behind Cedar's `read` on AuditLog::\"log\",\nand an audit.read row unless audit_read_logging is off: it reads every\nrow, and its verdict is evidence of what the log held when it ran.","operationId":"verify_audit_chain_api_audit_verify_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Verify Audit Chain Api Audit Verify Get"}}}}}}},"/api/usage/export":{"get":{"summary":"Export Usage","description":"Per-agent/provider/model rollups as CSV, matching the on-screen filters\n(the advanced `filter` expression and the chargeback filter included)\nand window — and the on-screen `read` filter, or the export would be the\nway round it. `agent_uid` is /usage's (_agent_uid_filter). With\n`group_by` (tenant, channel, principal, ticket_id or tool) the\nchargeback rows follow, one per value, `dimension` naming it — the same\ncolumns, so the file a finance team imports is one table.","operationId":"export_usage_api_usage_export_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}},{"name":"agent","in":"query","required":false,"schema":{"type":"string","default":"","title":"Agent"}},{"name":"provider","in":"query","required":false,"schema":{"type":"string","default":"","title":"Provider"}},{"name":"model","in":"query","required":false,"schema":{"type":"string","default":"","title":"Model"}},{"name":"window","in":"query","required":false,"schema":{"type":"string","default":"","title":"Window"}},{"name":"start","in":"query","required":false,"schema":{"type":"string","default":"","title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"type":"string","default":"","title":"End"}},{"name":"agent_uid","in":"query","required":false,"schema":{"type":"string","default":"","title":"Agent Uid"}},{"name":"filter","in":"query","required":false,"schema":{"type":"string","default":"","title":"Filter"}},{"name":"group_by","in":"query","required":false,"schema":{"type":"string","default":"","title":"Group By"}},{"name":"tenant","in":"query","required":false,"schema":{"type":"string","default":"","title":"Tenant"}},{"name":"channel","in":"query","required":false,"schema":{"type":"string","default":"","title":"Channel"}},{"name":"principal","in":"query","required":false,"schema":{"type":"string","default":"","title":"Principal"}},{"name":"ticket_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Ticket Id"}},{"name":"tool","in":"query","required":false,"schema":{"type":"string","default":"","title":"Tool"}},{"name":"user_email","in":"query","required":false,"schema":{"type":"string","default":"","title":"User Email"}},{"name":"organization_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/audit":{"get":{"summary":"Get Audit","description":"Admin-plane change log: who changed what, when (settings, routing, token\nrotation, integrations, deletions, un-merges). An enterprise hard requirement.\n\nFilters are additive and all optional, so the unfiltered call keeps its\noriginal shape — `entries` remains the canonical key for existing clients.\n`events` carries the same rows with the subsystem broken out, alongside the\ntotal match count needed to tell a quiet period from an over-narrow filter.\n\n`trace_id` narrows to one W3C trace: every row written by the work that\ntrace id names — the caller's own, or the one TicketIQ minted and\nreturned in `traceresponse` — whichever request, run or thread wrote it.\n\nBehind Cedar's `read` on AuditLog::\"log\" (_audit_read_gate), and an\naudit.read row when audit_read_logging is \"all\" (_audit_read).","operationId":"get_audit_api_audit_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"actor","in":"query","required":false,"schema":{"type":"string","default":"","title":"Actor"}},{"name":"subsystem","in":"query","required":false,"schema":{"type":"string","default":"","title":"Subsystem"}},{"name":"search","in":"query","required":false,"schema":{"type":"string","default":"","title":"Search"}},{"name":"since","in":"query","required":false,"schema":{"type":"string","default":"","title":"Since"}},{"name":"until","in":"query","required":false,"schema":{"type":"string","default":"","title":"Until"}},{"name":"trace_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Trace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Audit Api Audit Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/audit/query":{"get":{"summary":"Audit Query","description":"The audit page in one request: the rows, and — when asked — the verdict\ntimeline and the facet counts, all under ONE filter.\n\n``q`` is the query language from auditlog.parse:\n``actor=ana outcome=denied agent!=copilot free text``, the attribution\nfields ``actor_type=agent on_behalf_of=ana policy=no-after-hours``, and\nwhat each event acted on: ``resource_type=Tool resource_parent_id=github``\n(also ``resource_id``, ``resource_name``, ``resource_parent_type``; each\nevent carries all five, \"\" where it acted on nothing, and the facets\ncount ``resource_type`` and ``resource_id``). One filter for all three\nanswers, because a timeline that counted a different set from the table\nbeside it would make the page contradict itself.\n\nEvery event carries ``message``, one line of at most\nauditlog.MAX_MESSAGE_CHARS: ``Denied: agent:copilot for ana mcp.call on\nTool search in McpServer github by no-github - <reason>``. ``match``\nscopes the free text of ``q``, case-folded for every script: ``all`` (the\ndefault: the action, the actor and the whole detail, key names included,\nas it always was) or ``message`` (only each row's message). A message is\nwritten with each row, so ``match=message`` finds nothing written before\nmessages existed — those rows show one computed on read, which no search\ncan match; ``all`` still finds them. Any other scope is a 400.\n\nEvery event also says what kind of call it was and where it came from:\n``activity`` (create, read, update, delete, execute, authenticate or\nother — from the action's verb), ``service`` (the invocation channel it\ncame through — playground, gateway, teams, cron… — else its subsystem's\nservice: identity, ai-gateway, agent-runtime, governance, itsm, admin,\naudit; the two never share a word, so ``service=gateway`` is traffic\nthrough the agent gateway and ``service=ai-gateway`` the model, tool\nand gateway-client registries) and ``source_service``\n(``ticketiq/<component>@<host>``, stamped as the row was written; \"\" on\na row from before it). Each filters (``activity=delete``), facets and\norders like any other field.\n\nAnd whether it worked: ``operation_status`` (``success`` or\n``failure``) folds the verdict with any failure the call met — a refusal\nfailed, and so did a permitted call whose transport or provider then\nfailed — with ``response_code`` (the HTTP status, JSON-RPC code or\nprovider error class it failed with), ``response_error`` (the error\ntext, one line, scrubbed of personal data and credentials) and\n``status_detail`` (the reason the row gives). The status is derived, so\nan older row has one; each filters (``operation_status=failure``,\nADP's ``FAILED`` too), facets and exports, and the status and the code\norder a page.\n\nAnd what a guardrail found: a guardrail block, flag or mask row carries\n``findings`` — per finding the policy, its ``family`` (kind), the\n``category`` matched (an entity type, a topic's label, a vendor's\ncategory; never text), the ``action`` (block, mask, flag, or monitor for\na detect-only finding), the ``score`` when one was computed, the\n``engine`` (builtin or the external one) and ``shadow`` (a monitor-mode\nrule's, which changed nothing) — and every event ``finding_count``.\n``finding_policy``, ``finding_category``, ``finding_action``,\n``finding_family``, ``finding_engine`` and ``finding_shadow`` filter\n(``finding_policy`` the rule behind any finding, where ``policy`` is the\nrule a row is about; the positive terms of one query held by one\nfinding: ``finding_category=EMAIL finding_shadow=true``) and facet,\neach value counted once per row.\n\nPaging: ``page_size`` (default 50, max 200), ``page_token`` (the previous\nanswer's ``next_page_token``) and ``order_by`` (``time|id|actor|action|\nsubsystem|outcome|actor_type|on_behalf_of|activity|service|source_service|\noperation_status|response_code|resource_type|resource_id|resource_name|\nresource_parent_type|resource_parent_id|ip|correlation|status_detail|\nresponse_error|trace_id|record_directive``\nthen ``asc|desc``; default ``time desc``) walk by keyset, which a\nconcurrent write cannot shift. A bare field ascends (AIP-132);\n``legacy_order=1`` keeps the old descending, as does a page token minted\nbefore the change, so a walk begun then finishes in its order. Outcome\nsorts by verdict rank (allowed < flagged < masked < denied < error). With none of the three, the legacy\n``limit``/``offset`` answer is unchanged.\n\nAnd whose groups: ``actor_groups`` lists the group memberships of the\nperson the row is accountable to (the one a machine acted for, else a\nsigned-in human) as stamped when it was written — never looked up on\nread. ``group=netops,sre`` finds rows whose person was in either\n(``group!=`` excludes them and keeps rows with no groups; ``actor_groups=``\nis the same term), at most auditlog.MAX_GROUP_TERM_VALUES groups across\nevery group term of ``q``; ``facet=group`` counts each member. Terms\nnaming more, or a group no name could be, or a ``q`` over\nauditlog.MAX_QUERY_BYTES, is a 400.\n\n``fields`` (repeated or comma-separated: ``id,actor,outcome,detail.agent``)\nis a read mask over each event: only those fields come back, ``id`` and\n``ts`` always, and the SELECT reads only what they need — a list that\ndoes not ask for ``detail``, ``before``/``after``, ``changes`` or\n``change_count`` never reads the detail column or a snapshot, and\n``change_count`` sends one number where ``changes`` sends the diff (for\na create, the whole snapshot). Absent means whole events; an unknown\nfield, or more than auditlog.MAX_MASK_ENTRIES names, is a 400. The\ntimeline and facets are not events and are unaffected.\n\n``interval`` suggests the timeline's width — ``90s``, ``5m``, ``1h``,\n``1d`` or a number of seconds, up to auditlog.MAX_INTERVAL_SECONDS.\nUnset, the server picks a day, an hour or a minute from the window, as it\nalways did. Set, buckets start at epoch multiples of it, named by full ISO\ninstants, and a width that would put more than\nauditlog.MAX_TIMELINE_BUCKETS bars in the window is widened. The timeline\nsays the width it used (``interval_seconds``) and whether it was widened.\n\n``facet`` (repeated or comma-separated, at most auditlog.MAX_FACET_FIELDS)\nchooses the facet fields: any field a filter can name, a plain detail key\nincluded; absent means auditlog.FACET_FIELDS. ``facet_limit`` (default\n12, 1 to auditlog.MAX_FACET_LIMIT) is how many values each lists. Every\nvalue carries ``denied``, how many of its calls were refused, and\n``facets_truncated`` says per field whether values were left out. A name\ntwice, one no filter can use, a field of the event no filter reads\n(auditlog.EVENT_ONLY_FIELDS: tenant, id, before…), or a limit out of\nrange is a 400.\n\n``group=correlation`` (opt-in; absent, every answer above is exactly as\nit was) lists one ENTRY per call instead of one row per decision: every\nrow one request wrote under its correlation id is one entry, and a row\nwith none is an entry of its own. A correlation the caller chose (an\nX-Request-ID) is only a label, which another request — anyone's — may\nsend too, so the rows of each request that reused it are an entry of\ntheir own (auditlog.stamp_request), never part of another's call. An\nentry is its first row's event — its actor, ts and action — with the\ncall's ``outcome`` (``partial`` when some of its resources were refused\nand some not), ``resource_count``,\n``denied_resource_count`` and ``masked_resource_count`` over every row of\nthe call, ``resources`` (each row's event id, action, verdict and\nresource_* fields, denials first, at most\nauditlog.MAX_GROUP_RESOURCES) and ``resources_truncated``. The filter\npicks the calls — one is listed when ANY of its rows matches — and the\ncounts are always the whole call's, within the caller's tenants. The\nanswer pages by ``page_token`` (``page_size`` defaults to ``limit``;\n``offset`` is a 400), over the log as page one found it — the token pins\nits newest row, so a call still being written keeps its counts, and its\nplace in a count order, for the whole walk — and orders by ``time``,\n``id`` (the first row's), ``resource_count`` or\n``denied_resource_count``; ``total`` counts entries, the timeline counts\nentries at the earliest of their rows the filter matched (inside the\nwindow, where a call's first row need not be) and adds ``partial`` to\neach bucket, and the facets still count rows. Any other ``group`` is a\n400, and a token from one view is refused by the other. Its audit.read\nrow counts the member rows the answer disclosed as ``rows`` and the\nentries as ``entries``. A grouped read costs what the row view's does\nnot, so it draws on the expensive-route rate limit (a 429 past it).\n\nBehind Cedar's `read` on AuditLog::\"log\" (_audit_read_gate), and an\naudit.read row when audit_read_logging is \"all\" — one per reader and\nfilter a minute, however often the page reloads it (_audit_read).","operationId":"audit_query_api_audit_query_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"window","in":"query","required":false,"schema":{"type":"string","default":"7d","title":"Window"}},{"name":"since","in":"query","required":false,"schema":{"type":"string","default":"","title":"Since"}},{"name":"until","in":"query","required":false,"schema":{"type":"string","default":"","title":"Until"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"order","in":"query","required":false,"schema":{"type":"string","default":"desc","title":"Order"}},{"name":"timeline","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Timeline"}},{"name":"facets","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Facets"}},{"name":"page_size","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Page Size"}},{"name":"page_token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Page Token"}},{"name":"order_by","in":"query","required":false,"schema":{"type":"string","default":"","title":"Order By"}},{"name":"legacy_order","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Legacy Order"}},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Fields"}},{"name":"interval","in":"query","required":false,"schema":{"type":"string","default":"","title":"Interval"}},{"name":"facet","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Facet"}},{"name":"facet_limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Facet Limit"}},{"name":"match","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Match"}},{"name":"group","in":"query","required":false,"schema":{"type":"string","default":"","title":"Group"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Audit Query Api Audit Query Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/audit/events/{event_id}":{"get":{"summary":"Audit Event","description":"One event in full, with its field-level changes and every other event\nthe same request produced.\n\n``fields`` masks it as on /audit/query, plus ``related``: the events of\nthe same request, each masked the same way. Absent, the answer is whole\nand carries ``related``, as it always did.\n\nBehind Cedar's `read` on AuditLog::\"log\" before the id is looked up — a\ncaller the log is closed to learns nothing of which ids exist — and an\naudit.read row when audit_read_logging is \"all\" (_audit_read).","operationId":"audit_event_api_audit_events__event_id__get","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"integer","title":"Event Id"}},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Fields"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Audit Event Api Audit Events  Event Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/audit/search":{"get":{"summary":"Audit Search","description":"One page of audit events under ``q`` (free text and ``field=value`` /\n``field!=value`` terms on auditexplorer.SEARCH_FIELDS), in ``[from, to)``\nor the rolling ``window``, ordered by ``sort`` (``field [asc|desc]``,\nauditlog.ORDER_FIELDS). ``next_cursor`` pages on by keyset; \"\" on the last\npage. An unknown field, sort or cursor is a 400.","operationId":"audit_search_api_audit_search_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"from","in":"query","required":false,"schema":{"type":"string","default":"","title":"From"}},{"name":"to","in":"query","required":false,"schema":{"type":"string","default":"","title":"To"}},{"name":"window","in":"query","required":false,"schema":{"type":"string","default":"24h","title":"Window"}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","default":"","title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","default":"time desc","title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Audit Search Api Audit Search Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/audit/histogram":{"get":{"summary":"Audit Histogram","description":"Events per bucket across the window, allowed / denied / masked, from\none GROUP BY in the database; the bar width is picked for about sixty\nbars, and empty buckets come back as zeros.","operationId":"audit_histogram_api_audit_histogram_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"from","in":"query","required":false,"schema":{"type":"string","default":"","title":"From"}},{"name":"to","in":"query","required":false,"schema":{"type":"string","default":"","title":"To"}},{"name":"window","in":"query","required":false,"schema":{"type":"string","default":"24h","title":"Window"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Audit Histogram Api Audit Histogram Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/audit/facets":{"get":{"summary":"Audit Facets","description":"The top ``limit`` values of ``field`` under the same filter, each with\n``count``, ``denied`` and ``pct`` (its share of the matches). A field\nthat is typed-filter only (auditexplorer.TYPED_ONLY) or not offered is a\n400 saying why.","operationId":"audit_facets_api_audit_facets_get","parameters":[{"name":"field","in":"query","required":false,"schema":{"type":"string","default":"","title":"Field"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"from","in":"query","required":false,"schema":{"type":"string","default":"","title":"From"}},{"name":"to","in":"query","required":false,"schema":{"type":"string","default":"","title":"To"}},{"name":"window","in":"query","required":false,"schema":{"type":"string","default":"24h","title":"Window"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Audit Facets Api Audit Facets Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/maintenance/vector-health":{"get":{"summary":"Vector Health","description":"Reports Store⇄Qdrant divergence: tickets whose live-vector upsert failed\n(Qdrant outage / DR) and therefore aren't in the dedup index — and each\ncollection's embedding geometry, with the ones that no longer match the\nembedder (refused until migrated).","operationId":"vector_health_api_maintenance_vector_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Vector Health Api Maintenance Vector Health Get"}}}}}}},"/api/vector/health":{"get":{"summary":"Vector Health Alias","description":"The same report under the name the vector surface uses.","operationId":"vector_health_alias_api_vector_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Vector Health Alias Api Vector Health Get"}}}}}}},"/api/maintenance/reconcile-vectors":{"post":{"summary":"Reconcile Vectors","description":"Rebuild the live_tickets dedup index from the Store (the system of record).\nRuns as a background job; repairs any Store⇄Qdrant divergence.","operationId":"reconcile_vectors_api_maintenance_reconcile_vectors_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Reconcile Vectors Api Maintenance Reconcile Vectors Post"}}}}}}},"/api/seed":{"post":{"summary":"Seed","operationId":"seed_api_seed_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Seed Api Seed Post"}}}}}}},"/api/oauth/pending/{rid}":{"get":{"summary":"Oauth Pending","description":"What the consent page shows: who is asking, for what, against what.\nThe CSRF token rides along — only its owner can read it, and it must come\nback with the decision.","operationId":"oauth_pending_api_oauth_pending__rid__get","parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","title":"Rid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Oauth Pending Api Oauth Pending  Rid  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/oauth/pending/{rid}/approve":{"post":{"summary":"Oauth Approve","operationId":"oauth_approve_api_oauth_pending__rid__approve_post","parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","title":"Rid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Oauth Approve Api Oauth Pending  Rid  Approve Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/oauth/pending/{rid}/deny":{"post":{"summary":"Oauth Deny","operationId":"oauth_deny_api_oauth_pending__rid__deny_post","parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","title":"Rid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Oauth Deny Api Oauth Pending  Rid  Deny Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/oauth/connected-apps":{"get":{"summary":"Oauth Connected Apps","description":"The applications the signed-in person has let act as them. Scoped to\nthe caller by construction, like /connections.","operationId":"oauth_connected_apps_api_oauth_connected_apps_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Oauth Connected Apps Api Oauth Connected Apps Get"}}}}}}},"/api/oauth/connected-apps/{grant_id}":{"delete":{"summary":"Oauth Disconnect App","operationId":"oauth_disconnect_app_api_oauth_connected_apps__grant_id__delete","parameters":[{"name":"grant_id","in":"path","required":true,"schema":{"type":"string","title":"Grant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Oauth Disconnect App Api Oauth Connected Apps  Grant Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/oauth/grants":{"get":{"summary":"Oauth All Grants","description":"Every person's connected apps, for the operator deciding whom to cut off.","operationId":"oauth_all_grants_api_oauth_grants_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Oauth All Grants Api Oauth Grants Get"}}}}}}},"/api/mcp/inbound":{"get":{"summary":"Mcp Inbound Get","description":"What the /mcp endpoint offers, how each tool is named to Cedar, and\nthe data policies it enforces.","operationId":"mcp_inbound_get_api_mcp_inbound_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Mcp Inbound Get Api Mcp Inbound Get"}}}}}}},"/api/mcp/inbound/data-policies":{"put":{"summary":"Mcp Inbound Put Policies","description":"Data policies on /mcp's own tools — the same engine, and the same\nweakening gate, as the policies on a registered MCP server.","operationId":"mcp_inbound_put_policies_api_mcp_inbound_data_policies_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpInboundPoliciesBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Mcp Inbound Put Policies Api Mcp Inbound Data Policies Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/remote-agents":{"get":{"summary":"Remote Agents List","description":"Every registered remote agent the caller may read (Cedar `read` per\nrow: one a policy keeps from them is left out, not refused).","operationId":"remote_agents_list_api_remote_agents_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Remote Agents List Api Remote Agents Get"}}}}}},"post":{"summary":"Remote Agents Create","description":"Register a remote agent from its card URL. The card is read, checked\n(a signature must verify; require_signed refuses an unsigned one) and its\nendpoint pinned before anything is stored.","operationId":"remote_agents_create_api_remote_agents_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Remote Agents Create Api Remote Agents Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/remote-agents/{remote_id}":{"get":{"summary":"Remote Agents Get","operationId":"remote_agents_get_api_remote_agents__remote_id__get","parameters":[{"name":"remote_id","in":"path","required":true,"schema":{"type":"string","title":"Remote Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Remote Agents Get Api Remote Agents  Remote Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Remote Agents Update","description":"Change the operator's fields (tags, owner, credential, switches). A\nchange to what vouches for the card — require_signed, jwks_url — re-reads\nit at once, so the row never claims a standing it was not checked for.","operationId":"remote_agents_update_api_remote_agents__remote_id__patch","parameters":[{"name":"remote_id","in":"path","required":true,"schema":{"type":"string","title":"Remote Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Remote Agents Update Api Remote Agents  Remote Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Remote Agents Delete","operationId":"remote_agents_delete_api_remote_agents__remote_id__delete","parameters":[{"name":"remote_id","in":"path","required":true,"schema":{"type":"string","title":"Remote Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Remote Agents Delete Api Remote Agents  Remote Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/remote-agents/{remote_id}/refresh":{"post":{"summary":"Remote Agents Refresh","description":"Re-read the card now. `accept_endpoint: true` adopts an endpoint the\ncard moved to (a `drift`), which is the one way the pinned endpoint —\nwhere the credential is sent — ever changes.","operationId":"remote_agents_refresh_api_remote_agents__remote_id__refresh_post","parameters":[{"name":"remote_id","in":"path","required":true,"schema":{"type":"string","title":"Remote Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Remote Agents Refresh Api Remote Agents  Remote Id  Refresh Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/remote-agents/{remote_id}/kill-switch":{"get":{"summary":"Remote Agents Kill Switch Get","operationId":"remote_agents_kill_switch_get_api_remote_agents__remote_id__kill_switch_get","parameters":[{"name":"remote_id","in":"path","required":true,"schema":{"type":"string","title":"Remote Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Remote Agents Kill Switch Get Api Remote Agents  Remote Id  Kill Switch Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Remote Agents Kill Switch Put","description":"Engage or lift a remote agent's kill switch: every proxied call and\nevery managed agent's delegation to it is refused while it is on. The\nsame switch store and wording as our own agents' (killswitch), under\nthe key `remote:<id>`.\n\nDeliberately on the coarse verbs (agents.contain, and Cedar `contain` on\nthe RemoteAgent; `read` for the GET), not AgentKillSwitch get/update:\nAgentKillSwitch refines a managed Agent (policy.REFINES) and a remote\nagent is not one, so its switch is governed by the RemoteAgent's own\npolicies. Tenant default detectors likewise stay on governance verbs:\nthey belong to no agent a KillSwitchPolicy id could name.","operationId":"remote_agents_kill_switch_put_api_remote_agents__remote_id__kill_switch_put","parameters":[{"name":"remote_id","in":"path","required":true,"schema":{"type":"string","title":"Remote Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KillSwitchBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Remote Agents Kill Switch Put Api Remote Agents  Remote Id  Kill Switch Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/a2a/remote/{remote_id}":{"post":{"summary":"A2A Remote Proxy","description":"Call a registered remote agent, as JSON-RPC: message/send, tasks/get\nand tasks/cancel, in A2A 0.3's shapes whatever version the remote speaks\n(a2aremote normalises both ways) — and, to a remote whose card offers\nstreaming, message/stream and tasks/resubscribe, relayed as SSE while the\nremote works (a2aremote.stream: the same controls, its artifacts guarded\nwhole, severed by the kill switch).\n\nThe inbound path's controls, applied outbound: agents.operate and the\nrate limit (the route's), Cedar `invoke` on RemoteAgent::\"<id>\" for the\nperson, then the card's standing, the kill switch, the budget, the\nguardrails on the words sent and on the answer, a transcript — and a\ntask id answered only to the caller that started it.","operationId":"a2a_remote_proxy_api_a2a_remote__remote_id__post","parameters":[{"name":"remote_id","in":"path","required":true,"schema":{"type":"string","title":"Remote Id"}}],"requestBody":{"content":{"application/json":{"schema":{"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response A2A Remote Proxy Api A2A Remote  Remote Id  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/scim":{"get":{"summary":"Scim Config Get","description":"The SCIM configuration — never the token, only its last four\ncharacters — and the base URL to give the directory.","operationId":"scim_config_get_api_scim_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Scim Config Get Api Scim Get"}}}}}},"put":{"summary":"Scim Config Put","operationId":"scim_config_put_api_scim_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScimConfigBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Scim Config Put Api Scim Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/scim/token":{"post":{"summary":"Scim Token Mint","description":"A new SCIM bearer token, shown this once. The one before it stops\nworking in the same write (scim.mint_token).","operationId":"scim_token_mint_api_scim_token_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Scim Token Mint Api Scim Token Post"}}}}}}},"/api/oauth/device/{code}":{"get":{"summary":"Oauth Device Pending","operationId":"oauth_device_pending_api_oauth_device__code__get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Oauth Device Pending Api Oauth Device  Code  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/oauth/device/{code}/approve":{"post":{"summary":"Oauth Device Approve","operationId":"oauth_device_approve_api_oauth_device__code__approve_post","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceDecision"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Oauth Device Approve Api Oauth Device  Code  Approve Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/oauth/device/{code}/deny":{"post":{"summary":"Oauth Device Deny","operationId":"oauth_device_deny_api_oauth_device__code__deny_post","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceDecision"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Oauth Device Deny Api Oauth Device  Code  Deny Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/cli/downloads":{"get":{"summary":"Cli Downloads","description":"The binaries published now, for the download menu: only these are offered.","operationId":"cli_downloads_api_public_cli_downloads_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"AccessDismissBody":{"properties":{"agent":{"type":"string","maxLength":128,"title":"Agent","default":""},"code":{"type":"string","maxLength":64,"minLength":1,"title":"Code"},"subject":{"type":"string","maxLength":256,"title":"Subject","default":""},"reason":{"type":"string","maxLength":500,"title":"Reason","default":""},"days":{"type":"integer","title":"Days","default":90}},"additionalProperties":false,"type":"object","required":["code"],"title":"AccessDismissBody"},"AccessReviewBody":{"properties":{"note":{"type":"string","maxLength":500,"title":"Note","default":""}},"additionalProperties":false,"type":"object","title":"AccessReviewBody"},"AdoptLegacyBody":{"properties":{"dry_run":{"type":"boolean","title":"Dry Run","default":true},"reason":{"type":"string","maxLength":500,"title":"Reason","default":""},"triggers":{"type":"string","maxLength":8,"title":"Triggers","default":"doors"},"grant_users":{"type":"boolean","title":"Grant Users","default":true},"adopt_sources":{"type":"boolean","title":"Adopt Sources","default":true},"confirm":{"type":"string","title":"Confirm","default":""}},"additionalProperties":false,"type":"object","title":"AdoptLegacyBody"},"AgentConvertBody":{"properties":{"runtime":{"type":"string","title":"Runtime","default":""},"reason":{"type":"string","title":"Reason","default":""}},"type":"object","title":"AgentConvertBody"},"AgentKeyBody":{"properties":{"jwks":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"string"},{"type":"null"}],"title":"Jwks"},"jwks_uri":{"type":"string","title":"Jwks Uri","default":""},"label":{"type":"string","maxLength":200,"title":"Label","default":""}},"type":"object","title":"AgentKeyBody"},"AgentProfileBody":{"properties":{"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"},"max_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Tokens"},"effort":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Effort"},"timeout":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Timeout"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"strict_binding":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Strict Binding"},"refuse_unpriced":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Refuse Unpriced"},"prompt_caching":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Prompt Caching"},"gateway_providers":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Gateway Providers"},"fallbacks":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Fallbacks"},"context_window_fallbacks":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Context Window Fallbacks"},"content_policy_fallbacks":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Content Policy Fallbacks"},"fallback_on":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Fallback On"},"arms":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Arms"},"routing_rules":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Routing Rules"},"routes":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Routes"},"shadow":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"boolean"},{"type":"null"}],"title":"Shadow"},"spotlight":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Spotlight"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","title":"AgentProfileBody"},"AgentQuery":{"properties":{"query":{"type":"string","maxLength":2000,"title":"Query"},"limit":{"type":"integer","maximum":50.0,"minimum":1.0,"title":"Limit","default":10}},"type":"object","required":["query"],"title":"AgentQuery"},"AgentSpecBody":{"properties":{"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions"},"recording":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recording"},"card":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Card"},"telemetry":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Telemetry"},"session":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Session"},"engine":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Engine"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"override_redteam_gate":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Override Redteam Gate"}},"type":"object","title":"AgentSpecBody"},"AiActAcknowledgeBody":{"properties":{"reason":{"type":"string","title":"Reason","default":""}},"type":"object","title":"AiActAcknowledgeBody"},"AiActScreeningBody":{"properties":{"answers":{"additionalProperties":true,"type":"object","title":"Answers"},"reason":{"type":"string","maxLength":500,"title":"Reason","default":""}},"type":"object","title":"AiActScreeningBody"},"AnswerBody":{"properties":{"query":{"type":"string","maxLength":2000,"title":"Query","default":""},"top_k":{"anyOf":[{"type":"integer","maximum":20.0,"minimum":1.0},{"type":"null"}],"title":"Top K"},"requester":{"type":"string","maxLength":320,"title":"Requester","default":""},"conversation_id":{"type":"string","maxLength":128,"title":"Conversation Id","default":""}},"type":"object","title":"AnswerBody"},"AnswerFeedbackBody":{"properties":{"token":{"type":"string","maxLength":200,"title":"Token","default":""},"helpful":{"type":"boolean","title":"Helpful"},"labels":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":20},{"type":"null"}],"title":"Labels"},"comment":{"type":"string","maxLength":2000,"title":"Comment","default":""}},"type":"object","required":["helpful"],"title":"AnswerFeedbackBody"},"ApprovalBatchBody":{"properties":{"ids":{"items":{"type":"string"},"type":"array","maxItems":100,"minItems":1,"title":"Ids"},"decision":{"type":"string","enum":["approve","reject"],"title":"Decision"},"reason":{"type":"string","maxLength":500,"title":"Reason","default":""},"digests":{"additionalProperties":{"type":"string"},"type":"object","maxProperties":100,"title":"Digests"},"allow_high_risk":{"type":"boolean","title":"Allow High Risk","default":false}},"additionalProperties":false,"type":"object","required":["ids","decision"],"title":"ApprovalBatchBody"},"ApprovalDecisionBody":{"properties":{"reason":{"type":"string","maxLength":500,"title":"Reason","default":""},"digest":{"type":"string","maxLength":128,"title":"Digest","default":""}},"type":"object","title":"ApprovalDecisionBody"},"ApprovalEditBody":{"properties":{"arguments":{"additionalProperties":true,"type":"object","title":"Arguments"},"reason":{"type":"string","maxLength":500,"title":"Reason","default":""},"digest":{"type":"string","maxLength":128,"title":"Digest","default":""}},"additionalProperties":false,"type":"object","required":["arguments"],"title":"ApprovalEditBody"},"AuditKeyRotateBody":{"properties":{"compromised":{"type":"boolean","title":"Compromised","default":false},"reason":{"type":"string","maxLength":500,"title":"Reason","default":""}},"additionalProperties":false,"type":"object","title":"AuditKeyRotateBody"},"AuditOverrideBody":{"properties":{"score":{"type":"integer","title":"Score"},"reason":{"type":"string","maxLength":2000,"title":"Reason"}},"additionalProperties":false,"type":"object","required":["score","reason"],"title":"AuditOverrideBody"},"AuthorizeBody":{"properties":{"scopes":{"anyOf":[{"items":{},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Scopes"},"scopes_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scopes Mode"},"force_reauthorization":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Force Reauthorization"},"success_redirect_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Success Redirect Url"},"failure_redirect_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Failure Redirect Url"}},"additionalProperties":false,"type":"object","title":"AuthorizeBody","description":"POST /api/connections/{provider}/authorize's optional body — ADP's\nAuthorize request. Each field may also come as a query parameter of the\nsame name (scopes space-separated there); a field set here wins."},"BlueprintEmailBody":{"properties":{"email":{"type":"string","title":"Email","default":""},"blueprint":{"additionalProperties":true,"type":"object","title":"Blueprint"},"website":{"type":"string","title":"Website","default":""}},"type":"object","title":"BlueprintEmailBody"},"BlueprintInstallBody":{"properties":{"agent_id":{"type":"string","title":"Agent Id","default":""},"provider":{"type":"string","title":"Provider","default":""},"model":{"type":"string","title":"Model","default":""},"tags":{"items":{},"type":"array","title":"Tags"}},"type":"object","title":"BlueprintInstallBody"},"Body_upload_ticket_attachment_api_tickets__ticket_id__attachments_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_ticket_attachment_api_tickets__ticket_id__attachments_post"},"BudgetBody":{"properties":{"limit_usd":{"type":"number","title":"Limit Usd"},"period":{"type":"string","title":"Period","default":"month"},"agent":{"type":"string","title":"Agent","default":""},"warn_pct":{"type":"number","title":"Warn Pct","default":0},"recipients":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Recipients"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"tenant":{"title":"Tenant"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},"type":"object","required":["limit_usd"],"title":"BudgetBody"},"BudgetCreateBody":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"filter_agent_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filter Agent Name"},"filter_agent_uid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filter Agent Uid"},"agent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent"},"limit_usd":{"type":"number","title":"Limit Usd"},"period":{"type":"string","title":"Period","default":"month"},"warn_pct":{"type":"number","title":"Warn Pct","default":0},"recipients":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Recipients"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"tenant":{"title":"Tenant"}},"additionalProperties":true,"type":"object","required":["limit_usd"],"title":"BudgetCreateBody","description":"POST /budgets (ADP's CreateBudget): a new budget, refused with 409\nwhen its name is taken or the default / the agent already has one — the\ncreate a PUT is not. The agent is ADP's filter (filter_agent_name, or\nfilter_agent_uid for an agent known by its uid); neither is the default.\n`agent` is accepted as PUT's spelling of filter_agent_name.\n\nUndeclared fields are kept (extra=\"allow\") so that one sent — a uid, a\nstamp, effective_from — is refused by the route rather than dropped: a\ncaller that set its own uid must not believe the budget carries it."},"BudgetPatchBody":{"properties":{"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"limit_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Limit Usd"},"period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period"},"warn_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Warn Pct"},"recipients":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Recipients"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"update_mask":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Update Mask"}},"additionalProperties":true,"type":"object","title":"BudgetPatchBody","description":"PATCH /budgets/{name} (ADP's UpdateBudget): every field optional, plus\nupdate_mask. What each combination writes is usage.update_budget's.\n\nUndeclared fields are kept (extra=\"allow\") so that one naming an\nimmutable or unknown field reaches update_budget and is refused there.\nDropped here, as BudgetBody drops them, `{\"agent\": \"scribe\"}` sent to\n/budgets/copilot would answer 200 — and the caller would believe the cap\nnow sat on scribe."},"BuiltinTagsBody":{"properties":{"tags":{"items":{},"type":"array","title":"Tags"},"reason":{"type":"string","title":"Reason","default":""}},"type":"object","required":["tags"],"title":"BuiltinTagsBody"},"BuiltinToolsBody":{"properties":{"mcp_servers":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Mcp Servers"},"subagents":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Subagents"}},"type":"object","title":"BuiltinToolsBody"},"BundleApplyBody":{"properties":{"bundle":{"additionalProperties":true,"type":"object","title":"Bundle"},"dry_run":{"type":"boolean","title":"Dry Run","default":false},"reason":{"type":"string","maxLength":500,"title":"Reason","default":""}},"additionalProperties":false,"type":"object","required":["bundle"],"title":"BundleApplyBody"},"BundleUnlockBody":{"properties":{"reason":{"type":"string","maxLength":500,"title":"Reason","default":""}},"additionalProperties":false,"type":"object","title":"BundleUnlockBody"},"CandidateNoteBody":{"properties":{"note":{"type":"string","maxLength":500,"title":"Note","default":""},"reason":{"type":"string","title":"Reason","default":""},"override_redteam_gate":{"type":"boolean","title":"Override Redteam Gate","default":false}},"additionalProperties":false,"type":"object","title":"CandidateNoteBody"},"CaseActionBody":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Title"},"owner":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Owner"},"due":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Due"},"status":{"anyOf":[{"type":"string","maxLength":16},{"type":"null"}],"title":"Status"},"note":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Note"}},"additionalProperties":false,"type":"object","title":"CaseActionBody"},"CaseCreateBody":{"properties":{"case_type":{"type":"string","maxLength":16,"title":"Case Type","default":"incident"},"agent":{"type":"string","maxLength":128,"title":"Agent"},"title":{"type":"string","maxLength":500,"title":"Title"},"description":{"type":"string","maxLength":20000,"title":"Description","default":""},"severity":{"type":"string","maxLength":16,"title":"Severity","default":"sev3"}},"additionalProperties":false,"type":"object","required":["agent","title"],"title":"CaseCreateBody"},"CaseRegulatoryBody":{"properties":{"serious":{"type":"boolean","title":"Serious"},"category":{"type":"string","maxLength":32,"title":"Category","default":"general"},"aware_at":{"type":"string","maxLength":64,"title":"Aware At","default":""},"authority":{"type":"string","maxLength":600,"title":"Authority","default":""}},"additionalProperties":false,"type":"object","required":["serious"],"title":"CaseRegulatoryBody"},"CaseReportBody":{"properties":{"authority":{"type":"string","maxLength":600,"title":"Authority","default":""},"reference":{"type":"string","maxLength":600,"title":"Reference","default":""},"reported_at":{"type":"string","maxLength":64,"title":"Reported At","default":""}},"additionalProperties":false,"type":"object","title":"CaseReportBody"},"CaseTransitionBody":{"properties":{"to":{"type":"string","maxLength":32,"title":"To"},"note":{"type":"string","maxLength":4000,"title":"Note","default":""},"resolution":{"type":"string","maxLength":20000,"title":"Resolution","default":""}},"additionalProperties":false,"type":"object","required":["to"],"title":"CaseTransitionBody"},"CaseUpdateBody":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}],"title":"Description"},"severity":{"anyOf":[{"type":"string","maxLength":16},{"type":"null"}],"title":"Severity"},"owner":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Owner"},"root_cause":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}],"title":"Root Cause"},"contributing_factors":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Contributing Factors"}},"additionalProperties":false,"type":"object","title":"CaseUpdateBody"},"CedarPolicyBody":{"properties":{"spec":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Spec"},"body":{"type":"string","title":"Body","default":""},"about":{"type":"string","title":"About","default":""},"description":{"type":"string","title":"Description","default":""},"display_name":{"type":"string","title":"Display Name","default":""},"tags":{"additionalProperties":true,"type":"object","title":"Tags","default":{}},"enabled":{"type":"boolean","title":"Enabled","default":true},"template_link":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Template Link"},"mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode"},"reason":{"type":"string","title":"Reason","default":""}},"type":"object","title":"CedarPolicyBody"},"CedarPolicyCreateBody":{"properties":{"spec":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Spec"},"body":{"type":"string","title":"Body","default":""},"about":{"type":"string","title":"About","default":""},"description":{"type":"string","title":"Description","default":""},"display_name":{"type":"string","title":"Display Name","default":""},"tags":{"additionalProperties":true,"type":"object","title":"Tags","default":{}},"enabled":{"type":"boolean","title":"Enabled","default":true},"template_link":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Template Link"},"mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode"},"reason":{"type":"string","title":"Reason","default":""},"name":{"type":"string","title":"Name","default":""}},"type":"object","title":"CedarPolicyCreateBody","description":"POST /api/policies (ADP's CreatePolicy): the name travels in the body,\nand the Cedar comes from exactly one of body, spec and template_link —\nnot PUT's rule of a spec silently winning over a body sent beside it."},"CeilingsBody":{"properties":{"ceilings":{"additionalProperties":{"type":"string"},"type":"object","title":"Ceilings"},"reason":{"type":"string","maxLength":500,"title":"Reason","default":""}},"type":"object","title":"CeilingsBody"},"ChangeDecisionBody":{"properties":{"note":{"type":"string","maxLength":500,"title":"Note","default":""}},"type":"object","title":"ChangeDecisionBody"},"ChannelsBody":{"properties":{"disabled":{"items":{},"type":"array","title":"Disabled"},"tenant":{"type":"string","title":"Tenant","default":""},"reason":{"type":"string","title":"Reason","default":""}},"type":"object","required":["disabled"],"title":"ChannelsBody"},"CimdBody":{"properties":{"admission_mode":{"title":"Admission Mode"},"require_initial_token":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Require Initial Token"},"trusted_statement_issuers":{"title":"Trusted Statement Issuers"},"client_cap":{"type":"integer","title":"Client Cap","default":50},"rate_per_hour":{"title":"Rate Per Hour","default":0},"enabled":{"type":"boolean","title":"Enabled","default":false},"trust_policy":{"title":"Trust Policy"},"acknowledge_open_trust":{"type":"boolean","title":"Acknowledge Open Trust","default":false},"allowed_origins":{"items":{"type":"string"},"type":"array","title":"Allowed Origins"},"allowed_domains":{"title":"Allowed Domains"},"self_registration":{"type":"boolean","title":"Self Registration","default":false},"default_scopes":{"items":{"type":"string"},"type":"array","title":"Default Scopes"},"inactive_ttl_days":{"title":"Inactive Ttl Days","default":0},"allowed_resources":{"title":"Allowed Resources"},"cimd_allowed_resources":{"title":"Cimd Allowed Resources"}},"type":"object","title":"CimdBody"},"ConcernBody":{"properties":{"agent":{"type":"string","maxLength":128,"title":"Agent"},"title":{"type":"string","maxLength":500,"title":"Title"},"description":{"type":"string","maxLength":20000,"title":"Description","default":""},"confidential":{"type":"boolean","title":"Confidential","default":false}},"additionalProperties":false,"type":"object","required":["agent","title"],"title":"ConcernBody"},"ConnProviderBody":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"authorize_url":{"type":"string","title":"Authorize Url","default":""},"token_url":{"type":"string","title":"Token Url"},"revocation_endpoint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Revocation Endpoint"},"client_id":{"type":"string","title":"Client Id"},"client_secret":{"type":"string","title":"Client Secret","default":""},"client_secret_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Secret Ref"},"scopes":{"type":"string","title":"Scopes","default":""},"label":{"type":"string","maxLength":64,"title":"Label","default":""},"about":{"type":"string","maxLength":200,"title":"About","default":""},"enabled":{"type":"boolean","title":"Enabled","default":true},"extra_auth_params":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Extra Auth Params"},"extra_token_params":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Extra Token Params"},"token_endpoint_auth_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token Endpoint Auth Method"},"pkce_required":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Pkce Required"},"slack_token_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slack Token Type"},"tags":{"anyOf":[{"additionalProperties":true,"type":"object"},{"items":{},"type":"array"},{"type":"null"}],"title":"Tags"},"mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode"},"grant_types":{"title":"Grant Types"},"obo":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Obo"}},"type":"object","required":["token_url","client_id"],"title":"ConnProviderBody"},"ConsentBody":{"properties":{"csrf":{"type":"string","maxLength":200,"title":"Csrf","default":""}},"type":"object","title":"ConsentBody"},"ContextSearchBody":{"properties":{"query":{"type":"string","maxLength":2000,"minLength":1,"title":"Query"}},"type":"object","required":["query"],"title":"ContextSearchBody"},"ConvEvalBackfillBody":{"properties":{"days":{"type":"integer","title":"Days","default":7}},"additionalProperties":false,"type":"object","title":"ConvEvalBackfillBody"},"ConvEvalConfigBody":{"properties":{"evaluators":{"items":{"type":"string"},"type":"array","maxItems":20,"title":"Evaluators"},"sample_rate":{"type":"number","title":"Sample Rate","default":1.0},"filters":{"additionalProperties":true,"type":"object","title":"Filters"},"hourly_cap":{"type":"integer","title":"Hourly Cap","default":100},"allowed_path":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Allowed Path"},"enabled":{"type":"boolean","title":"Enabled","default":true}},"additionalProperties":false,"type":"object","title":"ConvEvalConfigBody"},"CredentialBody":{"properties":{"description":{"type":"string","title":"Description","default":""},"expires_in_days":{"type":"number","title":"Expires In Days","default":90}},"type":"object","title":"CredentialBody"},"CredentialPatchBody":{"properties":{"description":{"type":"string","maxLength":1024,"title":"Description"}},"type":"object","required":["description"],"title":"CredentialPatchBody"},"DataPoliciesBody":{"properties":{"policies":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Policies"},"reason":{"type":"string","title":"Reason","default":""}},"type":"object","title":"DataPoliciesBody"},"DataPolicyPreviewBody":{"properties":{"tool":{"type":"string","title":"Tool","default":""},"arguments":{"additionalProperties":true,"type":"object","title":"Arguments"},"sample":{"title":"Sample"},"policies":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Policies"},"as_user":{"type":"string","maxLength":120,"title":"As User","default":""},"as_role":{"type":"string","maxLength":120,"title":"As Role","default":""},"as_agent":{"type":"string","maxLength":120,"title":"As Agent","default":""},"as_anyone":{"type":"boolean","title":"As Anyone","default":false},"principal":{"anyOf":[{"$ref":"#/components/schemas/PrincipalRef"},{"type":"null"}]},"as_requester":{"anyOf":[{"$ref":"#/components/schemas/PreviewRequester"},{"type":"null"}]},"input_schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Input Schema"},"output_schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Output Schema"}},"type":"object","title":"DataPolicyPreviewBody"},"DeEscalateBody":{"properties":{"reason":{"type":"string","maxLength":500,"title":"Reason","default":""}},"type":"object","title":"DeEscalateBody"},"DecideBody":{"properties":{"title":{"type":"string","maxLength":1000,"title":"Title","default":""},"description":{"type":"string","maxLength":20000,"title":"Description","default":""},"priority":{"type":"string","maxLength":40,"title":"Priority","default":""},"ask_model":{"type":"boolean","title":"Ask Model","default":false},"session":{"type":"string","maxLength":128,"title":"Session","default":""}},"type":"object","title":"DecideBody"},"DeflectionTenantBody":{"properties":{"tenant":{"type":"string","title":"Tenant","default":""}},"type":"object","title":"DeflectionTenantBody"},"DelegateBody":{"properties":{"message":{"type":"string","title":"Message","default":""},"system":{"type":"string","title":"System","default":""}},"type":"object","title":"DelegateBody"},"DemoRequestBody":{"properties":{"name":{"type":"string","title":"Name","default":""},"email":{"type":"string","title":"Email","default":""},"company":{"type":"string","title":"Company","default":""},"role":{"type":"string","title":"Role","default":""},"product":{"type":"string","title":"Product","default":""},"intent":{"type":"string","title":"Intent","default":"demo"},"systems":{"items":{"type":"string"},"type":"array","title":"Systems","default":[]},"message":{"type":"string","title":"Message","default":""},"website":{"type":"string","title":"Website","default":""},"finder":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Finder"}},"type":"object","title":"DemoRequestBody"},"DetectorBacktestBody":{"properties":{"signal":{"type":"string","maxLength":64,"title":"Signal","default":""},"detector":{"additionalProperties":true,"type":"object","title":"Detector"},"start":{"type":"string","maxLength":64,"title":"Start","default":""},"end":{"type":"string","maxLength":64,"title":"End","default":""}},"type":"object","title":"DetectorBacktestBody","description":"A candidate detector to replay: the signal and detector a save would\ntake, and the range (history_range's, a week by default). No name, mode\nor agent — nothing is saved, and the agent is the URL's."},"DetectorBody":{"properties":{"signal":{"type":"string","title":"Signal"},"mode":{"type":"string","title":"Mode","default":"shadow"},"detector":{"additionalProperties":true,"type":"object","title":"Detector"},"enabled":{"type":"boolean","title":"Enabled","default":true},"about":{"type":"string","title":"About","default":""},"display_name":{"type":"string","title":"Display Name","default":""},"tags":{"additionalProperties":true,"type":"object","title":"Tags"},"reason":{"type":"string","title":"Reason","default":""}},"type":"object","required":["signal"],"title":"DetectorBody"},"DeviceBody":{"properties":{"token":{"type":"string","maxLength":300,"minLength":1,"title":"Token"},"platform":{"type":"string","enum":["ios","android"],"title":"Platform"},"app_version":{"type":"string","maxLength":40,"title":"App Version","default":""}},"type":"object","required":["token","platform"],"title":"DeviceBody"},"DeviceDecision":{"properties":{"csrf":{"type":"string","maxLength":200,"title":"Csrf","default":""}},"type":"object","title":"DeviceDecision"},"DiscoverBody":{"properties":{"mcp_url":{"type":"string","title":"Mcp Url","default":""},"name":{"type":"string","title":"Name","default":""},"label":{"type":"string","title":"Label","default":""},"method":{"type":"string","title":"Method","default":"auto"},"allow_duplicate":{"type":"boolean","title":"Allow Duplicate","default":false},"tags":{"anyOf":[{"additionalProperties":true,"type":"object"},{"items":{},"type":"array"},{"type":"null"}],"title":"Tags"}},"type":"object","title":"DiscoverBody"},"DisplayNameBody":{"properties":{"display_name":{"title":"Display Name"}},"type":"object","title":"DisplayNameBody"},"DsarBody":{"properties":{"email":{"type":"string","maxLength":200,"title":"Email","default":""},"name":{"type":"string","maxLength":200,"title":"Name","default":""},"external_id":{"type":"string","maxLength":200,"title":"External Id","default":""},"upn":{"type":"string","maxLength":200,"title":"Upn","default":""},"reason":{"type":"string","maxLength":500,"title":"Reason","default":""},"stores":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Stores"},"mode":{"type":"string","enum":["redact","delete"],"title":"Mode","default":"redact"},"export":{"type":"boolean","title":"Export","default":false}},"additionalProperties":false,"type":"object","title":"DsarBody"},"EgressPolicyBody":{"properties":{"policy":{"additionalProperties":true,"type":"object","title":"Policy"},"reason":{"type":"string","maxLength":500,"title":"Reason","default":""}},"additionalProperties":false,"type":"object","required":["policy"],"title":"EgressPolicyBody","description":"Fields to change (egress.DEFAULT_POLICY names them; the rest keep\ntheir values), and the reason a change that loosens the policy needs."},"EgressTestBody":{"properties":{"url":{"type":"string","maxLength":2048,"title":"Url"},"agent":{"type":"string","maxLength":128,"title":"Agent","default":""},"server":{"type":"string","maxLength":128,"title":"Server","default":""},"addresses":{"items":{"type":"string"},"type":"array","maxItems":16,"title":"Addresses"},"policy":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Policy"}},"additionalProperties":false,"type":"object","required":["url"],"title":"EgressTestBody","description":"A destination to judge, who is asking, and optionally a draft policy\n(merged over the stored one) to judge it by."},"EmailDoorBody":{"properties":{"enabled":{"type":"boolean","title":"Enabled","default":true},"address":{"type":"string","maxLength":320,"title":"Address","default":""},"allowed_senders":{"items":{"type":"string"},"type":"array","title":"Allowed Senders"},"require_authenticated":{"type":"boolean","title":"Require Authenticated","default":true},"authserv_id":{"type":"string","maxLength":253,"title":"Authserv Id","default":""},"signing_secret_ref":{"type":"string","maxLength":128,"title":"Signing Secret Ref","default":""},"display_name":{"type":"string","maxLength":64,"title":"Display Name","default":""}},"type":"object","title":"EmailDoorBody"},"EmbeddingCutoverBody":{"properties":{"tolerance":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Tolerance"}},"type":"object","title":"EmbeddingCutoverBody"},"EmbeddingFinalizeBody":{"properties":{"early":{"type":"boolean","title":"Early","default":false}},"type":"object","title":"EmbeddingFinalizeBody"},"EmbeddingMigrationBody":{"properties":{"collection":{"type":"string","maxLength":200,"minLength":1,"title":"Collection"},"backend":{"type":"string","maxLength":20,"minLength":1,"title":"Backend"},"model":{"type":"string","maxLength":200,"title":"Model","default":""},"dim":{"type":"integer","maximum":8192.0,"minimum":8.0,"title":"Dim"}},"type":"object","required":["collection","backend","dim"],"title":"EmbeddingMigrationBody"},"EraseBody":{"properties":{"email":{"type":"string","maxLength":200,"title":"Email","default":""},"name":{"type":"string","maxLength":200,"title":"Name","default":""},"external_id":{"type":"string","maxLength":200,"title":"External Id","default":""},"upn":{"type":"string","maxLength":200,"title":"Upn","default":""},"reason":{"type":"string","maxLength":500,"title":"Reason","default":""},"stores":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Stores"},"mode":{"type":"string","enum":["redact","delete"],"title":"Mode","default":"redact"}},"additionalProperties":false,"type":"object","title":"EraseBody"},"ErasureDecisionBody":{"properties":{"reason":{"type":"string","maxLength":500,"title":"Reason","default":""}},"additionalProperties":false,"type":"object","title":"ErasureDecisionBody"},"EtagReasonBody":{"properties":{"reason":{"type":"string","maxLength":500,"title":"Reason","default":""},"etag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Etag"}},"additionalProperties":false,"type":"object","title":"EtagReasonBody","description":"A guardrail or set DELETE's optional body: the reason a weakening\ndelete needs, and ADP's etag — the If-Match of a client that sends its\nprecondition in the body (_body_if_match)."},"EvalBody":{"properties":{"sample":{"type":"integer","maximum":200.0,"minimum":5.0,"title":"Sample","default":30}},"type":"object","title":"EvalBody"},"EvalCaseBody":{"properties":{"conversation_id":{"type":"string","maxLength":128,"title":"Conversation Id"},"invocation":{"type":"integer","maximum":10000.0,"minimum":0.0,"title":"Invocation","default":0},"reference":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Reference"},"expect":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Expect"}},"additionalProperties":false,"type":"object","required":["conversation_id"],"title":"EvalCaseBody"},"EvalDatasetBody":{"properties":{"name":{"type":"string","maxLength":63,"title":"Name"},"kind":{"type":"string","maxLength":16,"title":"Kind"},"items":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Items"},"jsonl":{"anyOf":[{"type":"string","maxLength":16777216},{"type":"null"}],"title":"Jsonl"},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description"},"append":{"type":"boolean","title":"Append","default":false}},"additionalProperties":false,"type":"object","required":["name","kind"],"title":"EvalDatasetBody"},"EvalGenerateBody":{"properties":{"name":{"type":"string","maxLength":63,"title":"Name","default":""},"sources":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":8},{"type":"null"}],"title":"Sources"},"seed":{"type":"integer","title":"Seed","default":7},"variants":{"type":"boolean","title":"Variants","default":true},"include_writes":{"type":"boolean","title":"Include Writes","default":false},"dry_run":{"type":"boolean","title":"Dry Run","default":false},"overwrite":{"type":"boolean","title":"Overwrite","default":false}},"additionalProperties":false,"type":"object","title":"EvalGenerateBody"},"EvalOfflineRunBody":{"properties":{"dataset":{"type":"string","maxLength":63,"title":"Dataset"},"version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Version"},"agent":{"type":"string","maxLength":240,"title":"Agent","default":""},"split":{"type":"string","maxLength":16,"title":"Split","default":""},"evaluators":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Evaluators"},"baseline":{"type":"string","maxLength":64,"title":"Baseline","default":""},"allowed_drop":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Allowed Drop"},"allowed_drops":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Allowed Drops"},"variant":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Variant"}},"additionalProperties":false,"type":"object","required":["dataset"],"title":"EvalOfflineRunBody"},"EvalRunBody":{"properties":{"conversation_ids":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Conversation Ids"},"evaluators":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Evaluators"},"reference":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Reference"},"references":{"anyOf":[{"additionalProperties":{"additionalProperties":true,"type":"object"},"type":"object"},{"type":"null"}],"title":"References"},"scope":{"type":"string","maxLength":16,"title":"Scope","default":"conversation"}},"additionalProperties":false,"type":"object","required":["conversation_ids"],"title":"EvalRunBody"},"EvalSplitBody":{"properties":{"seed":{"type":"integer","title":"Seed"},"holdout":{"type":"number","exclusiveMaximum":1.0,"exclusiveMinimum":0.0,"title":"Holdout","default":0.2},"version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Version"}},"additionalProperties":false,"type":"object","required":["seed"],"title":"EvalSplitBody"},"EvalTicketsBody":{"properties":{"limit":{"type":"integer","maximum":5000.0,"minimum":1.0,"title":"Limit","default":500},"replace":{"type":"boolean","title":"Replace","default":false}},"additionalProperties":false,"type":"object","title":"EvalTicketsBody"},"EvaluatorBody":{"properties":{"type":{"type":"string","maxLength":16,"title":"Type","default":"builtin"},"builtin":{"type":"string","maxLength":64,"title":"Builtin","default":""},"description":{"type":"string","maxLength":500,"title":"Description","default":""},"agent":{"type":"string","maxLength":200,"title":"Agent","default":""},"params":{"additionalProperties":true,"type":"object","title":"Params"},"enabled":{"type":"boolean","title":"Enabled","default":true}},"additionalProperties":false,"type":"object","title":"EvaluatorBody"},"FeedbackBody":{"properties":{"helpful":{"type":"boolean","title":"Helpful","default":true},"answer_id":{"type":"string","maxLength":64,"title":"Answer Id","default":""}},"type":"object","title":"FeedbackBody"},"FinAttachBody":{"properties":{"server":{"type":"string","maxLength":200,"minLength":1,"title":"Server"}},"additionalProperties":false,"type":"object","required":["server"],"title":"FinAttachBody"},"FinToleranceBody":{"properties":{"pct":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Pct"},"amount":{"anyOf":[{"type":"number","maximum":1000000000.0,"minimum":0.0},{"type":"null"}],"title":"Amount"}},"additionalProperties":false,"type":"object","title":"FinToleranceBody"},"FinderBody":{"properties":{"session":{"type":"string","title":"Session","default":""},"answers":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Answers"}},"type":"object","title":"FinderBody"},"FiringTriageBody":{"properties":{"status":{"type":"string","maxLength":32,"title":"Status"},"reason":{"type":"string","maxLength":2000,"title":"Reason","default":""}},"additionalProperties":false,"type":"object","required":["status"],"title":"FiringTriageBody"},"FrameworkToolsBody":{"properties":{"data_policies":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Data Policies"},"agent_writes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Writes"},"tool_postures":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Tool Postures"},"posture_rules":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Posture Rules"},"unlisted_tools":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unlisted Tools"},"reason":{"type":"string","maxLength":1000,"title":"Reason","default":""}},"additionalProperties":false,"type":"object","title":"FrameworkToolsBody"},"GapDismissBody":{"properties":{"ids":{"items":{"type":"string"},"type":"array","maxItems":1000,"title":"Ids"}},"type":"object","title":"GapDismissBody"},"GatewayAgentBody":{"properties":{"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"about":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"About"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt"},"runtime":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Runtime"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"exchange_only":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Exchange Only"},"uid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uid"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"managed":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Managed"},"update_mask":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Update Mask"},"invoke_access":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Invoke Access"}},"type":"object","title":"GatewayAgentBody"},"GatewayChatBody":{"properties":{"model":{"type":"string","title":"Model","default":""},"messages":{"items":{"$ref":"#/components/schemas/GatewayMessage"},"type":"array","title":"Messages"},"max_tokens":{"type":"integer","maximum":32000.0,"minimum":1.0,"title":"Max Tokens","default":700},"tools":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Tools"},"tool_choice":{"anyOf":[{"type":"string"},{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Tool Choice"},"stream":{"type":"boolean","title":"Stream","default":false},"stream_options":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Stream Options"},"metadata":{"additionalProperties":{"type":"string"},"type":"object","title":"Metadata"}},"type":"object","title":"GatewayChatBody","description":"A deliberately small slice of the OpenAI chat-completions request.\n\nSmall on purpose: the fields that change what the model is ASKED are\nhonoured, and the ones that would let a caller route around governance —\na different base URL, a different provider key — do not exist here.\n\n`model` is ACCEPTED AND IGNORED. Every OpenAI client sends it, so rejecting\nit would fail the two-line onboarding this endpoint exists for; but honouring\nit would let an agent pick its own model on the operator's provider and\ninvoice, which is exactly the binding the profile is there to decide. The\nmodel that actually ran comes back in the response, so a caller is never\nleft guessing which one answered. At a provider's own gateway URL it is\nhonoured only where the call runs on the caller's own credential, or on\na provider the agent reaches through gateway_providers and whose\nallow-list lists it — never over the binding on the provider the agent\nis bound to (gateway_provider_chat_completions)."},"GatewayDecideBody":{"properties":{"phase":{"type":"string","enum":["pre_tool","post_tool","retrieval","memory_write","handoff"],"title":"Phase"},"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"arguments":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Arguments"},"text":{"anyOf":[{"type":"string","maxLength":200000},{"type":"null"}],"title":"Text"},"result":{"title":"Result"},"writes":{"type":"boolean","title":"Writes","default":false},"approval_id":{"type":"string","maxLength":64,"title":"Approval Id","default":""}},"additionalProperties":false,"type":"object","required":["phase","name"],"title":"GatewayDecideBody","description":"One question to the decision API (decide.py): what a framework is\nabout to do, or what just came back to it. `arguments` are a call's\n(pre_tool, memory_write's structured form); `text` is what a phase\nreads as text — a tool's answer, retrieved passages, the memory to keep,\nwhat is handed over; `result` a tool's structured answer, for the data\npolicies' response rules. `writes` is the framework's own word that a\ntool of its own changes something: it can only tighten (decide.posture).\n`approval_id` spends a released approval (approvals.redeem)."},"GatewayMessage":{"properties":{"role":{"type":"string","enum":["system","developer","user","assistant","tool"],"title":"Role","default":"user"},"content":{"anyOf":[{"type":"string"},{"items":{},"type":"array"},{"type":"null"}],"title":"Content","default":""},"tool_calls":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Tool Calls"},"tool_call_id":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Tool Call Id"},"name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Name"}},"type":"object","title":"GatewayMessage"},"GrantDecisionBody":{"properties":{"reason":{"type":"string","maxLength":500,"title":"Reason","default":""},"acknowledge_governs":{"type":"boolean","title":"Acknowledge Governs","default":false}},"additionalProperties":false,"type":"object","title":"GrantDecisionBody"},"GrantExtendBody":{"properties":{"expires_at":{"type":"string","maxLength":64,"title":"Expires At"},"justification":{"type":"string","maxLength":1000,"title":"Justification"}},"additionalProperties":false,"type":"object","required":["expires_at","justification"],"title":"GrantExtendBody"},"GrantPermitBody":{"properties":{"action":{"type":"string","maxLength":32,"title":"Action"},"resource":{"type":"string","maxLength":200,"title":"Resource","default":""}},"additionalProperties":false,"type":"object","required":["action"],"title":"GrantPermitBody"},"GrantRequestBody":{"properties":{"agent":{"type":"string","maxLength":200,"title":"Agent"},"permits":{"items":{"$ref":"#/components/schemas/GrantPermitBody"},"type":"array","maxItems":20,"title":"Permits"},"sponsor":{"type":"string","maxLength":200,"title":"Sponsor"},"justification":{"type":"string","maxLength":1000,"title":"Justification"},"expires_at":{"type":"string","maxLength":64,"title":"Expires At"},"not_before":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Not Before"}},"additionalProperties":false,"type":"object","required":["agent","permits","sponsor","justification","expires_at"],"title":"GrantRequestBody"},"GuardrailBindingBody":{"properties":{"mode":{"type":"string","title":"Mode","default":"inherit"},"policies":{"items":{"type":"string"},"type":"array","title":"Policies"},"display_name":{"type":"string","title":"Display Name","default":""},"about":{"type":"string","title":"About","default":""},"description":{"type":"string","title":"Description","default":""},"tags":{"title":"Tags"},"reason":{"type":"string","title":"Reason","default":""}},"additionalProperties":true,"type":"object","title":"GuardrailBindingBody"},"GuardrailBody":{"properties":{"kind":{"type":"string","title":"Kind"},"direction":{"type":"string","title":"Direction","default":""},"agents":{"items":{"type":"string"},"type":"array","title":"Agents"},"terms":{"items":{"type":"string"},"type":"array","title":"Terms"},"topics":{"items":{},"type":"array","title":"Topics"},"max_chars":{"type":"integer","title":"Max Chars","default":0},"threshold":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Threshold"},"relevance_threshold":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Relevance Threshold"},"action":{"type":"string","title":"Action","default":""},"entities":{"items":{"type":"string"},"type":"array","title":"Entities"},"patterns":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Patterns"},"managed_lists":{"items":{"type":"string"},"type":"array","title":"Managed Lists"},"message":{"type":"string","title":"Message","default":""},"blocked_input_message":{"type":"string","title":"Blocked Input Message","default":""},"blocked_output_message":{"type":"string","title":"Blocked Output Message","default":""},"enabled":{"type":"boolean","title":"Enabled","default":true},"locked":{"type":"boolean","title":"Locked","default":false},"display_name":{"type":"string","title":"Display Name","default":""},"about":{"type":"string","title":"About","default":""},"description":{"type":"string","title":"Description","default":""},"tags":{"title":"Tags"},"scope":{"title":"Scope"},"exclude_agents":{"title":"Exclude Agents"},"mcp_servers":{"title":"Mcp Servers"},"tools":{"title":"Tools"},"mode":{"type":"string","title":"Mode","default":""},"fail_mode":{"type":"string","title":"Fail Mode","default":"closed"},"reason":{"type":"string","title":"Reason","default":""}},"additionalProperties":true,"type":"object","required":["kind"],"title":"GuardrailBody"},"GuardrailSetBody":{"properties":{"members":{"items":{"type":"string"},"type":"array","title":"Members"},"extends":{"type":"string","title":"Extends","default":""},"scope":{"title":"Scope"},"display_name":{"type":"string","title":"Display Name","default":""},"about":{"type":"string","title":"About","default":""},"description":{"type":"string","title":"Description","default":""},"tags":{"title":"Tags"},"reason":{"type":"string","title":"Reason","default":""}},"additionalProperties":true,"type":"object","title":"GuardrailSetBody"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HoldBody":{"properties":{"scope":{"type":"string","maxLength":32,"title":"Scope"},"target":{"type":"string","maxLength":200,"title":"Target"},"reason":{"type":"string","maxLength":500,"title":"Reason"}},"additionalProperties":false,"type":"object","required":["scope","target","reason"],"title":"HoldBody"},"HoldReleaseBody":{"properties":{"reason":{"type":"string","maxLength":500,"title":"Reason","default":""}},"additionalProperties":false,"type":"object","title":"HoldReleaseBody"},"HrHandoffBody":{"properties":{"mode":{"type":"string","maxLength":20,"title":"Mode"},"server":{"type":"string","maxLength":200,"title":"Server","default":""},"email":{"type":"string","maxLength":320,"title":"Email","default":""},"project_key":{"type":"string","maxLength":20,"title":"Project Key","default":""}},"additionalProperties":false,"type":"object","required":["mode"],"title":"HrHandoffBody"},"HrLibraryBody":{"properties":{"kb":{"type":"string","maxLength":64,"title":"Kb","default":""},"link_template":{"type":"string","maxLength":500,"title":"Link Template","default":""}},"additionalProperties":false,"type":"object","title":"HrLibraryBody"},"IdPTestBody":{"properties":{"token":{"type":"string","title":"Token","default":""}},"type":"object","title":"IdPTestBody"},"IdentityMapBody":{"properties":{"principal_kind":{"type":"string","title":"Principal Kind","default":"user"},"principal":{"type":"string","title":"Principal","default":""},"namespace":{"type":"string","title":"Namespace","default":""},"identity_kind":{"type":"string","title":"Identity Kind","default":"principal"},"identity":{"type":"string","title":"Identity","default":""},"display":{"type":"string","maxLength":200,"title":"Display","default":""}},"type":"object","title":"IdentityMapBody"},"IdentityRefreshBody":{"properties":{"source_id":{"type":"string","title":"Source Id","default":""}},"type":"object","title":"IdentityRefreshBody"},"InboundClientBody":{"properties":{"label":{"type":"string","maxLength":64,"title":"Label","default":""},"about":{"type":"string","maxLength":200,"title":"About","default":""},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"redirect_uris":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Redirect Uris"},"tags":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"object"},{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"software_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Software Id"},"roles":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Roles"},"allowed_resources":{"title":"Allowed Resources"},"grant_types":{"title":"Grant Types"},"token_endpoint_auth_method":{"title":"Token Endpoint Auth Method"},"pkce_required":{"title":"Pkce Required"},"logo_uri":{"title":"Logo Uri"},"source_audiences":{"title":"Source Audiences"}},"type":"object","title":"InboundClientBody"},"InboundClientCreate":{"properties":{"label":{"type":"string","maxLength":64,"title":"Label","default":""},"about":{"type":"string","maxLength":200,"title":"About","default":""},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"redirect_uris":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Redirect Uris"},"tags":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"object"},{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"software_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Software Id"},"roles":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Roles"},"allowed_resources":{"title":"Allowed Resources"},"grant_types":{"title":"Grant Types"},"token_endpoint_auth_method":{"title":"Token Endpoint Auth Method"},"pkce_required":{"title":"Pkce Required"},"logo_uri":{"title":"Logo Uri"},"source_audiences":{"title":"Source Audiences"},"client_id":{"type":"string","title":"Client Id"}},"type":"object","required":["client_id"],"title":"InboundClientCreate"},"InboundClientPatch":{"properties":{"label":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Label"},"about":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"About"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"scopes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Scopes"},"redirect_uris":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Redirect Uris"},"tags":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"object"},{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"software_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Software Id"},"roles":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Roles"},"allowed_resources":{"title":"Allowed Resources"},"grant_types":{"title":"Grant Types"},"token_endpoint_auth_method":{"title":"Token Endpoint Auth Method"},"pkce_required":{"title":"Pkce Required"},"logo_uri":{"title":"Logo Uri"},"source_audiences":{"title":"Source Audiences"},"update_mask":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Update Mask"}},"type":"object","title":"InboundClientPatch","description":"PATCH body: every field optional, plus ADP's update_mask. Without a\nmask, the fields actually sent are the mask (exclude_unset), so omitting a\nfield never resets it."},"InboxAckBody":{"properties":{"source":{"type":"string","title":"Source"},"id":{"type":"string","title":"Id"}},"type":"object","required":["source","id"],"title":"InboxAckBody"},"IncidentHoldBody":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"reason":{"type":"string","title":"Reason","default":""},"case_id":{"type":"string","maxLength":64,"title":"Case Id","default":""}},"type":"object","required":["enabled"],"title":"IncidentHoldBody"},"InitialTokenBody":{"properties":{"label":{"type":"string","maxLength":80,"title":"Label","default":""},"ttl_hours":{"type":"number","title":"Ttl Hours","default":72.0}},"type":"object","title":"InitialTokenBody"},"InstanceKeyBody":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["enabled"],"title":"InstanceKeyBody"},"IntakeBody":{"properties":{"title":{"type":"string","maxLength":1000,"title":"Title","default":""},"description":{"type":"string","maxLength":50000,"title":"Description","default":""},"requester":{"type":"string","maxLength":256,"title":"Requester","default":""},"external_id":{"type":"string","maxLength":256,"title":"External Id","default":""},"channel":{"type":"string","maxLength":32,"title":"Channel","default":"intake"},"answer_id":{"type":"string","maxLength":64,"title":"Answer Id","default":""}},"type":"object","title":"IntakeBody"},"IntegrationBody":{"properties":{"name":{"type":"string","title":"Name","default":""},"kind":{"type":"string","title":"Kind","default":"webhook"},"url":{"type":"string","title":"Url","default":""},"events":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Events"},"min_priority":{"type":"string","title":"Min Priority","default":"P3"},"enabled":{"type":"boolean","title":"Enabled","default":true},"format":{"type":"string","title":"Format","default":"native"},"filters":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Filters"},"token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"},"token_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token Ref"},"recipients":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Recipients"}},"type":"object","title":"IntegrationBody"},"IntegrationUpdateBody":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"events":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Events"},"min_priority":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Min Priority"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"filters":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Filters"},"token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"},"token_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token Ref"},"recipients":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Recipients"}},"type":"object","title":"IntegrationUpdateBody"},"InventoryPushBody":{"properties":{"format":{"type":"string","title":"Format","default":"cyclonedx"},"class_map":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Class Map"}},"additionalProperties":false,"type":"object","title":"InventoryPushBody"},"KBArticlePatch":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Title"},"problem":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Problem"},"resolution":{"anyOf":[{"type":"string","maxLength":8000},{"type":"null"}],"title":"Resolution"},"reason":{"type":"string","maxLength":500,"title":"Reason","default":""},"expected":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"object"},{"type":"null"}],"title":"Expected"}},"additionalProperties":false,"type":"object","title":"KBArticlePatch"},"KBRejectBody":{"properties":{"reason":{"type":"string","maxLength":500,"title":"Reason","default":""}},"additionalProperties":false,"type":"object","title":"KBRejectBody"},"KillSwitchBody":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"reason":{"type":"string","title":"Reason","default":""},"case_id":{"type":"string","maxLength":64,"title":"Case Id","default":""}},"type":"object","required":["enabled"],"title":"KillSwitchBody"},"LoginBody":{"properties":{"username":{"type":"string","title":"Username","default":""},"password":{"type":"string","title":"Password","default":""}},"type":"object","title":"LoginBody"},"MCPCallBody":{"properties":{"tool":{"type":"string","maxLength":200,"minLength":1,"title":"Tool"},"arguments":{"additionalProperties":true,"type":"object","title":"Arguments"},"inspect":{"type":"boolean","title":"Inspect","default":false}},"type":"object","required":["tool"],"title":"MCPCallBody"},"MCPPauseBody":{"properties":{"reason":{"type":"string","title":"Reason","default":""}},"type":"object","title":"MCPPauseBody"},"MCPServerBody":{"properties":{"transport":{"type":"string","title":"Transport","default":"stdio"},"command":{"type":"string","title":"Command","default":""},"args":{"items":{"type":"string"},"type":"array","title":"Args"},"env":{"additionalProperties":{"type":"string"},"type":"object","title":"Env"},"url":{"type":"string","title":"Url","default":""},"base_url":{"type":"string","title":"Base Url","default":""},"max_results_per_page":{"type":"integer","title":"Max Results Per Page","default":0},"incident_state_field":{"type":"string","title":"Incident State Field","default":""},"incident_state_requirements":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object","title":"Incident State Requirements"},"allow_rich_journal":{"type":"boolean","title":"Allow Rich Journal","default":false},"flow_start_path":{"type":"string","title":"Flow Start Path","default":""},"aws_region":{"type":"string","title":"Aws Region","default":""},"aws_credential_source":{"type":"string","title":"Aws Credential Source","default":""},"account_id":{"type":"string","title":"Account Id","default":""},"api_version":{"type":"string","title":"Api Version","default":""},"environment":{"type":"string","title":"Environment","default":""},"bucket":{"type":"string","title":"Bucket","default":""},"key_prefix":{"type":"string","title":"Key Prefix","default":""},"skip_cert_verify":{"type":"boolean","title":"Skip Cert Verify","default":false},"projections":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Projections"},"hierarchies":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Hierarchies"},"dynamic_tools":{"type":"boolean","title":"Dynamic Tools","default":false},"exposed_tools":{"items":{"type":"string"},"type":"array","title":"Exposed Tools"},"code_mode":{"type":"boolean","title":"Code Mode","default":false},"encoding":{"type":"string","title":"Encoding","default":""},"read_only":{"type":"boolean","title":"Read Only","default":false},"agent_writes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Writes"},"tool_postures":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Tool Postures"},"posture_rules":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Posture Rules"},"tool_visibility":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Tool Visibility"},"database":{"type":"string","title":"Database","default":""},"ssl_enabled":{"type":"boolean","title":"Ssl Enabled","default":false},"assume_role_arn":{"type":"string","title":"Assume Role Arn","default":""},"external_id":{"type":"string","title":"External Id","default":""},"role_session_name":{"type":"string","title":"Role Session Name","default":""},"urls":{"items":{"type":"string"},"type":"array","title":"Urls"},"max_in_flight":{"type":"integer","title":"Max In Flight","default":0},"tenant":{"type":"string","title":"Tenant","default":""},"capabilities":{"items":{"type":"string"},"type":"array","title":"Capabilities"},"subdomain":{"type":"string","title":"Subdomain","default":""},"onboarding_table":{"type":"string","title":"Onboarding Table","default":""},"buddy_field":{"type":"string","title":"Buddy Field","default":""},"finance_fields":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Finance Fields"},"on_behalf_of_user_id":{"type":"string","title":"On Behalf Of User Id","default":""},"cluster_identifier":{"type":"string","title":"Cluster Identifier","default":""},"workgroup_name":{"type":"string","title":"Workgroup Name","default":""},"secret_arn":{"type":"string","title":"Secret Arn","default":""},"db_user":{"type":"string","title":"Db User","default":""},"spec_path":{"type":"string","title":"Spec Path","default":""},"service_path":{"type":"string","title":"Service Path","default":""},"spec":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"string"},{"type":"null"}],"title":"Spec"},"operations":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Operations"},"sap_client":{"type":"string","title":"Sap Client","default":""},"maintenance_plant":{"type":"string","title":"Maintenance Plant","default":""},"main_work_center":{"type":"string","title":"Main Work Center","default":""},"purchasing_group":{"type":"string","title":"Purchasing Group","default":""},"digital_access_ack":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Digital Access Ack"},"self_service":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Self Service"},"max_calls_per_minute":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Calls Per Minute"},"sap_areas":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Sap Areas"},"language":{"type":"string","title":"Language","default":""},"account":{"type":"string","title":"Account","default":""},"company":{"type":"string","title":"Company","default":""},"allow_writes":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Writes"},"allow_customer_replies":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Customer Replies"},"token_type":{"type":"string","title":"Token Type","default":""},"identity":{"type":"string","title":"Identity","default":""},"read_groups":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Read Groups"},"dispatch_groups":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Dispatch Groups"},"product":{"type":"string","title":"Product","default":""},"token_url":{"type":"string","title":"Token Url","default":""},"apis":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Apis"},"packages":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Packages"},"sap_operations":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Sap Operations"},"write_apis":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Write Apis"},"tool_surface":{"type":"string","title":"Tool Surface","default":""},"fixed_headers":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Fixed Headers"},"sap_system":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Sap System"},"sap_route":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sap Route"},"connection":{"type":"string","title":"Connection","default":""},"token_env":{"type":"string","title":"Token Env","default":""},"required_scopes":{"items":{"type":"string"},"type":"array","title":"Required Scopes"},"auth":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Auth"},"identity_forwarding":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Identity Forwarding"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"about":{"type":"string","title":"About","default":""},"classification":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Classification"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"requires_verified_requester":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Requires Verified Requester"},"gateway_expose":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Gateway Expose"},"allow_unauthenticated":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Unauthenticated"},"acknowledge_risks":{"type":"boolean","title":"Acknowledge Risks","default":false},"reason":{"type":"string","title":"Reason","default":""}},"type":"object","title":"MCPServerBody"},"MCPServerCreateBody":{"properties":{"transport":{"type":"string","title":"Transport","default":"stdio"},"command":{"type":"string","title":"Command","default":""},"args":{"items":{"type":"string"},"type":"array","title":"Args"},"env":{"additionalProperties":{"type":"string"},"type":"object","title":"Env"},"url":{"type":"string","title":"Url","default":""},"base_url":{"type":"string","title":"Base Url","default":""},"max_results_per_page":{"type":"integer","title":"Max Results Per Page","default":0},"incident_state_field":{"type":"string","title":"Incident State Field","default":""},"incident_state_requirements":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object","title":"Incident State Requirements"},"allow_rich_journal":{"type":"boolean","title":"Allow Rich Journal","default":false},"flow_start_path":{"type":"string","title":"Flow Start Path","default":""},"aws_region":{"type":"string","title":"Aws Region","default":""},"aws_credential_source":{"type":"string","title":"Aws Credential Source","default":""},"account_id":{"type":"string","title":"Account Id","default":""},"api_version":{"type":"string","title":"Api Version","default":""},"environment":{"type":"string","title":"Environment","default":""},"bucket":{"type":"string","title":"Bucket","default":""},"key_prefix":{"type":"string","title":"Key Prefix","default":""},"skip_cert_verify":{"type":"boolean","title":"Skip Cert Verify","default":false},"projections":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Projections"},"hierarchies":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Hierarchies"},"dynamic_tools":{"type":"boolean","title":"Dynamic Tools","default":false},"exposed_tools":{"items":{"type":"string"},"type":"array","title":"Exposed Tools"},"code_mode":{"type":"boolean","title":"Code Mode","default":false},"encoding":{"type":"string","title":"Encoding","default":""},"read_only":{"type":"boolean","title":"Read Only","default":false},"agent_writes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Writes"},"tool_postures":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Tool Postures"},"posture_rules":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Posture Rules"},"tool_visibility":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Tool Visibility"},"database":{"type":"string","title":"Database","default":""},"ssl_enabled":{"type":"boolean","title":"Ssl Enabled","default":false},"assume_role_arn":{"type":"string","title":"Assume Role Arn","default":""},"external_id":{"type":"string","title":"External Id","default":""},"role_session_name":{"type":"string","title":"Role Session Name","default":""},"urls":{"items":{"type":"string"},"type":"array","title":"Urls"},"max_in_flight":{"type":"integer","title":"Max In Flight","default":0},"tenant":{"type":"string","title":"Tenant","default":""},"capabilities":{"items":{"type":"string"},"type":"array","title":"Capabilities"},"subdomain":{"type":"string","title":"Subdomain","default":""},"onboarding_table":{"type":"string","title":"Onboarding Table","default":""},"buddy_field":{"type":"string","title":"Buddy Field","default":""},"finance_fields":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Finance Fields"},"on_behalf_of_user_id":{"type":"string","title":"On Behalf Of User Id","default":""},"cluster_identifier":{"type":"string","title":"Cluster Identifier","default":""},"workgroup_name":{"type":"string","title":"Workgroup Name","default":""},"secret_arn":{"type":"string","title":"Secret Arn","default":""},"db_user":{"type":"string","title":"Db User","default":""},"spec_path":{"type":"string","title":"Spec Path","default":""},"service_path":{"type":"string","title":"Service Path","default":""},"spec":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"string"},{"type":"null"}],"title":"Spec"},"operations":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Operations"},"sap_client":{"type":"string","title":"Sap Client","default":""},"maintenance_plant":{"type":"string","title":"Maintenance Plant","default":""},"main_work_center":{"type":"string","title":"Main Work Center","default":""},"purchasing_group":{"type":"string","title":"Purchasing Group","default":""},"digital_access_ack":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Digital Access Ack"},"self_service":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Self Service"},"max_calls_per_minute":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Calls Per Minute"},"sap_areas":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Sap Areas"},"language":{"type":"string","title":"Language","default":""},"account":{"type":"string","title":"Account","default":""},"company":{"type":"string","title":"Company","default":""},"allow_writes":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Writes"},"allow_customer_replies":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Customer Replies"},"token_type":{"type":"string","title":"Token Type","default":""},"identity":{"type":"string","title":"Identity","default":""},"read_groups":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Read Groups"},"dispatch_groups":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Dispatch Groups"},"product":{"type":"string","title":"Product","default":""},"token_url":{"type":"string","title":"Token Url","default":""},"apis":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Apis"},"packages":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Packages"},"sap_operations":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Sap Operations"},"write_apis":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Write Apis"},"tool_surface":{"type":"string","title":"Tool Surface","default":""},"fixed_headers":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Fixed Headers"},"sap_system":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Sap System"},"sap_route":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sap Route"},"connection":{"type":"string","title":"Connection","default":""},"token_env":{"type":"string","title":"Token Env","default":""},"required_scopes":{"items":{"type":"string"},"type":"array","title":"Required Scopes"},"auth":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Auth"},"identity_forwarding":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Identity Forwarding"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"about":{"type":"string","title":"About","default":""},"classification":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Classification"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"requires_verified_requester":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Requires Verified Requester"},"gateway_expose":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Gateway Expose"},"allow_unauthenticated":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Unauthenticated"},"acknowledge_risks":{"type":"boolean","title":"Acknowledge Risks","default":false},"reason":{"type":"string","title":"Reason","default":""},"name":{"type":"string","maxLength":63,"minLength":1,"title":"Name"}},"type":"object","required":["name"],"title":"MCPServerCreateBody"},"MCPServerPatchBody":{"properties":{"update_mask":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"}],"title":"Update Mask"},"server":{"additionalProperties":true,"type":"object","title":"Server"},"reason":{"type":"string","title":"Reason","default":""},"acknowledge_risks":{"type":"boolean","title":"Acknowledge Risks","default":false}},"type":"object","required":["update_mask"],"title":"MCPServerPatchBody"},"McpInboundPoliciesBody":{"properties":{"policies":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Policies"},"reason":{"type":"string","title":"Reason","default":""}},"type":"object","title":"McpInboundPoliciesBody"},"McpResourceReadBody":{"properties":{"uri":{"type":"string","maxLength":2048,"title":"Uri"}},"type":"object","required":["uri"],"title":"McpResourceReadBody"},"MemoryIngestBody":{"properties":{"agent":{"type":"string","maxLength":80,"minLength":1,"title":"Agent"},"scope":{"type":"string","title":"Scope","description":"person, agent or tenant"},"text":{"type":"string","maxLength":600,"minLength":1,"title":"Text"},"subject":{"type":"string","maxLength":120,"title":"Subject","default":""},"category":{"type":"string","title":"Category","default":"fact"},"trusted":{"type":"boolean","title":"Trusted","default":false}},"type":"object","required":["agent","scope","text"],"title":"MemoryIngestBody"},"MemoryPutBody":{"properties":{"value":{"title":"Value"},"kind":{"type":"string","title":"Kind","default":"short"},"ttl_hours":{"anyOf":[{"type":"number","maximum":8760.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Ttl Hours"}},"type":"object","title":"MemoryPutBody"},"MemoryRecallPreviewBody":{"properties":{"agent":{"type":"string","maxLength":80,"minLength":1,"title":"Agent"},"query":{"type":"string","maxLength":2000,"minLength":1,"title":"Query"},"subject":{"type":"string","maxLength":120,"title":"Subject","default":""}},"type":"object","required":["agent","query"],"title":"MemoryRecallPreviewBody"},"MemoryReviewBody":{"properties":{"reason":{"type":"string","maxLength":200,"title":"Reason","default":""}},"type":"object","title":"MemoryReviewBody"},"MonitorLabelBody":{"properties":{"id":{"type":"string","maxLength":64,"minLength":1,"title":"Id"},"label":{"type":"string","maxLength":32,"title":"Label"},"note":{"type":"string","maxLength":500,"title":"Note","default":""}},"additionalProperties":false,"type":"object","required":["id","label"],"title":"MonitorLabelBody","description":"A review of one monitor row (guardrails.label_monitor)."},"OffboardBody":{"properties":{"reason":{"type":"string","maxLength":500,"title":"Reason","default":""}},"type":"object","title":"OffboardBody"},"OpportunityEvalBody":{"properties":{"name":{"type":"string","maxLength":63,"title":"Name","default":""}},"additionalProperties":false,"type":"object","title":"OpportunityEvalBody"},"PatternFixBody":{"properties":{"kind":{"type":"string","maxLength":16,"title":"Kind"},"agent":{"type":"string","maxLength":128,"title":"Agent","default":""},"instructions":{"anyOf":[{"type":"string","maxLength":64000},{"type":"null"}],"title":"Instructions"},"dataset":{"type":"string","maxLength":63,"title":"Dataset","default":""}},"additionalProperties":false,"type":"object","required":["kind"],"title":"PatternFixBody"},"PatternStatusBody":{"properties":{"status":{"type":"string","maxLength":16,"title":"Status"},"note":{"type":"string","maxLength":500,"title":"Note","default":""}},"additionalProperties":false,"type":"object","required":["status"],"title":"PatternStatusBody"},"PermissionCheckBody":{"properties":{"checks":{"items":{"$ref":"#/components/schemas/PermissionCheckItem"},"type":"array","title":"Checks"},"principal":{"anyOf":[{"$ref":"#/components/schemas/PrincipalRef"},{"type":"null"}]},"context":{"anyOf":[{"$ref":"#/components/schemas/WhatIfContext"},{"type":"null"}]}},"type":"object","title":"PermissionCheckBody"},"PermissionCheckItem":{"properties":{"entity":{"type":"string","title":"Entity"},"verb":{"type":"string","title":"Verb"},"name":{"type":"string","title":"Name","default":""},"op":{"type":"string","title":"Op","default":""},"engage":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Engage"}},"type":"object","required":["entity","verb"],"title":"PermissionCheckItem"},"PersonReviewBody":{"properties":{"reason":{"type":"string","maxLength":500,"title":"Reason","default":""},"hold_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Hold Minutes"}},"additionalProperties":false,"type":"object","title":"PersonReviewBody"},"PersonRiskPolicyBody":{"properties":{"policy":{"additionalProperties":true,"type":"object","title":"Policy"},"reason":{"type":"string","maxLength":500,"title":"Reason","default":""}},"additionalProperties":false,"type":"object","required":["policy"],"title":"PersonRiskPolicyBody","description":"Fields to change (ksdetect.PERSON_DEFAULTS names them; the rest keep\ntheir values), and the reason a change that loosens one needs."},"PlaygroundBody":{"properties":{"message":{"type":"string","title":"Message","default":""},"system":{"type":"string","title":"System","default":""},"session":{"type":"string","title":"Session","default":""},"ticket":{"type":"string","maxLength":64,"title":"Ticket","default":""},"provider":{"type":"string","maxLength":64,"title":"Provider","default":""},"model":{"type":"string","maxLength":200,"title":"Model","default":""},"effort":{"type":"string","maxLength":32,"title":"Effort","default":""},"files":{"items":{"type":"string"},"type":"array","maxItems":8,"title":"Files"}},"type":"object","title":"PlaygroundBody"},"PlaygroundCompareBody":{"properties":{"message":{"type":"string","maxLength":20000,"title":"Message","default":""},"variants":{"items":{"$ref":"#/components/schemas/PlaygroundVariant"},"type":"array","title":"Variants"},"rules":{"items":{"$ref":"#/components/schemas/PlaygroundRule"},"type":"array","maxItems":10,"title":"Rules"},"files":{"items":{"type":"string"},"type":"array","maxItems":8,"title":"Files"}},"additionalProperties":false,"type":"object","title":"PlaygroundCompareBody"},"PlaygroundReplayBody":{"properties":{"conversation":{"type":"string","maxLength":128,"minLength":1,"title":"Conversation"},"turn":{"type":"integer","maximum":500.0,"minimum":0.0,"title":"Turn","default":0},"message":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}],"title":"Message"},"system":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"System"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"}},"additionalProperties":false,"type":"object","required":["conversation"],"title":"PlaygroundReplayBody"},"PlaygroundRule":{"properties":{"kind":{"type":"string","maxLength":32,"title":"Kind","default":""},"value":{"type":"string","maxLength":500,"title":"Value","default":""},"path":{"type":"string","maxLength":200,"title":"Path","default":""},"label":{"type":"string","maxLength":80,"title":"Label","default":""}},"additionalProperties":false,"type":"object","title":"PlaygroundRule","description":"One line of a compare's checklist, scored on every column's reply\n(replyrules: the kinds and what value and path mean to each)."},"PlaygroundSapDecision":{"properties":{"action":{"type":"string","maxLength":16,"title":"Action","default":""},"session":{"type":"string","maxLength":128,"title":"Session","default":""}},"additionalProperties":false,"type":"object","title":"PlaygroundSapDecision"},"PlaygroundSimulateBody":{"properties":{"principal":{"$ref":"#/components/schemas/PrincipalRef"},"context":{"anyOf":[{"$ref":"#/components/schemas/WhatIfContext"},{"type":"null"}]},"message":{"type":"string","maxLength":20000,"title":"Message","default":""}},"additionalProperties":false,"type":"object","required":["principal"],"title":"PlaygroundSimulateBody"},"PlaygroundVariant":{"properties":{"label":{"type":"string","maxLength":40,"title":"Label","default":""},"system":{"type":"string","title":"System","default":""},"model":{"type":"string","title":"Model","default":""}},"additionalProperties":false,"type":"object","title":"PlaygroundVariant","description":"One column of a compare: the system half and the model a run asks\nthe agent with (evalrun.variant holds the rules — the same ones a\ndataset run of a variant is held to).\n\nThe model is the caller's to name, as the gateway's callers name one:\nit is held to the binding provider's allowed_models and to Cedar\n`call_model`. A provider whose allowed_models is EMPTY restricts\nnothing (agentconf.model_refusal), so on one any agents.operate holder\ncan try any model the endpoint serves — an operator who must not reach\nan expensive model is kept off it by an allow-list on the provider or a\ncall_model forbid, the controls every other caller-named model meets."},"PolicyAnalyzeBody":{"properties":{"draft":{"anyOf":[{"$ref":"#/components/schemas/PolicyAnalyzeDraft"},{"type":"null"}]},"override":{"type":"boolean","title":"Override","default":false}},"additionalProperties":false,"type":"object","title":"PolicyAnalyzeBody"},"PolicyAnalyzeDraft":{"properties":{"name":{"type":"string","maxLength":64,"title":"Name","default":""},"body":{"anyOf":[{"type":"string","maxLength":64000},{"type":"null"}],"title":"Body"},"spec":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Spec"},"enabled":{"type":"boolean","title":"Enabled","default":true},"delete":{"type":"boolean","title":"Delete","default":false}},"additionalProperties":false,"type":"object","title":"PolicyAnalyzeDraft","description":"One change to analyse (policy.analyze): a policy saved under `name`\n— new, or replacing the stored one — from Cedar `body` or a builder\n`spec`; or, with `delete`, that policy removed."},"PolicyBody":{"properties":{"principal":{"type":"string","title":"Principal"},"permission":{"type":"string","title":"Permission"},"effect":{"type":"string","title":"Effect","default":"deny"},"about":{"type":"string","maxLength":200,"title":"About","default":""}},"type":"object","required":["principal","permission"],"title":"PolicyBody"},"PolicyTemplateCreateBody":{"properties":{"name":{"type":"string","title":"Name","default":""},"display_name":{"type":"string","title":"Display Name","default":""},"description":{"type":"string","title":"Description","default":""},"cedar_text":{"type":"string","title":"Cedar Text","default":""}},"type":"object","title":"PolicyTemplateCreateBody","description":"POST /api/policy-templates (ADP's CreatePolicyTemplate). uid, version\nand attribution are the server's: not fields here, so sent ones drop."},"PosturesBody":{"properties":{"invoke_default_deny":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Invoke Default Deny"},"strict":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Strict"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","title":"PosturesBody"},"PreflightBody":{"properties":{"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"card":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Card"},"published":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Published"},"recording":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recording"},"runtime":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Runtime"}},"additionalProperties":false,"type":"object","title":"PreflightBody","description":"A draft of the agent as a save would leave it: only what posture\nreads, each optional (absent keeps what is stored). An undeclared field\nis refused rather than ignored — a caller who sent one would otherwise\ntake the answer for a judgement of it."},"PreviewRequester":{"properties":{"id":{"type":"string","maxLength":200,"title":"Id","default":""},"upn":{"type":"string","maxLength":200,"title":"Upn","default":""},"email":{"type":"string","maxLength":200,"title":"Email","default":""},"level":{"type":"string","maxLength":20,"title":"Level","default":"none"}},"type":"object","title":"PreviewRequester"},"PrincipalRef":{"properties":{"kind":{"type":"string","enum":["User","Agent","Client"],"title":"Kind"},"id":{"type":"string","maxLength":128,"minLength":1,"title":"Id"}},"additionalProperties":false,"type":"object","required":["kind","id"],"title":"PrincipalRef","description":"One principal a request asks about, as Cedar names it: a person, an\nagent or an OAuth client. For any route that answers \"what would happen\nif THIS principal did it\" — the permission check's what-if, and the\ndata-policy preview's gate."},"PrivacyRequestBody":{"properties":{"kind":{"type":"string","title":"Kind","default":""},"name":{"type":"string","title":"Name","default":""},"email":{"type":"string","title":"Email","default":""},"relationship":{"type":"string","title":"Relationship","default":""},"details":{"type":"string","title":"Details","default":""},"website":{"type":"string","title":"Website","default":""}},"type":"object","title":"PrivacyRequestBody"},"PrivacyRequestCloseBody":{"properties":{"outcome":{"type":"string","title":"Outcome"},"response":{"type":"string","maxLength":8000,"title":"Response","default":""},"notify":{"type":"boolean","title":"Notify","default":false}},"additionalProperties":false,"type":"object","required":["outcome"],"title":"PrivacyRequestCloseBody"},"PrivacyRequestNoteBody":{"properties":{"note":{"type":"string","maxLength":500,"title":"Note","default":""}},"additionalProperties":false,"type":"object","title":"PrivacyRequestNoteBody"},"PrivacyRequestRunBody":{"properties":{"action":{"type":"string","enum":["search","export","erase"],"title":"Action"},"mode":{"type":"string","enum":["redact","delete"],"title":"Mode","default":"redact"},"by_name":{"type":"boolean","title":"By Name","default":false}},"additionalProperties":false,"type":"object","required":["action"],"title":"PrivacyRequestRunBody"},"ProductAgentsBody":{"properties":{"dry_run":{"type":"boolean","title":"Dry Run","default":false}},"additionalProperties":false,"type":"object","title":"ProductAgentsBody"},"PromoteBody":{"properties":{"acknowledge_would_deny":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Acknowledge Would Deny"},"reason":{"type":"string","title":"Reason","default":""}},"type":"object","title":"PromoteBody"},"ProposalBody":{"properties":{"edits":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Edits"},"days":{"type":"integer","maximum":90.0,"minimum":1.0,"title":"Days","default":30},"note":{"type":"string","maxLength":2000,"title":"Note","default":""}},"additionalProperties":false,"type":"object","title":"ProposalBody"},"ProposalCandidateBody":{"properties":{"reviewed":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Reviewed"},"note":{"type":"string","maxLength":500,"title":"Note","default":""}},"additionalProperties":false,"type":"object","title":"ProposalCandidateBody"},"ProposalEvalBody":{"properties":{"dataset":{"type":"string","maxLength":63,"minLength":1,"title":"Dataset"},"version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Version"},"split":{"type":"string","maxLength":16,"title":"Split","default":""}},"additionalProperties":false,"type":"object","required":["dataset"],"title":"ProposalEvalBody"},"ProviderApproveBody":{"properties":{"reason":{"type":"string","title":"Reason","default":""}},"type":"object","title":"ProviderApproveBody"},"ProviderBody":{"properties":{"kind":{"type":"string","title":"Kind","default":"openai"},"base_url":{"type":"string","title":"Base Url","default":""},"api_key":{"type":"string","title":"Api Key","default":""},"default_model":{"type":"string","title":"Default Model","default":""},"display_name":{"type":"string","title":"Display Name","default":""},"about":{"type":"string","maxLength":200,"title":"About","default":""},"enabled":{"title":"Enabled"},"record_input":{"type":"boolean","title":"Record Input","default":true},"record_output":{"type":"boolean","title":"Record Output","default":true},"max_retries":{"title":"Max Retries"},"wait_cap":{"title":"Wait Cap"},"allowed_models":{"title":"Allowed Models"},"zero_retention":{"title":"Zero Retention"},"no_training":{"title":"No Training"},"terms_ref":{"title":"Terms Ref"},"region":{"title":"Region"},"region_code":{"title":"Region Code"},"tags":{"title":"Tags"},"last_reviewed_at":{"title":"Last Reviewed At"},"next_review_due":{"title":"Next Review Due"},"reviewer":{"title":"Reviewer"},"aws_auth":{"type":"string","title":"Aws Auth","default":"chain"},"role_arn":{"type":"string","title":"Role Arn","default":""},"external_id":{"type":"string","title":"External Id","default":""},"role_session_name":{"type":"string","title":"Role Session Name","default":""},"access_key_id":{"type":"string","title":"Access Key Id","default":""},"secret_access_key_ref":{"type":"string","title":"Secret Access Key Ref","default":""},"session_token_ref":{"type":"string","title":"Session Token Ref","default":""},"bearer_token_ref":{"type":"string","title":"Bearer Token Ref","default":""},"project":{"type":"string","title":"Project","default":""},"location":{"type":"string","title":"Location","default":""},"credentials_json":{"type":"string","title":"Credentials Json","default":""},"api_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Mode"},"credential_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Credential Source"},"entra_client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entra Client Id"},"authorization_passthrough":{"title":"Authorization Passthrough"},"quarantine_on_drift":{"title":"Quarantine On Drift"},"endpoints":{"title":"Endpoints"},"pool_affinity":{"title":"Pool Affinity"}},"type":"object","title":"ProviderBody"},"ProviderDiscoverBody":{"properties":{"kind":{"type":"string","title":"Kind","default":"openai"},"base_url":{"type":"string","title":"Base Url","default":""},"api_key":{"type":"string","title":"Api Key","default":""},"default_model":{"type":"string","title":"Default Model","default":""},"region":{"type":"string","title":"Region","default":""},"aws_auth":{"type":"string","title":"Aws Auth","default":"chain"},"role_arn":{"type":"string","title":"Role Arn","default":""},"external_id":{"type":"string","title":"External Id","default":""},"role_session_name":{"type":"string","title":"Role Session Name","default":""},"access_key_id":{"type":"string","title":"Access Key Id","default":""},"secret_access_key_ref":{"type":"string","title":"Secret Access Key Ref","default":""},"session_token_ref":{"type":"string","title":"Session Token Ref","default":""},"bearer_token_ref":{"type":"string","title":"Bearer Token Ref","default":""},"project":{"type":"string","title":"Project","default":""},"location":{"type":"string","title":"Location","default":""},"credentials_json":{"type":"string","title":"Credentials Json","default":""},"api_mode":{"type":"string","title":"Api Mode","default":""},"allowed_models":{"items":{"type":"string"},"type":"array","maxItems":200,"title":"Allowed Models"},"credential_source":{"type":"string","title":"Credential Source","default":""},"entra_client_id":{"type":"string","title":"Entra Client Id","default":""},"name":{"type":"string","maxLength":63,"title":"Name","default":""}},"type":"object","title":"ProviderDiscoverBody"},"ProviderSwitchBody":{"properties":{"reason":{"type":"string","title":"Reason","default":""}},"type":"object","title":"ProviderSwitchBody"},"ProviderTestBody":{"properties":{"kind":{"type":"string","title":"Kind","default":"openai"},"base_url":{"type":"string","title":"Base Url","default":""},"api_key":{"type":"string","title":"Api Key","default":""},"default_model":{"type":"string","title":"Default Model","default":""},"region":{"type":"string","title":"Region","default":""},"aws_auth":{"type":"string","title":"Aws Auth","default":"chain"},"role_arn":{"type":"string","title":"Role Arn","default":""},"external_id":{"type":"string","title":"External Id","default":""},"role_session_name":{"type":"string","title":"Role Session Name","default":""},"access_key_id":{"type":"string","title":"Access Key Id","default":""},"secret_access_key_ref":{"type":"string","title":"Secret Access Key Ref","default":""},"session_token_ref":{"type":"string","title":"Session Token Ref","default":""},"bearer_token_ref":{"type":"string","title":"Bearer Token Ref","default":""},"project":{"type":"string","title":"Project","default":""},"location":{"type":"string","title":"Location","default":""},"credentials_json":{"type":"string","title":"Credentials Json","default":""},"api_mode":{"type":"string","title":"Api Mode","default":""},"allowed_models":{"items":{"type":"string"},"type":"array","maxItems":200,"title":"Allowed Models"},"credential_source":{"type":"string","title":"Credential Source","default":""},"entra_client_id":{"type":"string","title":"Entra Client Id","default":""},"name":{"type":"string","maxLength":63,"title":"Name","default":""},"max_retries":{"title":"Max Retries"},"wait_cap":{"title":"Wait Cap"}},"type":"object","title":"ProviderTestBody"},"RateBody":{"properties":{"input":{"type":"number","title":"Input","default":0.0},"output":{"type":"number","title":"Output","default":0.0},"cached":{"type":"number","title":"Cached","default":0.0},"cache_write":{"type":"number","title":"Cache Write","default":0.0},"cache_write_1h":{"type":"number","title":"Cache Write 1H","default":0.0},"reasoning":{"type":"number","title":"Reasoning","default":0.0},"tool_use":{"type":"number","title":"Tool Use","default":0.0},"tiers":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Tiers"},"effective_from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Effective From"}},"type":"object","title":"RateBody"},"RateLimitsBody":{"properties":{"rules":{"items":{},"type":"array","title":"Rules"},"reason":{"type":"string","maxLength":500,"title":"Reason","default":""}},"additionalProperties":false,"type":"object","required":["rules"],"title":"RateLimitsBody","description":"The whole rule list (ratelimit.clean_rules says what a rule is), and\nthe reason a save that loosens one needs."},"ReasonBody":{"properties":{"reason":{"type":"string","maxLength":500,"title":"Reason","default":""}},"additionalProperties":false,"type":"object","title":"ReasonBody"},"RedTeamGateBody":{"properties":{"required":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Required"},"max_asr":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Asr"},"no_critical":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"No Critical"},"max_age_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Age Days"},"target":{"anyOf":[{"type":"string","maxLength":16},{"type":"null"}],"title":"Target"},"inherit":{"type":"boolean","title":"Inherit","default":false},"reason":{"type":"string","title":"Reason","default":""}},"additionalProperties":false,"type":"object","title":"RedTeamGateBody"},"RedTeamRunBody":{"properties":{"agent":{"type":"string","maxLength":240,"title":"Agent"},"target":{"type":"string","maxLength":16,"title":"Target","default":"guardrails"},"categories":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Categories"},"transforms":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Transforms"},"vectors":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Vectors"},"attacks":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Attacks"},"custom":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Custom"},"baseline":{"type":"string","maxLength":64,"title":"Baseline","default":""},"allowed_rise":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Allowed Rise"},"max_asr":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Asr"}},"additionalProperties":false,"type":"object","required":["agent"],"title":"RedTeamRunBody"},"RegisterBody":{"properties":{"mcp_url":{"type":"string","title":"Mcp Url","default":""},"name":{"type":"string","title":"Name","default":""},"label":{"type":"string","title":"Label","default":""},"method":{"type":"string","title":"Method","default":"auto"},"allow_duplicate":{"type":"boolean","title":"Allow Duplicate","default":false},"tags":{"anyOf":[{"additionalProperties":true,"type":"object"},{"items":{},"type":"array"},{"type":"null"}],"title":"Tags"}},"type":"object","title":"RegisterBody"},"RegistryBody":{"properties":{"owners":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Owners"},"responders":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Responders"},"risk_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Risk Tier"},"intended_purpose":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Intended Purpose"},"out_of_scope":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Out Of Scope"},"known_issues":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Known Issues"},"oversight_roles":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Oversight Roles"},"data_sources":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Data Sources"},"review_due":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Review Due"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","title":"RegistryBody"},"RegistryTransferBody":{"properties":{"to":{"type":"string","title":"To","default":""},"reason":{"type":"string","title":"Reason","default":""},"mode":{"type":"string","title":"Mode","default":"replace"}},"type":"object","title":"RegistryTransferBody"},"ReplayBody":{"properties":{"candidate_id":{"type":"string","maxLength":64,"minLength":1,"title":"Candidate Id"},"tickets":{"type":"integer","maximum":200.0,"minimum":1.0,"title":"Tickets","default":50}},"additionalProperties":false,"type":"object","required":["candidate_id"],"title":"ReplayBody"},"ReplyFeedbackBody":{"properties":{"conversation":{"type":"string","maxLength":64,"minLength":1,"title":"Conversation"},"helpful":{"type":"boolean","title":"Helpful"},"comment":{"type":"string","maxLength":1000,"title":"Comment","default":""}},"additionalProperties":false,"type":"object","required":["conversation","helpful"],"title":"ReplyFeedbackBody"},"RetentionPurgeBody":{"properties":{"dry_run":{"type":"boolean","title":"Dry Run","default":true},"stores":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Stores"}},"additionalProperties":false,"type":"object","title":"RetentionPurgeBody"},"RetireTenantBody":{"properties":{"reason":{"type":"string","maxLength":500,"title":"Reason","default":""},"confirm":{"type":"string","title":"Confirm","default":""}},"additionalProperties":false,"type":"object","title":"RetireTenantBody"},"ReviewAnnotationBody":{"properties":{"scores":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Scores"},"choice":{"anyOf":[{"type":"string","maxLength":8},{"type":"null"}],"title":"Choice"},"comment":{"type":"string","maxLength":4000,"title":"Comment","default":""},"corrected_output":{"type":"string","maxLength":20000,"title":"Corrected Output","default":""},"routing":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Routing"}},"additionalProperties":false,"type":"object","title":"ReviewAnnotationBody"},"ReviewItemBody":{"properties":{"subject_type":{"type":"string","maxLength":16,"title":"Subject Type"},"subject_id":{"type":"string","maxLength":200,"title":"Subject Id"},"subject_b":{"type":"string","maxLength":200,"title":"Subject B","default":""},"snapshot":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Snapshot"},"pinned":{"type":"boolean","title":"Pinned","default":false}},"additionalProperties":false,"type":"object","required":["subject_type","subject_id"],"title":"ReviewItemBody"},"RoleBindingBody":{"properties":{"principal":{"type":"string","maxLength":64,"title":"Principal"},"role":{"type":"string","maxLength":64,"title":"Role"},"tenant":{"anyOf":[{"type":"string","maxLength":48},{"type":"null"}],"title":"Tenant"}},"type":"object","required":["principal","role"],"title":"RoleBindingBody"},"RoleBody":{"properties":{"label":{"type":"string","maxLength":64,"title":"Label","default":""},"about":{"type":"string","maxLength":200,"title":"About","default":""},"permissions":{"items":{"type":"string"},"type":"array","title":"Permissions"}},"type":"object","title":"RoleBody"},"RotateKeyBody":{"properties":{"grace_hours":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Grace Hours"}},"type":"object","title":"RotateKeyBody"},"RotateSigningBody":{"properties":{"alg":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alg"},"overlap_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Overlap Days"}},"type":"object","title":"RotateSigningBody"},"RotateSigningSecretBody":{"properties":{"overlap_hours":{"type":"number","title":"Overlap Hours","default":24.0}},"type":"object","title":"RotateSigningSecretBody"},"RotateVaultBody":{"properties":{"fresh":{"type":"boolean","title":"Fresh","default":false},"rewrap":{"type":"boolean","title":"Rewrap","default":false}},"type":"object","title":"RotateVaultBody"},"RunCancelBody":{"properties":{"reason":{"type":"string","maxLength":200,"title":"Reason","default":""}},"additionalProperties":false,"type":"object","title":"RunCancelBody"},"RunResumeBody":{"properties":{"answer":{"title":"Answer"}},"type":"object","title":"RunResumeBody"},"RuntimeBody":{"properties":{"mcp_servers":{"anyOf":[{"items":{"anyOf":[{"type":"string"},{"additionalProperties":true,"type":"object"}]},"type":"array"},{"type":"null"}],"title":"Mcp Servers"},"mcp_tools":{"anyOf":[{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object"},{"type":"null"}],"title":"Mcp Tools"},"subagents":{"anyOf":[{"additionalProperties":{"additionalProperties":true,"type":"object"},"type":"object"},{"type":"null"}],"title":"Subagents"},"max_iterations":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Iterations"},"context_budget_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Context Budget Tokens"},"limits":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Limits"},"run_as":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Run As"},"require_invoker_permissions":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Require Invoker Permissions"},"session_state":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Session State"},"pinned_tools":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Pinned Tools"},"deferred_tools_threshold":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Deferred Tools Threshold"},"suspend":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Suspend"},"collected_from_user":{"anyOf":[{"additionalProperties":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object"},"type":"object"},{"type":"null"}],"title":"Collected From User"},"intent_judge":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Intent Judge"},"parallel_tool_calls":{"anyOf":[{"type":"boolean"},{"type":"integer"},{"type":"null"}],"title":"Parallel Tool Calls"},"max_delegation_depth":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Delegation Depth"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","title":"RuntimeBody"},"SSOEnforcementBody":{"properties":{"sso_enforced":{"type":"boolean","title":"Sso Enforced","default":false},"domains":{"items":{"type":"string"},"type":"array","maxItems":200,"title":"Domains"},"break_glass":{"items":{"type":"string"},"type":"array","maxItems":50,"title":"Break Glass"},"reason":{"type":"string","title":"Reason","default":""}},"type":"object","title":"SSOEnforcementBody"},"SSOProviderBody":{"properties":{"label":{"type":"string","maxLength":64,"title":"Label","default":""},"authorize_url":{"type":"string","title":"Authorize Url","default":""},"token_url":{"type":"string","title":"Token Url","default":""},"userinfo_url":{"type":"string","title":"Userinfo Url","default":""},"client_id":{"type":"string","title":"Client Id","default":""},"client_secret":{"type":"string","title":"Client Secret","default":""},"scopes":{"type":"string","title":"Scopes","default":"openid email profile"},"username_claim":{"type":"string","title":"Username Claim","default":"email"},"icon":{"type":"string","title":"Icon","default":"generic"},"provisioning":{"type":"string","title":"Provisioning","default":"existing_only"},"allowed_domains":{"items":{"type":"string"},"type":"array","title":"Allowed Domains","default":[]},"default_role":{"type":"string","title":"Default Role","default":"viewer"},"enabled":{"type":"boolean","title":"Enabled","default":true},"groups_claim":{"type":"string","title":"Groups Claim","default":"groups"},"group_sync":{"type":"boolean","title":"Group Sync","default":false},"group_role_map":{"items":{},"type":"array","maxItems":500,"title":"Group Role Map"},"group_tenant_map":{"items":{},"type":"array","maxItems":500,"title":"Group Tenant Map"}},"type":"object","title":"SSOProviderBody"},"SafetyPreambleBody":{"properties":{"text":{"type":"string","title":"Text","default":""},"reason":{"type":"string","title":"Reason","default":""}},"additionalProperties":false,"type":"object","title":"SafetyPreambleBody"},"ScimConfigBody":{"properties":{"enabled":{"type":"boolean","title":"Enabled","default":false},"provider":{"type":"string","maxLength":64,"title":"Provider","default":""},"default_role":{"type":"string","maxLength":64,"title":"Default Role","default":"viewer"},"on_delete":{"type":"string","maxLength":16,"title":"On Delete","default":"disable"}},"additionalProperties":false,"type":"object","title":"ScimConfigBody"},"ScopedBudgetBody":{"properties":{"scope":{"title":"Scope"},"period":{"title":"Period"},"limit_usd":{"title":"Limit Usd"},"limit_tokens":{"title":"Limit Tokens"},"action":{"title":"Action"},"fallback":{"title":"Fallback"},"display_name":{"title":"Display Name"},"tenant":{"title":"Tenant"}},"additionalProperties":true,"type":"object","title":"ScopedBudgetBody","description":"PUT /budgets/scoped/{name}: the whole budget (usage.SCOPED_FIELDS).\n\nTyped loosely on purpose — usage.save_scoped_budget validates every field\nand says what was wrong, where Pydantic would coerce `true` into a $1\nlimit — and undeclared fields are kept (extra=\"allow\") so one sent by\nmistake is refused there rather than dropped here."},"ScopedKillSwitchBody":{"properties":{"selector":{"additionalProperties":true,"type":"object","title":"Selector"},"reason":{"type":"string","title":"Reason","default":""},"revoke_credentials":{"type":"boolean","title":"Revoke Credentials","default":false}},"additionalProperties":false,"type":"object","required":["selector"],"title":"ScopedKillSwitchBody"},"ScopedLiftBody":{"properties":{"reason":{"type":"string","maxLength":500,"title":"Reason","default":""}},"additionalProperties":false,"type":"object","title":"ScopedLiftBody"},"ScopedPreviewBody":{"properties":{"selector":{"additionalProperties":true,"type":"object","title":"Selector"}},"additionalProperties":false,"type":"object","required":["selector"],"title":"ScopedPreviewBody"},"SecretBody":{"properties":{"value":{"type":"string","title":"Value"},"about":{"type":"string","title":"About","default":""},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"}},"type":"object","required":["value"],"title":"SecretBody"},"SecretCreateBody":{"properties":{"id":{"type":"string","title":"Id"},"value":{"type":"string","title":"Value"},"labels":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Labels"}},"type":"object","required":["id","value"],"title":"SecretCreateBody"},"SecretPatchBody":{"properties":{"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value"},"labels":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Labels"}},"type":"object","title":"SecretPatchBody"},"SecretsSwitchBody":{"properties":{"disabled":{"type":"boolean","title":"Disabled"},"reason":{"type":"string","maxLength":500,"title":"Reason","default":""}},"type":"object","required":["disabled"],"title":"SecretsSwitchBody"},"SelfRegisterBody":{"properties":{"client_id":{"type":"string","title":"Client Id","default":""},"client_name":{"title":"Client Name","default":""},"redirect_uris":{"title":"Redirect Uris"},"grant_types":{"title":"Grant Types"},"response_types":{"title":"Response Types"},"token_endpoint_auth_method":{"title":"Token Endpoint Auth Method"},"scope":{"title":"Scope"},"logo_uri":{"title":"Logo Uri"},"software_id":{"title":"Software Id"},"software_statement":{"title":"Software Statement"}},"type":"object","title":"SelfRegisterBody"},"SemanticCachePurgeBody":{"properties":{"tenant":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Tenant"}},"type":"object","title":"SemanticCachePurgeBody"},"SendTestBody":{"properties":{"subject":{"type":"string","title":"Subject","default":""},"body":{"type":"string","title":"Body","default":""},"sender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender"}},"type":"object","title":"SendTestBody"},"SensitivityBody":{"properties":{"label":{"type":"string","maxLength":32,"minLength":1,"title":"Label"},"reason":{"type":"string","maxLength":500,"title":"Reason","default":""}},"type":"object","required":["label"],"title":"SensitivityBody"},"ServiceAccountBody":{"properties":{"name":{"type":"string","maxLength":64,"minLength":1,"title":"Name"},"account":{"type":"string","maxLength":64,"minLength":1,"title":"Account"},"ttl_days":{"type":"integer","title":"Ttl Days","default":90},"about":{"type":"string","maxLength":200,"title":"About","default":""}},"additionalProperties":false,"type":"object","required":["name","account"],"title":"ServiceAccountBody"},"ServiceAccountDeleteBody":{"properties":{"reason":{"type":"string","maxLength":500,"title":"Reason","default":""}},"additionalProperties":false,"type":"object","title":"ServiceAccountDeleteBody"},"ServiceAccountPatchBody":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"reason":{"type":"string","maxLength":500,"title":"Reason","default":""}},"additionalProperties":false,"type":"object","required":["enabled"],"title":"ServiceAccountPatchBody"},"ServiceAccountRotateBody":{"properties":{"ttl_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ttl Days"}},"additionalProperties":false,"type":"object","title":"ServiceAccountRotateBody"},"SessionPolicyBody":{"properties":{"max_hours":{"type":"integer","title":"Max Hours"},"idle_minutes":{"type":"integer","title":"Idle Minutes"},"reason":{"type":"string","title":"Reason","default":""}},"type":"object","required":["max_hours","idle_minutes"],"title":"SessionPolicyBody"},"SfAttachBody":{"properties":{"server":{"type":"string","maxLength":200,"minLength":1,"title":"Server"},"persona":{"type":"string","maxLength":40,"title":"Persona","default":""}},"additionalProperties":false,"type":"object","required":["server"],"title":"SfAttachBody"},"SfOrgRefreshBody":{"properties":{"server":{"type":"string","maxLength":200,"minLength":1,"title":"Server"},"objects":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":10},{"type":"null"}],"title":"Objects"}},"additionalProperties":false,"type":"object","required":["server"],"title":"SfOrgRefreshBody"},"SfPlaybookBody":{"properties":{"name":{"type":"string","maxLength":80,"minLength":1,"title":"Name"},"description":{"type":"string","maxLength":600,"title":"Description","default":""},"params":{"items":{},"type":"array","maxItems":6,"title":"Params"},"steps":{"items":{"additionalProperties":true,"type":"object"},"type":"array","maxItems":10,"title":"Steps"},"from_conversation":{"type":"string","maxLength":64,"title":"From Conversation","default":""},"values":{"additionalProperties":{"type":"string"},"type":"object","maxProperties":6,"title":"Values"},"server":{"type":"string","maxLength":200,"title":"Server","default":""}},"additionalProperties":false,"type":"object","required":["name"],"title":"SfPlaybookBody"},"SfPlaybookDraftBody":{"properties":{"description":{"type":"string","maxLength":1200,"minLength":1,"title":"Description"},"server":{"type":"string","maxLength":200,"title":"Server","default":""}},"additionalProperties":false,"type":"object","required":["description"],"title":"SfPlaybookDraftBody"},"SfPlaybookRunBody":{"properties":{"params":{"additionalProperties":{"type":"string"},"type":"object","maxProperties":6,"title":"Params"},"server":{"type":"string","maxLength":200,"title":"Server","default":""}},"additionalProperties":false,"type":"object","title":"SfPlaybookRunBody"},"SightingPromoteBody":{"properties":{"agent_id":{"type":"string","title":"Agent Id"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"}},"type":"object","required":["agent_id"],"title":"SightingPromoteBody"},"SimBankBody":{"properties":{"scenarios":{"items":{},"type":"array","title":"Scenarios"}},"additionalProperties":false,"type":"object","title":"SimBankBody"},"SimRunBody":{"properties":{"bank":{"type":"string","maxLength":64,"title":"Bank","default":""},"scenarios":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Scenarios"},"simulator":{"type":"string","maxLength":240,"title":"Simulator","default":""},"max_turns":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Turns"},"baseline":{"type":"string","maxLength":64,"title":"Baseline","default":""},"allowed_drop":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Allowed Drop"}},"additionalProperties":false,"type":"object","title":"SimRunBody"},"SiteChatBody":{"properties":{"question":{"type":"string","title":"Question","default":""},"mode":{"type":"string","title":"Mode","default":"answer"},"page":{"type":"string","maxLength":200,"title":"Page","default":""}},"type":"object","title":"SiteChatBody"},"SolutionRequestBody":{"properties":{"solution":{"type":"string","maxLength":40,"title":"Solution"},"note":{"type":"string","maxLength":500,"title":"Note","default":""}},"additionalProperties":false,"type":"object","required":["solution"],"title":"SolutionRequestBody"},"SolutionsBody":{"properties":{"solutions":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":32},{"type":"null"}],"title":"Solutions"},"plan":{"type":"string","maxLength":40,"title":"Plan","default":""},"reason":{"type":"string","maxLength":500,"title":"Reason","default":""},"confirm_id":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Confirm Id"}},"additionalProperties":false,"type":"object","title":"SolutionsBody"},"SourceCreate":{"properties":{"name":{"type":"string","title":"Name","default":""},"type":{"type":"string","title":"Type","default":""},"config":{"additionalProperties":true,"type":"object","title":"Config"}},"type":"object","title":"SourceCreate"},"SourcePatch":{"properties":{"sync_interval_minutes":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sync Interval Minutes"},"sync_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sync Mode"}},"type":"object","title":"SourcePatch"},"SpecPinBody":{"properties":{"digest":{"type":"string","maxLength":64,"minLength":64,"title":"Digest"}},"type":"object","required":["digest"],"title":"SpecPinBody"},"SsoExchangeBody":{"properties":{"code":{"type":"string","maxLength":128,"minLength":1,"title":"Code"}},"additionalProperties":false,"type":"object","required":["code"],"title":"SsoExchangeBody"},"SubagentTenantStateBody":{"properties":{"on":{"type":"boolean","title":"On"}},"additionalProperties":false,"type":"object","required":["on"],"title":"SubagentTenantStateBody"},"SubjectBody":{"properties":{"email":{"type":"string","maxLength":200,"title":"Email","default":""},"name":{"type":"string","maxLength":200,"title":"Name","default":""},"external_id":{"type":"string","maxLength":200,"title":"External Id","default":""},"upn":{"type":"string","maxLength":200,"title":"Upn","default":""},"reason":{"type":"string","maxLength":500,"title":"Reason","default":""},"stores":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Stores"},"mode":{"type":"string","enum":["redact","delete"],"title":"Mode","default":"redact"}},"additionalProperties":false,"type":"object","title":"SubjectBody"},"SuperAdminBillingLinkBody":{"properties":{"customer_id":{"type":"string","maxLength":64,"title":"Customer Id","default":""},"create":{"type":"boolean","title":"Create","default":false},"email":{"type":"string","maxLength":254,"title":"Email","default":""}},"additionalProperties":false,"type":"object","title":"SuperAdminBillingLinkBody"},"SuperAdminContactBody":{"properties":{"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"},"role":{"type":"string","maxLength":80,"title":"Role","default":""},"email":{"type":"string","maxLength":254,"title":"Email","default":""}},"additionalProperties":false,"type":"object","required":["name"],"title":"SuperAdminContactBody"},"SuperAdminCrmLinkBody":{"properties":{"company_id":{"type":"string","maxLength":20,"title":"Company Id","default":""},"create":{"type":"boolean","title":"Create","default":false},"domain":{"type":"string","maxLength":253,"title":"Domain","default":""}},"additionalProperties":false,"type":"object","title":"SuperAdminCrmLinkBody"},"SuperAdminKeyBody":{"properties":{"days":{"type":"integer","maximum":365.0,"minimum":1.0,"title":"Days","default":30},"max_instances":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Max Instances","default":5}},"additionalProperties":false,"type":"object","title":"SuperAdminKeyBody"},"SuperAdminNoteBody":{"properties":{"body":{"type":"string","maxLength":4000,"minLength":1,"title":"Body"}},"additionalProperties":false,"type":"object","required":["body"],"title":"SuperAdminNoteBody"},"SuperAdminOrgBody":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Name"},"status":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Status"},"plan":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Plan"},"seats_licensed":{"anyOf":[{"type":"integer","maximum":10000000.0,"minimum":0.0},{"type":"null"}],"title":"Seats Licensed"},"renewal_date":{"anyOf":[{"type":"string","pattern":"^(\\d{4}-\\d{2}-\\d{2})?$"},{"type":"null"}],"title":"Renewal Date"},"deployment":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Deployment"},"region":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Region"},"csm":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Csm"},"alert_targets":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":20},{"type":"null"}],"title":"Alert Targets"}},"additionalProperties":false,"type":"object","title":"SuperAdminOrgBody"},"SyncBody":{"properties":{"mode":{"type":"string","title":"Mode","default":"kb"},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"},"run_async":{"type":"boolean","title":"Run Async","default":false}},"type":"object","title":"SyncBody"},"TaxonomyDiscoverBody":{"properties":{"source":{"type":"string","title":"Source","default":"tickets"},"records":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Records"},"max_records":{"type":"integer","maximum":20000.0,"minimum":4.0,"title":"Max Records","default":5000},"use_llm":{"type":"boolean","title":"Use Llm","default":true},"k":{"anyOf":[{"type":"integer","maximum":40.0,"minimum":2.0},{"type":"null"}],"title":"K"}},"type":"object","title":"TaxonomyDiscoverBody"},"TeamsAccessBody":{"properties":{"mode":{"type":"string","title":"Mode","default":"tenant"},"users":{"items":{"type":"string"},"type":"array","title":"Users"},"groups":{"items":{"type":"string"},"type":"array","title":"Groups"}},"type":"object","title":"TeamsAccessBody"},"TeamsInboundBody":{"properties":{"token":{"type":"string","title":"Token","default":""}},"type":"object","title":"TeamsInboundBody"},"TeamsSsoBody":{"properties":{"enabled":{"type":"boolean","title":"Enabled","default":false},"connection_name":{"type":"string","maxLength":128,"title":"Connection Name","default":""},"resource":{"type":"string","maxLength":320,"title":"Resource","default":""}},"type":"object","title":"TeamsSsoBody"},"TenantBindingBody":{"properties":{"tenant":{"type":"string","title":"Tenant","default":""},"reason":{"type":"string","title":"Reason","default":""}},"type":"object","title":"TenantBindingBody"},"TenantBody":{"properties":{"name":{"type":"string","maxLength":80,"title":"Name","default":""},"about":{"type":"string","maxLength":200,"title":"About","default":""},"region":{"type":"string","maxLength":64,"title":"Region","default":""},"environment":{"type":"string","maxLength":32,"title":"Environment","default":"production"},"sources":{"items":{"type":"string"},"type":"array","title":"Sources"},"owns_unsourced":{"type":"boolean","title":"Owns Unsourced","default":false},"enabled":{"type":"boolean","title":"Enabled","default":true},"retention":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Retention"},"residency_region":{"anyOf":[{"type":"string","maxLength":8},{"type":"null"}],"title":"Residency Region"},"no_cross_geo":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"No Cross Geo"},"reason":{"type":"string","maxLength":500,"title":"Reason","default":""}},"type":"object","title":"TenantBody"},"TenantGrantBody":{"properties":{"tenants":{"items":{"type":"string"},"type":"array","title":"Tenants"}},"type":"object","title":"TenantGrantBody"},"TenantProfileBody":{"properties":{"env_kind":{"anyOf":[{"type":"string","maxLength":8},{"type":"null"}],"title":"Env Kind"},"ring":{"anyOf":[{"type":"string","maxLength":16},{"type":"null"}],"title":"Ring"},"label":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Label"},"reason":{"type":"string","maxLength":500,"title":"Reason","default":""}},"additionalProperties":false,"type":"object","title":"TenantProfileBody"},"TicketCreate":{"properties":{"title":{"type":"string","maxLength":1000,"title":"Title","default":""},"description":{"type":"string","maxLength":50000,"title":"Description","default":""},"requester":{"type":"string","maxLength":256,"title":"Requester","default":""}},"type":"object","title":"TicketCreate"},"TicketPatch":{"properties":{"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"resolution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution"},"team":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Team"},"category":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Category"},"priority":{"anyOf":[{"type":"string","maxLength":8},{"type":"null"}],"title":"Priority"},"waiting_on":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Waiting On"}},"type":"object","title":"TicketPatch"},"TicketReply":{"properties":{"author":{"type":"string","enum":["desk","requester"],"title":"Author"},"body":{"type":"string","maxLength":20000,"minLength":1,"title":"Body"},"public":{"type":"boolean","title":"Public","default":true}},"type":"object","required":["author","body"],"title":"TicketReply"},"TokenBody":{"properties":{"ttl_hours":{"type":"integer","title":"Ttl Hours","default":24}},"type":"object","title":"TokenBody"},"ToolPinBody":{"properties":{"tools":{"additionalProperties":{"type":"string"},"type":"object","title":"Tools"},"overrides":{"additionalProperties":{"type":"string"},"type":"object","title":"Overrides"}},"type":"object","title":"ToolPinBody"},"ToolRateBody":{"properties":{"usd_per_call":{"type":"number","title":"Usd Per Call"}},"type":"object","required":["usd_per_call"],"title":"ToolRateBody"},"TranscriptBulkDeleteBody":{"properties":{"agent":{"type":"string","maxLength":200,"title":"Agent","default":""},"since":{"type":"string","maxLength":64,"title":"Since","default":""},"until":{"type":"string","maxLength":64,"title":"Until","default":""},"status":{"type":"string","maxLength":32,"title":"Status","default":""},"source":{"type":"string","maxLength":64,"title":"Source","default":""},"dry_run":{"type":"boolean","title":"Dry Run","default":true}},"additionalProperties":false,"type":"object","title":"TranscriptBulkDeleteBody"},"TriageEvalBody":{"properties":{"limit":{"type":"integer","maximum":20000.0,"minimum":10.0,"title":"Limit","default":2000},"routing_table":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Routing Table"},"classify_knn_k":{"anyOf":[{"type":"integer","maximum":50.0,"minimum":1.0},{"type":"null"}],"title":"Classify Knn K"},"dedup_threshold":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Dedup Threshold"},"dedup_review_band":{"anyOf":[{"type":"number","maximum":0.5,"minimum":0.0},{"type":"null"}],"title":"Dedup Review Band"}},"additionalProperties":false,"type":"object","title":"TriageEvalBody"},"TriggerBody":{"properties":{"agent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent"},"kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"},"about":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"About"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"schedule":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Schedule"},"timezone":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Timezone"},"input":{"anyOf":[{"type":"string","maxLength":16384},{"type":"null"}],"title":"Input"},"events":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":16},{"type":"null"}],"title":"Events"},"filter":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array","maxItems":50},{"type":"null"}],"title":"Filter"},"run_as":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Run As"},"mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode"},"bot_app_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bot App Id"},"bot_tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bot Tenant Id"},"bot_app_secret_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bot App Secret Ref"},"bot_app_cert_ref":{"anyOf":[{"type":"string","maxLength":140},{"type":"null"}],"title":"Bot App Cert Ref"},"slack_signing_secret_ref":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Slack Signing Secret Ref"},"slack_bot_token_ref":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Slack Bot Token Ref"},"slack_channels":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":200},{"type":"null"}],"title":"Slack Channels"},"google_chat_audience_type":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Google Chat Audience Type"},"google_chat_audience":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Google Chat Audience"},"google_chat_credential_ref":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Google Chat Credential Ref"},"google_chat_domains":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":50},{"type":"null"}],"title":"Google Chat Domains"},"google_chat_access":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Google Chat Access"},"google_chat_users":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":500},{"type":"null"}],"title":"Google Chat Users"},"google_chat_time_zone":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Google Chat Time Zone"},"chat_router":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Chat Router"},"auth_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Auth Mode"},"hmac_secret_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hmac Secret Ref"},"loop_guard":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Loop Guard"},"disclosure_prefix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Disclosure Prefix"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Config"},"update_mask":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Update Mask"}},"type":"object","title":"TriggerBody"},"TriggerConvertBody":{"properties":{"agent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent"},"kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"},"about":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"About"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"schedule":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Schedule"},"timezone":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Timezone"},"input":{"anyOf":[{"type":"string","maxLength":16384},{"type":"null"}],"title":"Input"},"events":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":16},{"type":"null"}],"title":"Events"},"filter":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array","maxItems":50},{"type":"null"}],"title":"Filter"},"run_as":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Run As"},"mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode"},"bot_app_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bot App Id"},"bot_tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bot Tenant Id"},"bot_app_secret_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bot App Secret Ref"},"bot_app_cert_ref":{"anyOf":[{"type":"string","maxLength":140},{"type":"null"}],"title":"Bot App Cert Ref"},"slack_signing_secret_ref":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Slack Signing Secret Ref"},"slack_bot_token_ref":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Slack Bot Token Ref"},"slack_channels":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":200},{"type":"null"}],"title":"Slack Channels"},"google_chat_audience_type":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Google Chat Audience Type"},"google_chat_audience":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Google Chat Audience"},"google_chat_credential_ref":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Google Chat Credential Ref"},"google_chat_domains":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":50},{"type":"null"}],"title":"Google Chat Domains"},"google_chat_access":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Google Chat Access"},"google_chat_users":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":500},{"type":"null"}],"title":"Google Chat Users"},"google_chat_time_zone":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Google Chat Time Zone"},"chat_router":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Chat Router"},"auth_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Auth Mode"},"hmac_secret_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hmac Secret Ref"},"loop_guard":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Loop Guard"},"disclosure_prefix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Disclosure Prefix"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Config"},"update_mask":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Update Mask"},"reason":{"type":"string","title":"Reason","default":""}},"type":"object","title":"TriggerConvertBody"},"TryDecideBody":{"properties":{"proposal":{"additionalProperties":true,"type":"object","title":"Proposal","default":{}},"approve":{"type":"boolean","title":"Approve","default":false},"state":{"additionalProperties":true,"type":"object","title":"State","default":{}},"world":{"type":"string","title":"World","default":"crm"}},"type":"object","title":"TryDecideBody"},"TryStateBody":{"properties":{"state":{"additionalProperties":true,"type":"object","title":"State","default":{}},"world":{"type":"string","title":"World","default":"crm"}},"type":"object","title":"TryStateBody"},"TryTurnBody":{"properties":{"message":{"type":"string","title":"Message","default":""},"history":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"History","default":[]},"state":{"additionalProperties":true,"type":"object","title":"State","default":{}},"world":{"type":"string","title":"World","default":"crm"}},"type":"object","title":"TryTurnBody"},"UnmergeBody":{"properties":{"de_escalate_parent":{"type":"boolean","title":"De Escalate Parent","default":false},"reason":{"type":"string","maxLength":500,"title":"Reason","default":""}},"type":"object","title":"UnmergeBody"},"UnpinSessionBody":{"properties":{"reason":{"type":"string","maxLength":500,"title":"Reason","default":""}},"additionalProperties":false,"type":"object","title":"UnpinSessionBody"},"UserBody":{"properties":{"role":{"type":"string","title":"Role","default":"viewer"},"enabled":{"type":"boolean","title":"Enabled","default":true},"label":{"type":"string","maxLength":64,"title":"Label","default":""},"password":{"type":"string","title":"Password","default":""},"groups":{"anyOf":[{"items":{},"type":"array","maxItems":500},{"type":"null"}],"title":"Groups"},"email":{"anyOf":[{"type":"string","maxLength":254},{"type":"null"}],"title":"Email"}},"type":"object","title":"UserBody"},"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"},"VersionRestoreBody":{"properties":{"note":{"type":"string","maxLength":200,"title":"Note","default":""},"reason":{"type":"string","title":"Reason","default":""},"override_redteam_gate":{"type":"boolean","title":"Override Redteam Gate","default":false}},"type":"object","title":"VersionRestoreBody"},"WebPushKeys":{"properties":{"p256dh":{"type":"string","maxLength":200,"minLength":1,"title":"P256Dh"},"auth":{"type":"string","maxLength":100,"minLength":1,"title":"Auth"}},"type":"object","required":["p256dh","auth"],"title":"WebPushKeys"},"WebPushSubscriptionBody":{"properties":{"endpoint":{"type":"string","maxLength":1024,"minLength":1,"title":"Endpoint"},"keys":{"$ref":"#/components/schemas/WebPushKeys"}},"type":"object","required":["endpoint","keys"],"title":"WebPushSubscriptionBody"},"WebchatBody":{"properties":{"enabled":{"type":"boolean","title":"Enabled","default":true},"allowed_origins":{"items":{"type":"string"},"type":"array","title":"Allowed Origins"},"auth":{"items":{"type":"string"},"type":"array","title":"Auth"},"jwt_secret_ref":{"type":"string","title":"Jwt Secret Ref","default":""},"jwt_issuer":{"type":"string","title":"Jwt Issuer","default":""}},"type":"object","title":"WebchatBody"},"WebchatFeedbackBody":{"properties":{"message_id":{"type":"string","maxLength":64,"title":"Message Id"},"helpful":{"type":"boolean","title":"Helpful"},"comment":{"type":"string","maxLength":2000,"title":"Comment","default":""},"conversation":{"type":"string","maxLength":64,"title":"Conversation","default":""}},"type":"object","required":["message_id","helpful"],"title":"WebchatFeedbackBody"},"WebchatMessageBody":{"properties":{"text":{"type":"string","maxLength":4000,"title":"Text","default":""},"conversation":{"type":"string","maxLength":64,"title":"Conversation","default":""}},"type":"object","title":"WebchatMessageBody"},"WhatIfBody":{"properties":{"dataset":{"type":"string","maxLength":63,"minLength":1,"title":"Dataset"},"version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Version"},"split":{"type":"string","maxLength":16,"title":"Split","default":""},"options":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Options"},"days":{"type":"integer","maximum":90.0,"minimum":1.0,"title":"Days","default":30}},"additionalProperties":false,"type":"object","required":["dataset","options"],"title":"WhatIfBody"},"WhatIfContext":{"properties":{"ip":{"type":"string","maxLength":64,"title":"Ip","default":""},"hour":{"anyOf":[{"type":"integer","maximum":23.0,"minimum":0.0},{"type":"null"}],"title":"Hour"},"weekday":{"anyOf":[{"type":"integer","maximum":7.0,"minimum":1.0},{"type":"null"}],"title":"Weekday"},"channel":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]*$","title":"Channel","default":""},"model":{"type":"string","maxLength":200,"title":"Model","default":""}},"additionalProperties":false,"type":"object","title":"WhatIfContext","description":"The request context a what-if check is decided in, in place of the\none this request carries (policy.what_if): Entra's What If asks the same\n— from which address, at what time, through which client. Each key left\nout keeps what the check would have used: the clock now, and the address\nof whoever is asking. A key a check's own gate never supplies (the model\non a person's read) is still laid over it, which is the question asked."},"WorkflowBody":{"properties":{"definition":{"additionalProperties":true,"type":"object","title":"Definition"}},"type":"object","title":"WorkflowBody"},"WorkflowRunBody":{"properties":{"input":{"additionalProperties":true,"type":"object","title":"Input"},"version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Version"}},"type":"object","title":"WorkflowRunBody"},"_BreakerReset":{"properties":{"scope":{"type":"string","maxLength":500,"minLength":3,"title":"Scope"},"reason":{"type":"string","maxLength":500,"minLength":1,"title":"Reason"}},"type":"object","required":["scope","reason"],"title":"_BreakerReset"}}}}