{"openapi":"3.1.0","info":{"title":"Blast Radius","version":"0.1.0"},"paths":{"/api/constraints":{"get":{"summary":"Api Constraints","description":"Re-derive the constraint map against the running database.\n\nCached for five minutes because a sweep writes about thirty times; pass\n`refresh=1` to force one.","operationId":"api_constraints_api_constraints_get","parameters":[{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Refresh"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/constraints":{"get":{"summary":"Constraints Page","operationId":"constraints_page_constraints_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/stats":{"get":{"summary":"Api Stats","description":"Live counts from the sidecar, plus the last full HydraDB measurement.\n\nThe sidecar counts are what the header polls: the crawler writes the graph\nvertex and the sidecar row from the same batch, so they track each other.\n`graph` is the slower, authoritative check, with the age of the reading —\nnever a fabricated stand-in when it has not been taken yet.","operationId":"api_stats_api_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/health":{"get":{"summary":"Api Health","description":"Component-level liveness, for watching the system in real time.\n\n`degraded` is a deliberate state rather than a binary up/down: with HydraDB\nunreachable the console still answers search, maintainer pivots and package\nmetadata from the sidecar, and saying so is more useful than a red light.","operationId":"api_health_api_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/blast":{"get":{"summary":"Api Blast","description":"Who is transitively exposed, and at what depth.\n\nThe traversal is single-flighted. A hub package takes seconds to walk, and\nthe requests that arrive for it arrive together — the console polling, a\ndemo audience clicking the same preset, a load check. Without coalescing,\nN concurrent requests become N concurrent traversals and HydraDB returns\n503 to all of them; with it they share one walk.","operationId":"api_blast_api_blast_get","parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":214,"pattern":"^(?:@[a-z0-9][a-z0-9._-]*/)?[a-z0-9][a-z0-9._-]*$","title":"Name"}},{"name":"depth","in":"query","required":false,"schema":{"type":"integer","maximum":8,"minimum":1,"default":5,"title":"Depth"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200000,"minimum":1,"default":5000,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/resolve":{"get":{"summary":"Api Resolve","description":"Whose declared range would actually have admitted the bad version.","operationId":"api_resolve_api_resolve_get","parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":214,"pattern":"^(?:@[a-z0-9][a-z0-9._-]*/)?[a-z0-9][a-z0-9._-]*$","title":"Name"}},{"name":"bad_version","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"title":"Bad Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/lockfile":{"post":{"summary":"Api Lockfile","description":"The raw package-lock.json is the request body; the incident is the query\nstring. Returns EXPOSED / SHIELDED / CLEAR plus the path that reaches it.","operationId":"api_lockfile_api_lockfile_post","parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":214,"pattern":"^(?:@[a-z0-9][a-z0-9._-]*/)?[a-z0-9][a-z0-9._-]*$","title":"Name"}},{"name":"bad_version","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Bad Version"}},{"name":"depth","in":"query","required":false,"schema":{"type":"integer","maximum":8,"minimum":1,"default":5,"title":"Depth"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/audit":{"post":{"summary":"Api Audit","description":"Scan a whole package-lock.json against the live advisory database.\n\nDistinct from /api/lockfile, which answers \"am I exposed to *this* named\nincident\". This asks the question you actually have before anyone tells you\nthere is an incident: is anything in my tree already known to be malicious?\nIt needs no graph coverage at all — the lockfile is the tree.","operationId":"api_audit_api_audit_post","parameters":[{"name":"max_detail","in":"query","required":false,"schema":{"type":"integer","maximum":300,"minimum":1,"default":60,"title":"Max Detail"}},{"name":"filename","in":"query","required":false,"schema":{"type":"string","maxLength":120,"description":"used only to disambiguate the lockfile format","default":"","title":"Filename"},"description":"used only to disambiguate the lockfile format"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/maintainers":{"get":{"summary":"Api Maintainers","description":"What else the compromised maintainers publish — the next blast radius.","operationId":"api_maintainers_api_maintainers_get","parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":214,"pattern":"^(?:@[a-z0-9][a-z0-9._-]*/)?[a-z0-9][a-z0-9._-]*$","title":"Name"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":1,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/feed":{"get":{"summary":"Api Feed","description":"What npm has published in the last few minutes, and who it reaches.\n\nnpm rejects `feed=continuous` on its replication endpoint, so this polls\n`_changes?since=<seq>` every few seconds — near-real-time rather than\nstreaming, which is what the response says.","operationId":"api_feed_api_feed_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":60,"minimum":1,"default":25,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/expand":{"get":{"summary":"Api Expand","description":"One node and everything adjacent to it, across every edge type.\n\nThe whole graph explorer runs on this: the browser holds no model of the\ngraph, it just asks HydraDB what is next to whatever was clicked. Every\nrelationship is stored in both directions so any node can be the fixed\nsource a variable-length MATCH requires.","operationId":"api_expand_api_expand_get","parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":214,"pattern":"^(?:@[a-z0-9][a-z0-9._-]*/)?[a-z0-9][a-z0-9._-]*$","title":"Name"}},{"name":"kind","in":"query","required":false,"schema":{"type":"string","pattern":"^(package|maintainer|advisory)$","default":"package","title":"Kind"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":40,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/attack-surface":{"get":{"summary":"Api Attack Surface","description":"Everything one npm account can reach: Maintainer -MAINTAINS-> Package\n-REQUIRED_BY*-> the blast radius. Two hops, two edge types.\n\nThe number that matters after an account is phished is not how many\npackages they publish, but how much of npm sits downstream of those.","operationId":"api_attack_surface_api_attack_surface_get","parameters":[{"name":"maintainer","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":214,"title":"Maintainer"}},{"name":"depth","in":"query","required":false,"schema":{"type":"integer","maximum":8,"minimum":1,"default":4,"title":"Depth"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/why-exposed":{"get":{"summary":"Api Why Exposed","description":"The actual chain, hop by hop — not merely that a chain exists.\n\nThe depth is computed in the graph and is authoritative. The concrete path\nis rebuilt from the sidecar (HydraDB 0.1.0 returns no path binding) and\nthen every hop is re-confirmed against the graph.","operationId":"api_why_exposed_api_why_exposed_get","parameters":[{"name":"from","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":214,"title":"From"}},{"name":"to","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":214,"title":"To"}},{"name":"depth","in":"query","required":false,"schema":{"type":"integer","maximum":8,"minimum":1,"default":6,"title":"Depth"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/blast-advisory":{"get":{"summary":"Api Blast Advisory","description":"Blast radius of a CVE rather than of a package: Advisory -AFFECTS->\nPackage -REQUIRED_BY*-> everyone downstream.","operationId":"api_blast_advisory_api_blast_advisory_get","parameters":[{"name":"osv_id","in":"query","required":true,"schema":{"type":"string","minLength":3,"maxLength":64,"title":"Osv Id"}},{"name":"depth","in":"query","required":false,"schema":{"type":"integer","maximum":8,"minimum":1,"default":4,"title":"Depth"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/typosquat-risk":{"get":{"summary":"Api Typosquat Risk","description":"Similarly-named packages, and how many packages already pull each one.\nA near-miss name with real dependents is an incident, not a curiosity.","operationId":"api_typosquat_risk_api_typosquat_risk_get","parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":214,"pattern":"^(?:@[a-z0-9][a-z0-9._-]*/)?[a-z0-9][a-z0-9._-]*$","title":"Name"}},{"name":"depth","in":"query","required":false,"schema":{"type":"integer","maximum":8,"minimum":1,"default":3,"title":"Depth"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/intel":{"get":{"summary":"Api Intel","description":"Is this package real, current, and compromised? — live, for any of npm.\n\nThis is the half the graph cannot answer. The crawl covers 27k packages;\nnpm has 4.3 million, and none of them carry a \"this is malware\" flag in\ntheir dependency edges. Registry and OSV are queried at request time, so\nthis works for a package published a minute ago.","operationId":"api_intel_api_intel_get","parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":214,"pattern":"^(?:@[a-z0-9][a-z0-9._-]*/)?[a-z0-9][a-z0-9._-]*$","title":"Name"}},{"name":"version","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"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/scan":{"get":{"summary":"Api Scan","description":"Download the published tarball and read it. Optionally diff a release.\n\nSlow by nature — it fetches and unpacks real bytes — so it is deliberately\na separate call the console makes on demand rather than part of a query.","operationId":"api_scan_api_scan_get","parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":214,"pattern":"^(?:@[a-z0-9][a-z0-9._-]*/)?[a-z0-9][a-z0-9._-]*$","title":"Name"}},{"name":"version","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"title":"Version"}},{"name":"against","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Against"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/fix":{"get":{"summary":"Api Fix","description":"A remediation bundle: the safe version, the exact commands, the\n`overrides` block, and a self-contained brief for a coding agent.\n\nKnowing you are exposed is only half of it. This is the half that closes\nthe incident — and the safe version it names is checked against OSV rather\nthan assumed to be `latest`.","operationId":"api_fix_api_fix_get","parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":214,"pattern":"^(?:@[a-z0-9][a-z0-9._-]*/)?[a-z0-9][a-z0-9._-]*$","title":"Name"}},{"name":"bad_version","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"title":"Bad Version"}},{"name":"depth","in":"query","required":false,"schema":{"type":"integer","maximum":8,"minimum":1,"default":5,"title":"Depth"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/subgraph":{"get":{"summary":"Api Subgraph","description":"A drawable slice of the radius: nodes by depth, plus the edges.","operationId":"api_subgraph_api_subgraph_get","parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":214,"pattern":"^(?:@[a-z0-9][a-z0-9._-]*/)?[a-z0-9][a-z0-9._-]*$","title":"Name"}},{"name":"depth","in":"query","required":false,"schema":{"type":"integer","maximum":8,"minimum":1,"default":3,"title":"Depth"}},{"name":"per_level","in":"query","required":false,"schema":{"type":"integer","maximum":120,"minimum":1,"default":28,"title":"Per Level"}},{"name":"max_nodes","in":"query","required":false,"schema":{"type":"integer","maximum":600,"minimum":2,"default":160,"title":"Max Nodes"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/events":{"get":{"summary":"Api Events","description":"Server-sent events: the live state of the system, pushed.\n\nThe header used to poll /api/stats every four seconds, which is both\nlaggier and more work. This pushes a frame whenever something changes and a\nkeepalive otherwise, and the console falls back to polling if the stream\ncannot be established.","operationId":"api_events_api_events_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/typosquats":{"get":{"summary":"Api Typosquats","description":"One-edit neighbours of this name that actually exist on npm.","operationId":"api_typosquats_api_typosquats_get","parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":214,"pattern":"^(?:@[a-z0-9][a-z0-9._-]*/)?[a-z0-9][a-z0-9._-]*$","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/search":{"get":{"summary":"Api Search","description":"Autocomplete over every name the crawl has seen.","operationId":"api_search_api_search_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":214,"default":"","title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":12,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/live/status":{"get":{"summary":"Api Live Status","description":"What the ingestion daemon is actually doing, per registry.\n\nThis is deliberately unflattering: an ecosystem that is backed off, erroring\nor stopped says so, with the last error and the seconds since its last\nsuccessful poll. A monitoring product whose own status page is optimistic is\nnot a monitoring product.","operationId":"api_live_status_api_live_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/live/events":{"get":{"summary":"Api Live Events","description":"Packages written into the graph in the last few minutes, newest first.","operationId":"api_live_events_api_live_events_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":40,"title":"Limit"}},{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","maxLength":20,"default":"","title":"Ecosystem"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/watch/register":{"post":{"summary":"Api Watch Register","description":"Register a project from its lockfile or manifest.\n\nThe body is the raw file. Everything it resolves becomes an edge into the\ngraph, so a publish anywhere upstream routes here without a subscriber\ntable. The returned token is shown once and is required by every other\nendpoint for this project — it is not recoverable, and it is not stored in\na form we can read back to you.","operationId":"api_watch_register_api_watch_register_post","parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":120,"title":"Name"}},{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","maxLength":20,"default":"","title":"Ecosystem"}},{"name":"filename","in":"query","required":false,"schema":{"type":"string","maxLength":120,"default":"","title":"Filename"}},{"name":"webhook","in":"query","required":false,"schema":{"type":"string","maxLength":500,"default":"","title":"Webhook"}},{"name":"depth","in":"query","required":false,"schema":{"type":"integer","maximum":4,"minimum":0,"default":0,"title":"Depth"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/watch/{pid}":{"get":{"summary":"Api Watch Status","operationId":"api_watch_status_api_watch__pid__get","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}},{"name":"token","in":"query","required":false,"schema":{"type":"string","maxLength":200,"default":"","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Api Watch Delete","operationId":"api_watch_delete_api_watch__pid__delete","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}},{"name":"token","in":"query","required":false,"schema":{"type":"string","maxLength":200,"default":"","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/watch/{pid}/alerts":{"get":{"summary":"Api Watch Alerts","description":"Alerts for this project, newest first.\n\n`since` is the highest alert id you have already handled, which makes this\nsafe to poll on a schedule: you get exactly what is new, and nothing twice.","operationId":"api_watch_alerts_api_watch__pid__alerts_get","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}},{"name":"token","in":"query","required":false,"schema":{"type":"string","maxLength":200,"default":"","title":"Token"}},{"name":"since","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Since"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"min_severity","in":"query","required":false,"schema":{"type":"string","pattern":"^(info|medium|high|critical)$","default":"info","title":"Min Severity"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/watch/{pid}/ack/{alert_id}":{"post":{"summary":"Api Watch Ack","operationId":"api_watch_ack_api_watch__pid__ack__alert_id__post","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}},{"name":"alert_id","in":"path","required":true,"schema":{"type":"integer","title":"Alert Id"}},{"name":"token","in":"query","required":false,"schema":{"type":"string","maxLength":200,"default":"","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/watch/{pid}/stream":{"get":{"summary":"Api Watch Stream","description":"Server-sent events: one message per alert, as it is routed.\n\nA heartbeat every 15 seconds keeps proxies from closing an idle connection\nand lets the client tell \"nothing has happened\" apart from \"the stream\ndied\", which are very different things to a system you are trusting to\nwake you up.","operationId":"api_watch_stream_api_watch__pid__stream_get","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}},{"name":"token","in":"query","required":false,"schema":{"type":"string","maxLength":200,"default":"","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/watch":{"get":{"summary":"Api Watch Stats","description":"Aggregate monitoring numbers — no project details, no token required.","operationId":"api_watch_stats_api_watch_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/":{"get":{"summary":"Index","operationId":"index__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/check":{"get":{"summary":"Page Check","operationId":"page_check_check_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/developers":{"get":{"summary":"Page Developers","operationId":"page_developers_developers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/dashboard":{"get":{"summary":"Page Dashboard","operationId":"page_dashboard_dashboard_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/signin":{"get":{"summary":"Page Signin","operationId":"page_signin_signin_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/auth/signup":{"post":{"summary":"Auth Signup","operationId":"auth_signup_api_auth_signup_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/auth/login":{"post":{"summary":"Auth Login","operationId":"auth_login_api_auth_login_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/auth/logout":{"post":{"summary":"Auth Logout","operationId":"auth_logout_api_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/auth/reset":{"post":{"summary":"Auth Reset","operationId":"auth_reset_api_auth_reset_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/auth/me":{"get":{"summary":"Auth Me","operationId":"auth_me_api_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/keys":{"get":{"summary":"Keys List","operationId":"keys_list_api_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Keys Create","operationId":"keys_create_api_keys_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/keys/{key_id}":{"delete":{"summary":"Keys Revoke","operationId":"keys_revoke_api_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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/monitors":{"get":{"summary":"Monitors List","operationId":"monitors_list_api_monitors_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Monitors Add","operationId":"monitors_add_api_monitors_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/monitors/{monitor_id}":{"delete":{"summary":"Monitors Remove","operationId":"monitors_remove_api_monitors__monitor_id__delete","parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","title":"Monitor Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/alerts":{"get":{"summary":"Alerts List","operationId":"alerts_list_api_alerts_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/alerts/read":{"post":{"summary":"Alerts Read","operationId":"alerts_read_api_alerts_read_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/security-log":{"get":{"summary":"Security Log","operationId":"security_log_api_security_log_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":400,"minimum":1,"default":80,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/account/events":{"get":{"summary":"Account Events","description":"Server-sent events for one account: alerts and monitor observations as\nthey happen, so the dashboard never polls.","operationId":"account_events_api_account_events_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/webhooks":{"get":{"summary":"Webhooks List","operationId":"webhooks_list_api_webhooks_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Webhooks Add","operationId":"webhooks_add_api_webhooks_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/webhooks/{webhook_id}":{"delete":{"summary":"Webhooks Remove","operationId":"webhooks_remove_api_webhooks__webhook_id__delete","parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/webhooks/{webhook_id}/test":{"post":{"summary":"Webhooks Test","description":"Send a real signed delivery now, so an endpoint is proven before an\nincident depends on it.","operationId":"webhooks_test_api_webhooks__webhook_id__test_post","parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/docs.json":{"get":{"summary":"Docs Json","operationId":"docs_json_api_docs_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/docs.md":{"get":{"summary":"Docs Md","operationId":"docs_md_api_docs_md_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/docs.txt":{"get":{"summary":"Docs Txt","operationId":"docs_txt_api_docs_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/platform-stats":{"get":{"summary":"Platform Stats","description":"What is actually configured and running. Safe to expose: it reports\nwhether a secret is set and valid, never the secret.","operationId":"platform_stats_api_platform_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/whoami":{"get":{"summary":"V1 Whoami","operationId":"v1_whoami_api_v1_whoami_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/blast":{"get":{"summary":"V1 Blast","operationId":"v1_blast_api_v1_blast_get","parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":214,"title":"Name"}},{"name":"depth","in":"query","required":false,"schema":{"type":"integer","maximum":5,"minimum":1,"default":5,"title":"Depth"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200000,"minimum":1,"default":5000,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/resolve":{"get":{"summary":"V1 Resolve","operationId":"v1_resolve_api_v1_resolve_get","parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":214,"title":"Name"}},{"name":"bad_version","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"title":"Bad Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/maintainers":{"get":{"summary":"V1 Maintainers","operationId":"v1_maintainers_api_v1_maintainers_get","parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":214,"title":"Name"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":1,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/typosquats":{"get":{"summary":"V1 Typosquats","operationId":"v1_typosquats_api_v1_typosquats_get","parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":214,"title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/subgraph":{"get":{"summary":"V1 Subgraph","operationId":"v1_subgraph_api_v1_subgraph_get","parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":214,"title":"Name"}},{"name":"depth","in":"query","required":false,"schema":{"type":"integer","maximum":5,"minimum":1,"default":2,"title":"Depth"}},{"name":"per_level","in":"query","required":false,"schema":{"type":"integer","maximum":120,"minimum":1,"default":28,"title":"Per Level"}},{"name":"max_nodes","in":"query","required":false,"schema":{"type":"integer","maximum":600,"minimum":2,"default":160,"title":"Max Nodes"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/lockfile":{"post":{"summary":"V1 Lockfile","operationId":"v1_lockfile_api_v1_lockfile_post","parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":214,"title":"Name"}},{"name":"bad_version","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Bad Version"}},{"name":"depth","in":"query","required":false,"schema":{"type":"integer","maximum":5,"minimum":1,"default":5,"title":"Depth"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/audit":{"post":{"summary":"V1 Audit","operationId":"v1_audit_api_v1_audit_post","parameters":[{"name":"max_detail","in":"query","required":false,"schema":{"type":"integer","maximum":300,"minimum":1,"default":60,"title":"Max Detail"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/monitors":{"get":{"summary":"V1 Monitors","operationId":"v1_monitors_api_v1_monitors_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"V1 Monitor Add","operationId":"v1_monitor_add_api_v1_monitors_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/monitors/{monitor_id}":{"delete":{"summary":"V1 Monitor Remove","operationId":"v1_monitor_remove_api_v1_monitors__monitor_id__delete","parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","title":"Monitor Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/alerts":{"get":{"summary":"V1 Alerts","operationId":"v1_alerts_api_v1_alerts_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks":{"get":{"summary":"V1 Webhooks","operationId":"v1_webhooks_api_v1_webhooks_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"V1 Webhook Add","operationId":"v1_webhook_add_api_v1_webhooks_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/webhooks/{webhook_id}":{"delete":{"summary":"V1 Webhook Remove","operationId":"v1_webhook_remove_api_v1_webhooks__webhook_id__delete","parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"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"}}}}