{"openapi":"3.1.0","info":{"title":"LeakWatch API","description":"LeakWatch public API — search for secrets leaked in public repositories.\n\n**Authentication.** Most read endpoints work without a key, rate limited per IP.\nAccount features (your own leaks, scans, monitoring) require an API key: create\none in your dashboard, then send it as an `Authorization: Bearer lw_live_…`\nheader. Your rate limit then follows your plan.\n\n**Masked values.** Public endpoints never return secrets in clear text — only\nthe type prefix is shown. The full value of a leak is available solely to its\nowner, through a key whose account identity has been verified.","version":"1.0.6"},"servers":[{"url":"/api/v1","description":"Public API"}],"paths":{"/health":{"get":{"tags":["Meta"],"summary":"Liveness probe","description":"Always returns `{\"status\": \"ok\"}` — enough to wire up an external healthcheck.","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Health"}}}}}}},"/version":{"get":{"tags":["Meta"],"summary":"API version","description":"The name and version of the running API.","operationId":"version_version_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Version"}}}}}}},"/detectors":{"get":{"tags":["Meta"],"summary":"Detector catalogue","description":"Every secret type the engine recognises, with its severity.\n\nSorted by severity (critical → low), then by name. This is the same taxonomy\nas the `type` field of a leak, so you can use it to filter or classify what\nyou receive.","operationId":"list_detectors_detectors_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Detectors"}}}}}}},"/leaks/recent":{"get":{"tags":["Leaks"],"summary":"Latest detected leaks","description":"The 50 most recent detections, masked and detached from their repository.\n\nNeither the repository name nor the commit URL is ever returned here, and\nsecrets are cut down to their type prefix — this feed is proof that keys\nleak, not a map to live ones.","operationId":"recent_leaks_leaks_recent_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecentLeaks"}}}}}}},"/leaks/search":{"get":{"tags":["Leaks"],"summary":"Leaks for an account","description":"Aggregated counts of the leaks tied to an account, by severity and repository.\n\nNever returns secrets or URLs: this is a summary, not an index you can walk.\nOwner-only sources (Codeberg, which has no public firehose) require an API\nkey whose verified identity proves you own the account.","operationId":"search_leaks_leaks_search_get","security":[{"API key":[]}],"parameters":[{"name":"account","in":"query","required":true,"schema":{"type":"string","description":"Username on the forge — repository owner or push author.","examples":["octocat"],"title":"Account"},"description":"Username on the forge — repository owner or push author."},{"name":"source","in":"query","required":true,"schema":{"type":"string","description":"Forge to search: `github`, `gitlab` or `codeberg`.","examples":["github"],"title":"Source"},"description":"Forge to search: `github`, `gitlab` or `codeberg`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeaksSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/leaks/stats":{"get":{"tags":["Leaks"],"summary":"Global statistics","description":"Global counters: all-time total, last 24 hours, and severity breakdown.\n\nServed from a short shared cache, so consecutive calls may return the same\nfigures for a few minutes.","operationId":"stats_leaks_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Stats"}}}}}}},"/leaks/trends":{"get":{"tags":["Leaks"],"summary":"Daily leak volume by vendor","description":"Daily finding counts per vendor, precomputed hourly into\n`finding_daily_stats`. Days with no detections still appear, at zero —\na chart shouldn't have to guess whether a gap means \"no leaks\" or\n\"no data\".","operationId":"trends_leaks_trends_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"description":"Window size, ending today (UTC).","default":30,"title":"Days"},"description":"Window size, ending today (UTC)."},{"name":"top","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"description":"Vendors shown individually; the rest is folded into `Other`.","default":8,"title":"Top"},"description":"Vendors shown individually; the rest is folded into `Other`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Trends"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/leaks/trending":{"get":{"tags":["Leaks"],"summary":"Vendors trending up","description":"Vendors whose leak volume grew the most over the last 7 days compared\nto the 7 days before that. `Other` (unmapped/generic secret types) is\nexcluded — it isn't a vendor, and lumping unrelated types together would\nmake its growth meaningless.","operationId":"trending_leaks_trending_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Trending"}}}}}}},"/me":{"get":{"tags":["Account"],"summary":"Your account","description":"Who this API key belongs to, which plan applies, and what quota is left.\n\nCall this to discover your own limits rather than hard-coding them: the\nrate limit and deep-scan quota returned here are the ones actually enforced.","operationId":"me_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Me"}}}}},"security":[{"API key":[]}]}},"/me/leaks":{"get":{"tags":["Account"],"summary":"Your own leaks","description":"Every secret detected across the repositories of your verified identities.\n\nCovers all sources — continuous monitoring, deep scans and the public\nfirehose. Ordered by urgency: keys proven still active first, then by\nseverity, then most recent.\n\nOn a paid plan the full secret, commit URL and liveness are included so you\ncan revoke precisely. On the free plan those three stay null and only the\nmasked prefix is returned.","operationId":"my_leaks_me_leaks_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MyLeaks"}}}}},"security":[{"API key":[]}]}},"/me/leaks/{leak_id}/validate":{"post":{"tags":["Account"],"summary":"Re-test one of your leaked keys","description":"Ask the provider whether one of your leaked keys still authenticates.\n\nScoped to your own leaks on purpose: you may only re-test a credential that\nwas found in a repository belonging to one of your verified identities. The\nendpoint takes a leak id from `GET /me/leaks`, never a raw key value — it is\na remediation tool for your own exposure, not a way to test credentials in\ngeneral.\n\nRuns asynchronously and returns immediately. Poll `GET /me/leaks` and read\n`still_active` for the verdict. Requires a paid plan.","operationId":"validate_my_leak_me_leaks__leak_id__validate_post","security":[{"API key":[]}],"parameters":[{"name":"leak_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Leak Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationQueued"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/scans":{"get":{"tags":["Scans"],"summary":"Your scans","description":"Your 50 most recent deep scans, newest first.","operationId":"list_scans_scans_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Scan"},"type":"array","title":"Response List Scans Scans Get"}}}}},"security":[{"API key":[]}]},"post":{"tags":["Scans"],"summary":"Start a deep scan","description":"Scan the full git history of one of your public repositories.\n\nRuns asynchronously: this returns immediately with a `queued` scan. Poll\n`GET /scans/{id}` for progress, then `GET /scans/{id}/report` once it\nsucceeds. Free accounts get one scan per rolling window — see\n`deep_scan_quota` in `GET /me`. Only one scan may run at a time.","operationId":"create_scan_scans_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Scan"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"API key":[]}]}},"/scans/{scan_id}":{"get":{"tags":["Scans"],"summary":"Scan status","description":"Progress of one of your scans. Poll this while `status` is queued or running.","operationId":"get_scan_scans__scan_id__get","security":[{"API key":[]}],"parameters":[{"name":"scan_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Scan Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Scan"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/scans/{scan_id}/report":{"get":{"tags":["Scans"],"summary":"Scan report","description":"Everything currently known about the scanned repository.\n\nNot merely what this run inserted: secrets already known from another source\nare included, because they are just as exposed. Values are returned in full —\nit is your own repository, and a masked value would not tell you which key\nto revoke.","operationId":"get_scan_report_scans__scan_id__report_get","security":[{"API key":[]}],"parameters":[{"name":"scan_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Scan Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanReport"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/monitors":{"get":{"tags":["Monitors"],"summary":"Your monitored repositories","description":"Repositories you have under continuous monitoring, newest first.","operationId":"list_monitors_monitors_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Monitor"},"type":"array","title":"Response List Monitors Monitors Get"}}}}},"security":[{"API key":[]}]},"post":{"tags":["Monitors"],"summary":"Monitor a repository","description":"Put one of your repositories under continuous monitoring.\n\nPrivate repositories are supported on GitHub, provided the LeakWatch GitHub\nApp is installed on them — that installation is the only thing that can read\nthem, and their findings never appear in any public view.\n\nFrom then on, new commits are scanned as they land and you are alerted\nthrough the channels configured on your account. Requires a paid plan, and\nthe repository must belong to one of your verified identities.","operationId":"create_monitor_monitors_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Monitor"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"API key":[]}]}},"/monitors/{monitor_id}":{"delete":{"tags":["Monitors"],"summary":"Stop monitoring","description":"Stop watching a repository.\n\nSecrets already detected are kept and stay visible in `GET /me/leaks`; only\nthe commit history and scan logs of that repository are removed.","operationId":"delete_monitor_monitors__monitor_id__delete","security":[{"API key":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Monitor Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/monitors/{monitor_id}/findings":{"get":{"tags":["Monitors"],"summary":"Secrets found in a monitored repository","description":"Every secret currently known for one of your monitored repositories.\n\nValues are returned in full: the repository is yours, and a masked value\nwould not tell you which key to revoke.","operationId":"monitor_findings_monitors__monitor_id__findings_get","security":[{"API key":[]}],"parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Monitor Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MonitorFinding"},"title":"Response Monitor Findings Monitors  Monitor Id  Findings Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/scan/content":{"post":{"tags":["Scanner"],"summary":"Scan text for secrets","description":"Detect secrets in text you submit — nothing is stored.\n\nPoint a CI job at this endpoint to fail a build before a key ever reaches a\npublic repository. The same engine that powers our public scanning runs\nhere, with the full detector catalogue (see `GET /detectors`).\n\n**Your content is not kept.** It is scanned in memory and discarded when the\nresponse is sent: no database row is written, and it is never forwarded to\nany third party — detection is local pattern matching, not a model call.\n\nDetected values are returned in full, since they came from the content you\nsubmitted. Results are best-effort pattern matches: a hit is not proof the\ncredential is live, and this endpoint never tests it against its provider.","operationId":"scan_content_scan_content_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentScanRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentScanResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"API key":[]}]}}},"components":{"schemas":{"ContentScanRequest":{"properties":{"content":{"type":"string","title":"Content","description":"Raw text to scan: a diff, a file, an environment block. Scanned in memory and discarded — never stored.","examples":["AWS_SECRET=AKIAIOSFODNN7EXAMPLE\n"]},"filename":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Filename","description":"Optional label echoed back in the response, to tag results in CI."}},"type":"object","required":["content"],"title":"ContentScanRequest"},"ContentScanResult":{"properties":{"filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filename"},"count":{"type":"integer","title":"Count","description":"Number of secrets detected."},"bytes_scanned":{"type":"integer","title":"Bytes Scanned"},"secrets":{"items":{"$ref":"#/components/schemas/DetectedSecret"},"type":"array","title":"Secrets"}},"type":"object","required":["count","bytes_scanned","secrets"],"title":"ContentScanResult"},"DetectedSecret":{"properties":{"type":{"type":"string","title":"Type","description":"Secret type, e.g. `AWS Access Token`."},"severity":{"type":"string","title":"Severity","description":"One of: critical, high, medium, low."},"value":{"type":"string","title":"Value","description":"The matched value, in full — it came from the content you sent."},"line":{"type":"integer","title":"Line","description":"1-based line number in the submitted content."}},"type":"object","required":["type","severity","value","line"],"title":"DetectedSecret"},"Detector":{"properties":{"type":{"type":"string","title":"Type","description":"Secret type, as reported in the `type` field of a leak."},"severity":{"type":"string","title":"Severity","description":"One of: critical, high, medium, low."}},"type":"object","required":["type","severity"],"title":"Detector"},"Detectors":{"properties":{"count":{"type":"integer","title":"Count"},"detectors":{"items":{"$ref":"#/components/schemas/Detector"},"type":"array","title":"Detectors"}},"type":"object","required":["count","detectors"],"title":"Detectors"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"Health":{"properties":{"status":{"type":"string","title":"Status","default":"ok"}},"type":"object","title":"Health"},"Identity":{"properties":{"provider":{"type":"string","title":"Provider","description":"Forge: `github`, `gitlab` or `codeberg`."},"username":{"type":"string","title":"Username","description":"Your username on that forge."},"verified":{"type":"boolean","title":"Verified","description":"Only verified identities widen your leak scope."}},"type":"object","required":["provider","username","verified"],"title":"Identity"},"Leak":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"repo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Repo","description":"Repository the secret was found in."},"type":{"type":"string","title":"Type","description":"Secret type, e.g. `AWS Access Token`."},"severity":{"type":"string","title":"Severity","description":"One of: critical, high, medium, low."},"masked_secret":{"type":"string","title":"Masked Secret","description":"Type prefix only. See `secret` for the full value."},"discovered_at":{"type":"string","format":"date-time","title":"Discovered At","description":"When LeakWatch detected it (UTC)."},"origin":{"type":"string","title":"Origin","description":"How it was found: `deep_scan`, `monitoring`, `firehose`."},"revoke_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Revoke Url","description":"Provider page to revoke this credential, when known."},"secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secret","description":"Full value. Paid plans only, null otherwise."},"commit_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Commit Url","description":"Paid plans only."},"still_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Still Active","description":"Whether the key still authenticates. Paid plans only."}},"type":"object","required":["id","repo","type","severity","masked_secret","discovered_at","origin"],"title":"Leak"},"LeaksSummary":{"properties":{"account":{"type":"string","title":"Account","description":"The account that was searched."},"source":{"type":"string","title":"Source","description":"The forge that was searched."},"total":{"type":"integer","title":"Total","description":"Total leaks tied to this account."},"distinct_repos":{"type":"integer","title":"Distinct Repos","description":"Number of distinct repositories affected."},"by_severity":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Severity","description":"Counts keyed by severity: critical, high, medium, low."}},"type":"object","required":["account","source","total","distinct_repos","by_severity"],"title":"LeaksSummary"},"Me":{"properties":{"account_id":{"type":"string","format":"uuid","title":"Account Id","description":"Stable identifier for your account."},"plan":{"type":"string","title":"Plan","description":"`free`, `solo` or `team`."},"plan_active":{"type":"boolean","title":"Plan Active","description":"False on `free`, or once a paid plan has expired."},"plan_expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Plan Expires At","description":"End of the paid period, if any."},"rate_limit":{"type":"string","title":"Rate Limit","description":"Requests allowed per key, e.g. `60/minute`."},"identities":{"items":{"$ref":"#/components/schemas/Identity"},"type":"array","title":"Identities","description":"Forge accounts linked to you."},"deep_scan_quota":{"$ref":"#/components/schemas/Quota"}},"type":"object","required":["account_id","plan","plan_active","plan_expires_at","rate_limit","identities","deep_scan_quota"],"title":"Me"},"Monitor":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"},"repo_full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Repo Full Name"},"default_branch":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Branch"},"last_checked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Checked At","description":"Last time LeakWatch looked for new commits."},"is_active":{"type":"boolean","title":"Is Active","description":"False pauses scanning without losing history."},"is_private":{"type":"boolean","title":"Is Private","description":"Private repository, readable only through your GitHub App installation. Its findings never appear in any public view.","default":false},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","is_active","created_at"],"title":"Monitor"},"MonitorCreate":{"properties":{"repo_full_name":{"type":"string","title":"Repo Full Name","description":"Repository to watch, as `owner/repo`. Must be one of yours.","examples":["octocat/hello-world"]},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider","description":"Forge: `github`, `gitlab` or `codeberg`. Optional — inferred from the owner when only one of your linked identities matches."}},"type":"object","required":["repo_full_name"],"title":"MonitorCreate"},"MonitorFinding":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"type":{"type":"string","title":"Type","description":"Secret type, e.g. `AWS Access Token`."},"severity":{"type":"string","title":"Severity"},"discovered_at":{"type":"string","format":"date-time","title":"Discovered At"},"commit_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Commit Url"},"secret":{"type":"string","title":"Secret","description":"Full value — this is your own repository."},"still_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Still Active"},"revoke_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Revoke Url"}},"type":"object","required":["id","type","severity","discovered_at","secret"],"title":"MonitorFinding"},"MyLeaks":{"properties":{"total":{"type":"integer","title":"Total","description":"Total leaks tied to your account."},"returned":{"type":"integer","title":"Returned","description":"How many are in this response (capped at 500)."},"plan_active":{"type":"boolean","title":"Plan Active","description":"When false, `secret`, `commit_url` and `still_active` stay null."},"leaks":{"items":{"$ref":"#/components/schemas/Leak"},"type":"array","title":"Leaks"}},"type":"object","required":["total","returned","plan_active","leaks"],"title":"MyLeaks"},"Quota":{"properties":{"unlimited":{"type":"boolean","title":"Unlimited","description":"True on paid plans — deep scans are not metered."},"used":{"type":"integer","title":"Used","description":"Deep scans started in the current window."},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit","description":"Scans allowed per window, null when unlimited."},"allowed":{"type":"boolean","title":"Allowed","description":"Whether you can start a scan right now."},"reset_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Reset At","description":"When the window rolls over (UTC)."},"window_days":{"type":"integer","title":"Window Days","description":"Length of the quota window, in days."}},"type":"object","required":["unlimited","used","limit","allowed","reset_at","window_days"],"title":"Quota"},"RecentLeak":{"properties":{"type":{"type":"string","title":"Type","description":"Secret type, e.g. `AWS Access Token`."},"forge":{"type":"string","title":"Forge","description":"Where it was found: `github`, `gitlab` or `codeberg`."},"masked_secret":{"type":"string","title":"Masked Secret","description":"Type prefix only — never enough to reconstruct the key."},"discovered_at":{"type":"string","format":"date-time","title":"Discovered At","description":"When LeakWatch detected it (UTC)."}},"type":"object","required":["type","forge","masked_secret","discovered_at"],"title":"RecentLeak"},"RecentLeaks":{"properties":{"leaks":{"items":{"$ref":"#/components/schemas/RecentLeak"},"type":"array","title":"Leaks"}},"type":"object","required":["leaks"],"title":"RecentLeaks"},"ReportFinding":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"type":{"type":"string","title":"Type","description":"Secret type, e.g. `AWS Access Token`."},"severity":{"type":"string","title":"Severity"},"discovered_at":{"type":"string","format":"date-time","title":"Discovered At"},"commit_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Commit Url"},"secret":{"type":"string","title":"Secret","description":"Full value — this is your own repository."},"still_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Still Active","description":"Whether the key still authenticates, when tested."},"revoke_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Revoke Url"}},"type":"object","required":["id","type","severity","discovered_at","secret"],"title":"ReportFinding"},"Scan":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"provider":{"type":"string","title":"Provider"},"repo_full_name":{"type":"string","title":"Repo Full Name"},"status":{"type":"string","title":"Status","description":"`queued`, `running`, `success` or `failed`."},"commits_total":{"type":"integer","title":"Commits Total","description":"Commits to inspect, known once running."},"commits_done":{"type":"integer","title":"Commits Done","description":"Commits inspected so far."},"findings_count":{"type":"integer","title":"Findings Count","description":"Secrets found by this scan."},"truncated":{"type":"boolean","title":"Truncated","description":"True when the history hit the commit ceiling."},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","provider","repo_full_name","status","commits_total","commits_done","findings_count","truncated","created_at"],"title":"Scan"},"ScanCreate":{"properties":{"repo_full_name":{"type":"string","title":"Repo Full Name","description":"Repository to scan, as `owner/repo`. Must be one of yours.","examples":["octocat/hello-world"]},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider","description":"Forge: `github`, `gitlab` or `codeberg`. Optional — inferred from the owner when only one of your linked identities matches."}},"type":"object","required":["repo_full_name"],"title":"ScanCreate"},"ScanReport":{"properties":{"scan":{"$ref":"#/components/schemas/Scan"},"total":{"type":"integer","title":"Total","description":"Secrets currently known for this repository."},"active_count":{"type":"integer","title":"Active Count","description":"How many are confirmed still working."},"by_severity":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Severity"},"findings":{"items":{"$ref":"#/components/schemas/ReportFinding"},"type":"array","title":"Findings"},"findings_truncated":{"type":"boolean","title":"Findings Truncated","description":"True when the list was capped at 200."}},"type":"object","required":["scan","total","active_count","by_severity","findings","findings_truncated"],"title":"ScanReport"},"Stats":{"properties":{"total_findings":{"type":"integer","title":"Total Findings","description":"All-time number of detections."},"last_24h":{"type":"integer","title":"Last 24H","description":"Detections in the last 24 hours."},"by_severity":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Severity","description":"Counts keyed by severity: critical, high, medium, low."}},"type":"object","required":["total_findings","last_24h","by_severity"],"title":"Stats"},"TrendDay":{"properties":{"day":{"type":"string","format":"date","title":"Day","description":"Day (UTC)."},"total":{"type":"integer","title":"Total","description":"All findings that day, every vendor combined."},"by_vendor":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Vendor","description":"Counts for the vendors with the most volume over the whole window (`top` query param), plus an `Other` bucket for the rest."}},"type":"object","required":["day","total","by_vendor"],"title":"TrendDay"},"Trending":{"properties":{"window_days":{"type":"integer","title":"Window Days"},"vendors":{"items":{"$ref":"#/components/schemas/TrendingVendor"},"type":"array","title":"Vendors"}},"type":"object","required":["window_days","vendors"],"title":"Trending"},"TrendingVendor":{"properties":{"vendor":{"type":"string","title":"Vendor"},"current_period":{"type":"integer","title":"Current Period","description":"Findings in the last 7 days."},"previous_period":{"type":"integer","title":"Previous Period","description":"Findings in the 7 days before that."},"growth_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Growth Pct","description":"`(current - previous) / previous * 100`, rounded to one decimal. `null` when the previous period had zero findings — there is no baseline to grow from, which is itself the signal: a brand-new or dormant-then-reawakened vendor."}},"type":"object","required":["vendor","current_period","previous_period","growth_pct"],"title":"TrendingVendor"},"Trends":{"properties":{"days":{"items":{"$ref":"#/components/schemas/TrendDay"},"type":"array","title":"Days"}},"type":"object","required":["days"],"title":"Trends"},"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"},"ValidationQueued":{"properties":{"leak_id":{"type":"string","format":"uuid","title":"Leak Id"},"provider":{"type":"string","title":"Provider","description":"Provider the key will be tested against."},"status":{"type":"string","title":"Status","description":"Always `queued` — the test runs asynchronously.","default":"queued"}},"type":"object","required":["leak_id","provider"],"title":"ValidationQueued"},"Version":{"properties":{"name":{"type":"string","title":"Name"},"version":{"type":"string","title":"Version"}},"type":"object","required":["name","version"],"title":"Version"}},"securitySchemes":{"API key":{"type":"http","description":"Your key from the dashboard, sent as `Authorization: Bearer lw_live_…`.","scheme":"bearer"}}}}