{"openapi":"3.1.0","info":{"title":"Since.dev API","version":"1","description":"What changed in the software you depend on, and whether your code is affected. Authenticate with an API key as a Bearer token. Webhook deliveries are signed; each request body is described under webhooks."},"servers":[{"url":"https://api.since.dev"}],"security":[{"apiKey":[]}],"paths":{"/v1/changes":{"get":{"operationId":"changes","summary":"What changed in the software you depend on.","description":"What changed in the software you depend on. Give one of package (any spelling or purl), provider, model, repo (a connected repository id), surface or id (one change, as a check finding names it), or nothing for every change. With repo, reaches=true keeps the changes that reach its code. since takes a date, a version of the package, or cutoff:<model> for the changes after that model's knowledge cutoff. within=90d lists upcoming retirements and end-of-life dates (format=ics for a calendar). surface answers whether a model, API, runtime or package is still supported, deprecated, retired or unknown, with the source. Every change carries its canonical provider and surface, severity, dates, replacement and cited evidence; coverage says which sources were read and how fresh they are. Page with nextCursor. Costs 1 credit plus 1 for every 10 changes returned.","parameters":[{"name":"package","in":"query","description":"A package in any spelling: pkg:npm/react, npm:react, pypi:Django, or a bare name the catalog holds in one registry.","schema":{"type":"string","minLength":1,"maxLength":300}},{"name":"ecosystem","in":"query","description":"The registry of a bare package name, for example npm or pypi.","schema":{"type":"string","maxLength":40}},{"name":"provider","in":"query","description":"A provider, for example anthropic or openai: its models, APIs and runtimes.","schema":{"type":"string","minLength":1,"maxLength":100}},{"name":"model","in":"query","description":"A model id or alias, for example claude-sonnet-4-5-20250929.","schema":{"type":"string","minLength":1,"maxLength":200}},{"name":"repo","in":"query","description":"A connected repository id: changes to everything it depends on.","schema":{"type":"string","minLength":1,"maxLength":200}},{"name":"surface","in":"query","description":"Is this still current? A model id, API host, runtime or package. Answers supported, deprecated, retired or unknown, with the source.","schema":{"type":"string","minLength":1,"maxLength":300}},{"name":"id","in":"query","description":"A change id, as a check finding names it (changeId or triggerIds): that change in full.","schema":{"type":"string","minLength":1,"maxLength":200}},{"name":"reaches","in":"query","description":"With repo: only the changes that reach its code (its open impacts and the end of life of the runtime lines it runs on), not every change to everything it depends on.","schema":{"anyOf":[{"type":"boolean"},{"type":"string","enum":["true","false"]}]}},{"name":"kind","in":"query","description":"Change kinds, comma separated: removed, renamed, signature_changed, deprecated, behavior_changed, default_changed, config_changed, new_capability, security, end_of_life, retirement.","schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}},{"name":"severity","in":"query","description":"Severities, comma separated: critical, high, medium, low, unknown.","schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}},{"name":"within","in":"query","description":"Upcoming effective dates within this many days, for example 90d: the retirement calendar.","schema":{"type":"string","pattern":"^\\d{1,4}d$"}},{"name":"since","in":"query","description":"A date (2026-01-31), a version of the package (18.2.0), or cutoff:<model> for that model's knowledge cutoff.","schema":{"type":"string","minLength":1,"maxLength":220}},{"name":"format","in":"query","description":"ics returns the changes with an effective date as an iCalendar feed. Over the API it is every one in the window, up to 1,000, since a calendar app cannot page; over MCP, up to limit.","schema":{"default":"json","type":"string","enum":["json","ics"]}},{"name":"cursor","in":"query","description":"The nextCursor of the previous page.","schema":{"type":"string","maxLength":500}},{"name":"limit","in":"query","schema":{"default":50,"type":"integer","minimum":1,"maximum":200}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Any string you choose. A retry with the same key and the same input is charged once.","schema":{"type":"string","maxLength":200}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["query","changes","nextCursor","coverage"],"properties":{"query":{"type":"object","additionalProperties":{}},"surface":{"type":"object","required":["kind","key","provider","name","status","replacement","dates","source"],"properties":{"kind":{"type":"string","enum":["api","model","package","runtime"]},"key":{"type":"string"},"provider":{"type":"string"},"name":{"type":"string"},"status":{"type":"string","enum":["deprecated","retired","supported","unknown"]},"replacement":{"type":["string","null"]},"dates":{"type":"object","properties":{"deprecated":{"type":"string"},"announced":{"type":"string"},"notBefore":{"type":"string"},"retires":{"type":"string"},"endOfLife":{"type":"string"},"endOfActiveSupport":{"type":"string"},"endOfExtendedSupport":{"type":"string"}}},"source":{"type":["object","null"],"required":["url","sources"],"properties":{"url":{"type":["string","null"]},"sources":{"type":"array","items":{"type":"string"}}}},"platforms":{"type":"array","items":{"type":"object","required":["platform","status","dates","replacement"],"properties":{"platform":{"type":"string"},"status":{"type":"string","enum":["deprecated","retired","supported","unknown"]},"dates":{"type":"object","properties":{"deprecated":{"type":"string"},"announced":{"type":"string"},"notBefore":{"type":"string"},"retires":{"type":"string"},"endOfLife":{"type":"string"},"endOfActiveSupport":{"type":"string"},"endOfExtendedSupport":{"type":"string"}}},"replacement":{"type":["string","null"]}}}}}},"package":{"type":"object","required":["ecosystem","name","purl","status","latest"],"properties":{"ecosystem":{"type":"string","enum":["actions","cocoapods","conan","crates","docker","gem","go","helm","hex","homebrew","maven","npm","nuget","packagist","pub","pypi","swift","terraform","vcpkg"]},"name":{"type":"string"},"purl":{"type":"string"},"status":{"type":["string","null"]},"latest":{"type":["string","null"]},"since":{"type":"string"},"releasesBehind":{"type":"number"}}},"changes":{"type":"array","items":{"type":"object","required":["id","source","surface","kind","severity","title","summary","replacement","platform","symbol","introducedIn","removedIn","affectedRanges","effectiveDate","dates","evidence","sources","detectedAt","occurredAt","publishedAt","changedAt"],"properties":{"id":{"type":"string"},"source":{"type":"string","enum":["catalog","watch"]},"surface":{"type":"object","required":["kind","key","provider","name"],"properties":{"kind":{"type":"string"},"key":{"type":"string"},"provider":{"type":"string"},"name":{"type":"string"},"ecosystem":{"type":"string","enum":["actions","cocoapods","conan","crates","docker","gem","go","helm","hex","homebrew","maven","npm","nuget","packagist","pub","pypi","swift","terraform","vcpkg"]},"purl":{"type":"string"}}},"kind":{"type":["string","null"],"enum":["behavior_changed","config_changed","default_changed","deprecated","end_of_life","new_capability","removed","renamed","retirement","security","signature_changed",null]},"severity":{"type":"string","enum":["critical","high","low","medium","unknown"]},"title":{"type":"string"},"summary":{"type":["string","null"]},"replacement":{"type":["string","null"]},"platform":{"type":["string","null"]},"symbol":{"type":["string","null"]},"introducedIn":{"type":["string","null"]},"removedIn":{"type":["string","null"]},"affectedRanges":{"type":"array","items":{"type":"object","required":["introduced","fixed","lastAffected"],"properties":{"introduced":{"type":["string","null"]},"fixed":{"type":["string","null"]},"lastAffected":{"type":["string","null"]}}}},"effectiveDate":{"type":["string","null"]},"dates":{"type":"object","properties":{"deprecated":{"type":"string"},"announced":{"type":"string"},"notBefore":{"type":"string"},"retires":{"type":"string"},"endOfLife":{"type":"string"},"endOfActiveSupport":{"type":"string"},"endOfExtendedSupport":{"type":"string"}}},"evidence":{"type":"array","items":{"type":"object","required":["url","quote","sourceKind","license"],"properties":{"url":{"type":"string"},"quote":{"type":["string","null"]},"sourceKind":{"type":["string","null"]},"license":{"type":["string","null"]}}}},"sources":{"type":"array","items":{"type":"string"}},"detectedAt":{"type":"string"},"occurredAt":{"type":["string","null"]},"publishedAt":{"type":["string","null"]},"changedAt":{"type":"string"}}}},"nextCursor":{"type":["string","null"]},"coverage":{"type":"object","required":["sources","missing"],"properties":{"sources":{"type":"array","items":{"type":"object","required":["name","health","historyLoaded","lastSuccessAt","lastItemAt"],"properties":{"name":{"type":"string"},"health":{"type":"string","enum":["active","blocked","degraded","failing"]},"historyLoaded":{"type":"boolean"},"lastSuccessAt":{"type":["string","null"]},"lastItemAt":{"type":["string","null"]}}}},"missing":{"type":"array","items":{"type":"string"}}}},"calendar":{"type":"string"}}}},"text/calendar":{"schema":{"type":"string"}}},"headers":{"X-Credits-Remaining":{"description":"The credits the workspace can still spend, from the month's allowance and the prepaid balance together.","schema":{"type":"integer"}}}},"400":{"description":"`invalid_input`: an unknown field, a missing or malformed value, or inputs that do not go together. The message names the field. Nothing is charged. `ambiguous_package`: a bare package name exists in more than one registry; `details.candidates` lists them.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Credits-Remaining":{"description":"The credits the workspace can still spend, from the month's allowance and the prepaid balance together.","schema":{"type":"integer"}}}},"401":{"description":"`unauthorized`: no API key, or one that is not valid or whose workspace is paused.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`credits_exhausted`: the month's credits and the prepaid balance cannot pay for this call in full; `details` says what it needs. Nothing is charged.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Credits-Remaining":{"description":"The credits the workspace can still spend, from the month's allowance and the prepaid balance together.","schema":{"type":"integer"}}}},"404":{"description":"`not_found`: repo is not a connected repository in this workspace, or id is no change this read has. Nothing is charged.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Credits-Remaining":{"description":"The credits the workspace can still spend, from the month's allowance and the prepaid balance together.","schema":{"type":"integer"}}}},"429":{"description":"`rate_limited`: more requests than one key or address may send in a short time; `retryAfterSec` and Retry-After say when to try again. Nothing is charged.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait before trying again.","schema":{"type":"integer"}}}},"default":{"description":"Anything else, for example `internal` when something went wrong on our side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-mcp-tool":"whats_changed"}},"/v1/changes.ics":{"get":{"operationId":"changes.ics","summary":"What changed in the software you depend on.","description":"What changed in the software you depend on. Give one of package (any spelling or purl), provider, model, repo (a connected repository id), surface or id (one change, as a check finding names it), or nothing for every change. With repo, reaches=true keeps the changes that reach its code. since takes a date, a version of the package, or cutoff:<model> for the changes after that model's knowledge cutoff. within=90d lists upcoming retirements and end-of-life dates (format=ics for a calendar). surface answers whether a model, API, runtime or package is still supported, deprecated, retired or unknown, with the source. Every change carries its canonical provider and surface, severity, dates, replacement and cited evidence; coverage says which sources were read and how fresh they are. Page with nextCursor. Costs 1 credit plus 1 for every 10 changes returned. Served here as a file (text/calendar).","parameters":[{"name":"package","in":"query","description":"A package in any spelling: pkg:npm/react, npm:react, pypi:Django, or a bare name the catalog holds in one registry.","schema":{"type":"string","minLength":1,"maxLength":300}},{"name":"ecosystem","in":"query","description":"The registry of a bare package name, for example npm or pypi.","schema":{"type":"string","maxLength":40}},{"name":"provider","in":"query","description":"A provider, for example anthropic or openai: its models, APIs and runtimes.","schema":{"type":"string","minLength":1,"maxLength":100}},{"name":"model","in":"query","description":"A model id or alias, for example claude-sonnet-4-5-20250929.","schema":{"type":"string","minLength":1,"maxLength":200}},{"name":"repo","in":"query","description":"A connected repository id: changes to everything it depends on.","schema":{"type":"string","minLength":1,"maxLength":200}},{"name":"surface","in":"query","description":"Is this still current? A model id, API host, runtime or package. Answers supported, deprecated, retired or unknown, with the source.","schema":{"type":"string","minLength":1,"maxLength":300}},{"name":"id","in":"query","description":"A change id, as a check finding names it (changeId or triggerIds): that change in full.","schema":{"type":"string","minLength":1,"maxLength":200}},{"name":"reaches","in":"query","description":"With repo: only the changes that reach its code (its open impacts and the end of life of the runtime lines it runs on), not every change to everything it depends on.","schema":{"anyOf":[{"type":"boolean"},{"type":"string","enum":["true","false"]}]}},{"name":"kind","in":"query","description":"Change kinds, comma separated: removed, renamed, signature_changed, deprecated, behavior_changed, default_changed, config_changed, new_capability, security, end_of_life, retirement.","schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}},{"name":"severity","in":"query","description":"Severities, comma separated: critical, high, medium, low, unknown.","schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}},{"name":"within","in":"query","description":"Upcoming effective dates within this many days, for example 90d: the retirement calendar.","schema":{"type":"string","pattern":"^\\d{1,4}d$"}},{"name":"since","in":"query","description":"A date (2026-01-31), a version of the package (18.2.0), or cutoff:<model> for that model's knowledge cutoff.","schema":{"type":"string","minLength":1,"maxLength":220}},{"name":"cursor","in":"query","description":"The nextCursor of the previous page.","schema":{"type":"string","maxLength":500}},{"name":"limit","in":"query","schema":{"default":50,"type":"integer","minimum":1,"maximum":200}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Any string you choose. A retry with the same key and the same input is charged once.","schema":{"type":"string","maxLength":200}}],"responses":{"200":{"description":"OK","content":{"text/calendar":{"schema":{"type":"string"}}},"headers":{"X-Credits-Remaining":{"description":"The credits the workspace can still spend, from the month's allowance and the prepaid balance together.","schema":{"type":"integer"}}}},"400":{"description":"`invalid_input`: an unknown field, a missing or malformed value, or inputs that do not go together. The message names the field. Nothing is charged. `ambiguous_package`: a bare package name exists in more than one registry; `details.candidates` lists them.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Credits-Remaining":{"description":"The credits the workspace can still spend, from the month's allowance and the prepaid balance together.","schema":{"type":"integer"}}}},"401":{"description":"`unauthorized`: no API key, or one that is not valid or whose workspace is paused.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`credits_exhausted`: the month's credits and the prepaid balance cannot pay for this call in full; `details` says what it needs. Nothing is charged.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Credits-Remaining":{"description":"The credits the workspace can still spend, from the month's allowance and the prepaid balance together.","schema":{"type":"integer"}}}},"404":{"description":"`not_found`: repo is not a connected repository in this workspace, or id is no change this read has. Nothing is charged.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Credits-Remaining":{"description":"The credits the workspace can still spend, from the month's allowance and the prepaid balance together.","schema":{"type":"integer"}}}},"429":{"description":"`rate_limited`: more requests than one key or address may send in a short time; `retryAfterSec` and Retry-After say when to try again. Nothing is charged.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait before trying again.","schema":{"type":"integer"}}}},"default":{"description":"Anything else, for example `internal` when something went wrong on our side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/check":{"post":{"operationId":"check","summary":"Check code against what changed.","description":"Check code against what changed. Give one of: model (a model id), package (a version such as npm:react@18.2.0), surface (an API host or runtime), code (a snippet, with its language), manifest or lockfile ({ path, content }), repo (a connected repository id, on the Business and Platform plans) or repoUrl (a public GitHub repository, scanned now). The answer lists what is affected, where (file and line), severity, days left, the replacement and the cited source; anything Since cannot settle is needs_review, never a guess, and names it cannot identify are listed as unresolved. state and severity keep only those findings; a page holds up to limit findings (500 at most; unless set, 50 over MCP and 500 over the API) and nextCursor reads the next. Only the first page is charged: the pages after it, read with nextCursor, hold the same answer and are free for 15 minutes after it; an expired cursor, or one from another check or workspace, is refused with nothing charged. detail=summary gives each finding in short, with its changeId for whats_changed (the default over MCP); detail=full adds the whole change (the default over the API). With a repo, checked lists every version it resolves, transitive ones included. With fix: true and a repo, it opens the fix pull requests (one per provider); with code, it returns the patch. Fixes start on the Team plan and count against the month's fix pull requests, not credits. Send an Idempotency-Key header to retry without paying twice. Costs 2 credits for a model, package, surface or snippet, 20 for a manifest, lockfile, repo or repoUrl.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Any string you choose. A retry with the same key and the same input is charged once.","schema":{"type":"string","maxLength":200}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"model":{"description":"A model id or alias: its lifecycle and every change to it.","type":"string","minLength":1,"maxLength":200},"package":{"description":"A package version in any spelling: npm:react@18.2.0, pkg:pypi/django@4.2. Its lifecycle and the changes from that version to current.","type":"string","minLength":1,"maxLength":300},"ecosystem":{"description":"The registry of a bare package name.","type":"string","maxLength":40},"surface":{"description":"An API host, runtime or other tracked surface.","type":"string","minLength":1,"maxLength":300},"code":{"description":"A code snippet. Imports, API hosts and model ids in it are checked.","type":"string","minLength":1,"maxLength":100000},"language":{"description":"The snippet's language: typescript, javascript, python, go, ruby, rust, php, java, csharp, c or cpp.","type":"string","maxLength":40},"path":{"description":"The snippet's file name, instead of language.","type":"string","maxLength":300},"manifest":{"description":"A manifest's contents, for example package.json or pyproject.toml.","type":"object","properties":{"path":{"type":"string","minLength":1,"maxLength":300,"description":"The file's name or path, for example package-lock.json."},"content":{"type":"string","minLength":1,"maxLength":500000}},"required":["path","content"],"additionalProperties":false},"lockfile":{"description":"A lockfile's contents, for example package-lock.json or poetry.lock.","type":"object","properties":{"path":{"type":"string","minLength":1,"maxLength":300,"description":"The file's name or path, for example package-lock.json."},"content":{"type":"string","minLength":1,"maxLength":500000}},"required":["path","content"],"additionalProperties":false},"repo":{"description":"A connected repository id: its stored inventory and current impacts. On the Business and Platform plans.","type":"string","minLength":1,"maxLength":200},"repoUrl":{"description":"A public GitHub repository URL: checked now, the same way the scanner on since.dev checks it.","type":"string","maxLength":500,"format":"uri"},"fix":{"description":"With repo: open the fix pull requests, one per provider. With code: return the patch. Team and up (repo on the Business and Platform plans); each counts against the month's fix pull requests.","type":"boolean"},"state":{"description":"Only findings in these states, comma separated or a list: affected, upgrade_blocker, needs_review.","anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"severity":{"description":"Only findings of these severities, comma separated or a list: critical, high, medium, low, unknown.","anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"detail":{"description":"summary gives each finding's change id, state, severity, reason, places and replacement, and counts what was checked; full adds the whole change, each advisory behind a dependency finding and the checked list. summary is the default over MCP and full over the API. whats_changed with id reads one change in full.","type":"string","enum":["summary","full"]},"limit":{"description":"Findings per page, up to 500: 50 unless set over MCP, 500 over the API.","type":"integer","minimum":1,"maximum":500},"cursor":{"description":"The nextCursor of the previous page: the same check's next findings, free for 15 minutes after its first page. Only the first page is charged. An expired cursor, or one from another check or workspace, is refused with nothing charged.","type":"string","maxLength":500}},"additionalProperties":false}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["input","checked","checkedCount","findings","totalFindings","nextCursor","unresolved","truncated","coverage"],"properties":{"input":{"type":"string","enum":["code","lockfile","manifest","model","package","repo","repoUrl","surface"]},"checked":{"type":"array","items":{"type":"object","required":["surface","version","status","where"],"properties":{"surface":{"type":"object","required":["kind","key","provider","name"],"properties":{"kind":{"type":"string"},"key":{"type":"string"},"provider":{"type":"string"},"name":{"type":"string"},"ecosystem":{"type":"string","enum":["actions","cocoapods","conan","crates","docker","gem","go","helm","hex","homebrew","maven","npm","nuget","packagist","pub","pypi","swift","terraform","vcpkg"]},"purl":{"type":"string"}}},"version":{"type":["string","null"]},"status":{"type":"string","enum":["deprecated","retired","supported","unknown"]},"latest":{"type":["string","null"]},"releasesBehind":{"type":["number","null"]},"where":{"type":"array","items":{"type":"object","required":["file","line"],"properties":{"file":{"type":["string","null"]},"line":{"type":["number","null"]}}}}}}},"checkedCount":{"type":"number"},"findings":{"anyOf":[{"type":"array","items":{"type":"object","required":["changeId","source","surface","severity","state","replacement","effectiveDate","reason","version","where","daysLeft"],"properties":{"changeId":{"type":["string","null"]},"triggerIds":{"type":"array","items":{"type":"string"}},"source":{"type":["string","null"]},"surface":{"type":"object","required":["kind","key","provider","name"],"properties":{"kind":{"type":"string"},"key":{"type":"string"},"provider":{"type":"string"},"name":{"type":"string"},"ecosystem":{"type":"string","enum":["actions","cocoapods","conan","crates","docker","gem","go","helm","hex","homebrew","maven","npm","nuget","packagist","pub","pypi","swift","terraform","vcpkg"]},"purl":{"type":"string"}}},"severity":{"type":"string","enum":["critical","high","low","medium","unknown"]},"state":{"type":"string","enum":["affected","needs_review","upgrade_blocker"]},"replacement":{"type":["string","null"]},"effectiveDate":{"type":["string","null"]},"reason":{"type":"string"},"version":{"type":["string","null"]},"where":{"type":"array","items":{"type":"object","required":["file","line"],"properties":{"file":{"type":["string","null"]},"line":{"type":["number","null"]}}}},"daysLeft":{"type":["number","null"]},"placeCount":{"type":"number"}}}},{"type":"array","items":{"type":"object","required":["surface","version","state","severity","reason","replacement","effectiveDate","daysLeft","where","change","source"],"properties":{"surface":{"type":"object","required":["kind","key","provider","name"],"properties":{"kind":{"type":"string"},"key":{"type":"string"},"provider":{"type":"string"},"name":{"type":"string"},"ecosystem":{"type":"string","enum":["actions","cocoapods","conan","crates","docker","gem","go","helm","hex","homebrew","maven","npm","nuget","packagist","pub","pypi","swift","terraform","vcpkg"]},"purl":{"type":"string"}}},"version":{"type":["string","null"]},"state":{"type":"string","enum":["affected","needs_review","upgrade_blocker"]},"severity":{"type":"string","enum":["critical","high","low","medium","unknown"]},"reason":{"type":"string"},"replacement":{"type":["string","null"]},"effectiveDate":{"type":["string","null"]},"daysLeft":{"type":["number","null"]},"where":{"type":"array","items":{"type":"object","required":["file","line"],"properties":{"file":{"type":["string","null"]},"line":{"type":["number","null"]}}}},"change":{"type":["object","null"],"required":["id","source","surface","kind","severity","title","summary","replacement","platform","symbol","introducedIn","removedIn","affectedRanges","effectiveDate","dates","evidence","sources","detectedAt","occurredAt","publishedAt","changedAt"],"properties":{"id":{"type":"string"},"source":{"type":"string","enum":["catalog","watch"]},"surface":{"type":"object","required":["kind","key","provider","name"],"properties":{"kind":{"type":"string"},"key":{"type":"string"},"provider":{"type":"string"},"name":{"type":"string"},"ecosystem":{"type":"string","enum":["actions","cocoapods","conan","crates","docker","gem","go","helm","hex","homebrew","maven","npm","nuget","packagist","pub","pypi","swift","terraform","vcpkg"]},"purl":{"type":"string"}}},"kind":{"type":["string","null"],"enum":["behavior_changed","config_changed","default_changed","deprecated","end_of_life","new_capability","removed","renamed","retirement","security","signature_changed",null]},"severity":{"type":"string","enum":["critical","high","low","medium","unknown"]},"title":{"type":"string"},"summary":{"type":["string","null"]},"replacement":{"type":["string","null"]},"platform":{"type":["string","null"]},"symbol":{"type":["string","null"]},"introducedIn":{"type":["string","null"]},"removedIn":{"type":["string","null"]},"affectedRanges":{"type":"array","items":{"type":"object","required":["introduced","fixed","lastAffected"],"properties":{"introduced":{"type":["string","null"]},"fixed":{"type":["string","null"]},"lastAffected":{"type":["string","null"]}}}},"effectiveDate":{"type":["string","null"]},"dates":{"type":"object","properties":{"deprecated":{"type":"string"},"announced":{"type":"string"},"notBefore":{"type":"string"},"retires":{"type":"string"},"endOfLife":{"type":"string"},"endOfActiveSupport":{"type":"string"},"endOfExtendedSupport":{"type":"string"}}},"evidence":{"type":"array","items":{"type":"object","required":["url","quote","sourceKind","license"],"properties":{"url":{"type":"string"},"quote":{"type":["string","null"]},"sourceKind":{"type":["string","null"]},"license":{"type":["string","null"]}}}},"sources":{"type":"array","items":{"type":"string"}},"detectedAt":{"type":"string"},"occurredAt":{"type":["string","null"]},"publishedAt":{"type":["string","null"]},"changedAt":{"type":"string"}}},"source":{"type":["object","null"],"required":["url","sources"],"properties":{"url":{"type":["string","null"]},"sources":{"type":"array","items":{"type":"string"}}}},"triggers":{"type":"array","items":{"type":"object","required":["changeId","kind","title","severity","fixed","url"],"properties":{"changeId":{"type":["string","null"]},"kind":{"type":"string","enum":["behavior_changed","config_changed","default_changed","deprecated","end_of_life","new_capability","removed","renamed","retirement","security","signature_changed"]},"title":{"type":"string"},"severity":{"type":"string","enum":["critical","high","low","medium","unknown"]},"fixed":{"type":["string","null"]},"url":{"type":["string","null"]}}}},"placeCount":{"type":"number"}}}}]},"totalFindings":{"type":"number"},"nextCursor":{"type":["string","null"]},"unresolved":{"type":"array","items":{"type":"object","required":["name","reason","where"],"properties":{"name":{"type":"string"},"reason":{"type":"string"},"where":{"type":"array","items":{"type":"object","required":["file","line"],"properties":{"file":{"type":["string","null"]},"line":{"type":["number","null"]}}}}}}},"truncated":{"type":"boolean"},"coverage":{"type":"object","required":["sources","missing"],"properties":{"sources":{"type":"array","items":{"type":"object","required":["name","health","historyLoaded","lastSuccessAt","lastItemAt"],"properties":{"name":{"type":"string"},"health":{"type":"string","enum":["active","blocked","degraded","failing"]},"historyLoaded":{"type":"boolean"},"lastSuccessAt":{"type":["string","null"]},"lastItemAt":{"type":["string","null"]}}}},"missing":{"type":"array","items":{"type":"string"}}}},"fix":{"type":"object","properties":{"repository":{"type":"object","required":["runs","queued","notFixable"],"properties":{"runs":{"type":"array","items":{"type":"object","required":["runId","changeId","state","label","pullRequest","coveredBy"],"properties":{"runId":{"type":"string"},"changeId":{"type":"string"},"state":{"type":"string","enum":["closed","covered","dismissed","failed","merged","needs_you","not_needed","opening","pr_open","preparing","waiting"]},"label":{"type":"string"},"pullRequest":{"type":["object","null"],"required":["number","url","draft"],"properties":{"number":{"type":["number","null"]},"url":{"type":["string","null"]},"draft":{"type":"boolean"}}},"coveredBy":{"type":["object","null"],"required":["number","url","runId"],"properties":{"number":{"type":["number","null"]},"url":{"type":["string","null"]},"runId":{"type":"string"}}}}}},"queued":{"type":"number"},"notFixable":{"type":"number"}}},"patch":{"type":"object","required":["diff","code","summary","checks","unresolved"],"properties":{"diff":{"type":["string","null"]},"code":{"type":["string","null"]},"summary":{"type":"string"},"checks":{"type":"array","items":{"type":"string"}},"unresolved":{"type":"array","items":{"type":"string"}}}}}}}}}},"headers":{"X-Credits-Remaining":{"description":"The credits the workspace can still spend, from the month's allowance and the prepaid balance together.","schema":{"type":"integer"}}}},"400":{"description":"`invalid_input`: an unknown field, a missing or malformed value, or inputs that do not go together. The message names the field. Nothing is charged. `ambiguous_package`: a bare package name exists in more than one registry; `details.candidates` lists them.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Credits-Remaining":{"description":"The credits the workspace can still spend, from the month's allowance and the prepaid balance together.","schema":{"type":"integer"}}}},"401":{"description":"`unauthorized`: no API key, or one that is not valid or whose workspace is paused.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"`credits_exhausted`: the month's credits and the prepaid balance cannot pay for this call in full; `details` says what it needs. Nothing is charged. With fix and code, the month's fix pull requests and the prepaid balance cannot pay for one more (`details.meter` is `fixes`). With fix and repo, a fix that needs a new pull request waits for one instead.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Credits-Remaining":{"description":"The credits the workspace can still spend, from the month's allowance and the prepaid balance together.","schema":{"type":"integer"}}}},"403":{"description":"`fix_plan_required`: fix on a plan without fix pull requests, which start on the Team plan. Nothing is charged. `impact_api_not_in_plan`: the workspace's plan does not include this call; checking a connected repository (repo) is on the Business and Platform plans. Nothing is charged.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Credits-Remaining":{"description":"The credits the workspace can still spend, from the month's allowance and the prepaid balance together.","schema":{"type":"integer"}}}},"404":{"description":"`not_found`: repo is not a connected repository in this workspace, or GitHub has no public repository at repoUrl. Nothing is charged.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Credits-Remaining":{"description":"The credits the workspace can still spend, from the month's allowance and the prepaid balance together.","schema":{"type":"integer"}}}},"422":{"description":"`repo_unscannable`: the repository at repoUrl is empty, larger than a public scan reads, or took too long. Nothing is charged.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Credits-Remaining":{"description":"The credits the workspace can still spend, from the month's allowance and the prepaid balance together.","schema":{"type":"integer"}}}},"429":{"description":"`rate_limited`: more requests than one key or address may send in a short time; `retryAfterSec` and Retry-After say when to try again. Nothing is charged. `rate_limited`: fix with code more often than the workspace's snippet fixes allow; `details.retryAfterSec` says when to try again. Nothing is charged.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Credits-Remaining":{"description":"The credits the workspace can still spend, from the month's allowance and the prepaid balance together.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before trying again.","schema":{"type":"integer"}}}},"503":{"description":"`scan_unavailable`: the scan of repoUrl could not start, or GitHub could not be reached. Try again in a minute. Nothing is charged.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Credits-Remaining":{"description":"The credits the workspace can still spend, from the month's allowance and the prepaid balance together.","schema":{"type":"integer"}}}},"default":{"description":"Anything else, for example `internal` when something went wrong on our side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-mcp-tool":"check_code"}},"/v1/webhooks":{"get":{"operationId":"webhooks.list","summary":"The workspace's webhook endpoints, their delivery health, and how deliveries are signed.","description":"The workspace's webhook endpoints, their delivery health, and how deliveries are signed. Free.","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["endpoints","signature"],"properties":{"endpoints":{"type":"array","items":{"type":"object","required":["id","url","status","consecutiveFailures","lastSuccessAt","lastError","createdAt"],"properties":{"id":{"type":"string"},"url":{"type":"string"},"status":{"type":"string"},"consecutiveFailures":{"type":"number"},"lastSuccessAt":{"type":["string","null"],"format":"date-time"},"lastError":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"}}}},"signature":{"type":"object","required":["header","format","toleranceSeconds"],"properties":{"header":{"type":"string","enum":["Since-Signature"]},"format":{"type":"string","enum":["t=<unix-seconds>,v1=<hex hmac-sha256 of `${t}.${rawBody}`>"]},"toleranceSeconds":{"type":"number","enum":[300]}}}}}}},"headers":{"X-Credits-Remaining":{"description":"The credits the workspace can still spend, from the month's allowance and the prepaid balance together.","schema":{"type":"integer"}}}},"400":{"description":"`invalid_input`: an unknown field, a missing or malformed value, or inputs that do not go together. The message names the field. Nothing is charged.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Credits-Remaining":{"description":"The credits the workspace can still spend, from the month's allowance and the prepaid balance together.","schema":{"type":"integer"}}}},"401":{"description":"`unauthorized`: no API key, or one that is not valid or whose workspace is paused.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: more requests than one key or address may send in a short time; `retryAfterSec` and Retry-After say when to try again. Nothing is charged.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait before trying again.","schema":{"type":"integer"}}}},"default":{"description":"Anything else, for example `internal` when something went wrong on our side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"webhooks.create","summary":"Add an HTTPS endpoint.","description":"Add an HTTPS endpoint. The signing secret is in this response only. Free.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","minLength":1,"maxLength":2000,"description":"A public HTTPS URL."}},"required":["url"],"additionalProperties":false}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object","required":["signature","id","url","signingSecret"],"properties":{"signature":{"type":"object","required":["header","format","toleranceSeconds"],"properties":{"header":{"type":"string","enum":["Since-Signature"]},"format":{"type":"string","enum":["t=<unix-seconds>,v1=<hex hmac-sha256 of `${t}.${rawBody}`>"]},"toleranceSeconds":{"type":"number","enum":[300]}}},"id":{"type":"string"},"url":{"type":"string"},"signingSecret":{"type":"string"}}}}},"headers":{"X-Credits-Remaining":{"description":"The credits the workspace can still spend, from the month's allowance and the prepaid balance together.","schema":{"type":"integer"}}}},"400":{"description":"`invalid_input`: an unknown field, a missing or malformed value, or inputs that do not go together. The message names the field. Nothing is charged. `invalid_url`: the URL is not a public HTTPS address without embedded credentials. `endpoint_limit`: the workspace already has the most endpoints it may.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Credits-Remaining":{"description":"The credits the workspace can still spend, from the month's allowance and the prepaid balance together.","schema":{"type":"integer"}}}},"401":{"description":"`unauthorized`: no API key, or one that is not valid or whose workspace is paused.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: more requests than one key or address may send in a short time; `retryAfterSec` and Retry-After say when to try again. Nothing is charged.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait before trying again.","schema":{"type":"integer"}}}},"default":{"description":"Anything else, for example `internal` when something went wrong on our side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/webhooks/{id}":{"delete":{"operationId":"webhooks.delete","summary":"Remove an endpoint.","description":"Remove an endpoint. Deliveries stop now; it and its delivery history are deleted 30 days later, and until then it can be restored in the app. Free.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":200}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["id","status","deletedForGoodAt"],"properties":{"id":{"type":"string"},"status":{"type":"string","enum":["disabled"]},"deletedForGoodAt":{"type":"string"}}}}},"headers":{"X-Credits-Remaining":{"description":"The credits the workspace can still spend, from the month's allowance and the prepaid balance together.","schema":{"type":"integer"}}}},"400":{"description":"`invalid_input`: an unknown field, a missing or malformed value, or inputs that do not go together. The message names the field. Nothing is charged.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Credits-Remaining":{"description":"The credits the workspace can still spend, from the month's allowance and the prepaid balance together.","schema":{"type":"integer"}}}},"401":{"description":"`unauthorized`: no API key, or one that is not valid or whose workspace is paused.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: no endpoint with that id in this workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Credits-Remaining":{"description":"The credits the workspace can still spend, from the month's allowance and the prepaid balance together.","schema":{"type":"integer"}}}},"429":{"description":"`rate_limited`: more requests than one key or address may send in a short time; `retryAfterSec` and Retry-After say when to try again. Nothing is charged.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait before trying again.","schema":{"type":"integer"}}}},"default":{"description":"Anything else, for example `internal` when something went wrong on our side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/repos":{"get":{"operationId":"repos","summary":"Connected repositories with their open impacts and fix pull request status.","description":"Connected repositories with their open impacts and fix pull request status. Free.","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["repos"],"properties":{"repos":{"type":"array","items":{"type":"object","required":["id","fullName","defaultBranch","private","status","indexedAt","indexComplete","checking","queued","coverage","dependencies","impacts","fixPrs"],"properties":{"id":{"type":"string"},"fullName":{"type":"string"},"defaultBranch":{"type":"string"},"private":{"type":"boolean"},"status":{"type":"string"},"indexedAt":{"type":["string","null"]},"indexComplete":{"type":"boolean"},"checking":{"type":"boolean"},"queued":{"type":"boolean"},"coverage":{"type":["object","null"],"required":["headSha","roots","languages","detections","ecosystems","gaps"],"properties":{"headSha":{"type":["string","null"]},"roots":{"type":"array","items":{"type":"string"}},"languages":{"type":"array","items":{"type":"object","required":["language","files","analyzed","skipped","partial","unparsed","excluded"],"properties":{"language":{"type":"string"},"files":{"type":"number"},"analyzed":{"type":"number"},"skipped":{"type":"number"},"partial":{"type":"number"},"unparsed":{"type":"number"},"excluded":{"type":"number"}}}},"detections":{"type":"object","properties":{"type":{"type":"number"},"literal":{"type":"number"},"http":{"type":"number"},"config":{"type":"number"},"call":{"type":"number"},"new":{"type":"number"},"import":{"type":"number"}}},"ecosystems":{"type":"array","items":{"type":"object","required":["ecosystem","usage","gaps"],"properties":{"ecosystem":{"type":"string"},"usage":{"type":"string","enum":["full","partial"]},"gaps":{"type":"array","items":{"type":"string","enum":["assembled_value","deferred","dropped_reference","dynamic_import","dynamic_request","excluded_directory","generated_code","not_read","parse_incomplete","reference_cap","truncated","unread_format","unresolved_import","unresolved_reference","unsupported_language"]}}}}},"gaps":{"type":"array","items":{"type":"object","required":["kind","files","paths"],"properties":{"kind":{"type":"string","enum":["assembled_value","deferred","dropped_reference","dynamic_import","dynamic_request","excluded_directory","generated_code","not_read","parse_incomplete","reference_cap","truncated","unread_format","unresolved_import","unresolved_reference","unsupported_language"]},"files":{"type":"number"},"paths":{"type":"array","items":{"type":"string"}}}}},"inventoryGaps":{"type":"array","items":{"type":"object","required":["path","reason"],"properties":{"path":{"type":["string","null"]},"reason":{"type":"string"},"notRead":{"type":"number"}}}}}},"dependencies":{"type":"number"},"impacts":{"type":"object","required":["open","upgradeBlockers","needsReview","retiringIn30Days","overdue","nextDeadline"],"properties":{"open":{"type":"number"},"upgradeBlockers":{"type":"number"},"needsReview":{"type":"number"},"retiringIn30Days":{"type":"number"},"overdue":{"type":"number"},"nextDeadline":{"type":["string","null"]}}},"fixPrs":{"type":"object","required":["open","merged","closed","openPullRequests"],"properties":{"open":{"type":"number"},"merged":{"type":"number"},"closed":{"type":"number"},"openPullRequests":{"type":"array","items":{"type":"object","required":["runId","number","url","ci"],"properties":{"runId":{"type":"string"},"number":{"type":["number","null"]},"url":{"type":["string","null"]},"ci":{"type":"string"}}}}}}}}}}}}},"headers":{"X-Credits-Remaining":{"description":"The credits the workspace can still spend, from the month's allowance and the prepaid balance together.","schema":{"type":"integer"}}}},"400":{"description":"`invalid_input`: an unknown field, a missing or malformed value, or inputs that do not go together. The message names the field. Nothing is charged.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"X-Credits-Remaining":{"description":"The credits the workspace can still spend, from the month's allowance and the prepaid balance together.","schema":{"type":"integer"}}}},"401":{"description":"`unauthorized`: no API key, or one that is not valid or whose workspace is paused.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: more requests than one key or address may send in a short time; `retryAfterSec` and Retry-After say when to try again. Nothing is charged.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait before trying again.","schema":{"type":"integer"}}}},"default":{"description":"Anything else, for example `internal` when something went wrong on our side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/stats":{"get":{"operationId":"stats","summary":"The live counts Since tracks: packages and releases by ecosystem, the week's breaking changes and deprecations, advisories, APIs and models.","description":"The live counts Since tracks: packages and releases by ecosystem, the week's breaking changes and deprecations, advisories, APIs and models. Cached for five minutes.","security":[],"parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["packages","registries","releasesTracked","releasesLast24h","releasesLast24hByEcosystem","majorReleasesLast7d","breakingChangesLast7d","deprecationsLast7d","dependentsReachedLast7d","advisories","apis","apiRemovals","models","modelMakers","modelsByProvider","modelsByPlatform","modelRetirements","runtimes","endOfLifeNext90Days","publicCode","medianDetectionMinutes","generatedAt"],"properties":{"packages":{"type":"object","required":["total","byEcosystem"],"properties":{"total":{"type":"number"},"byEcosystem":{"type":"object","required":["actions","npm","pypi","crates","gem","packagist","go","maven","nuget","hex","pub","cocoapods","swift","conan","vcpkg","homebrew","docker","terraform","helm"],"properties":{"actions":{"type":"number"},"npm":{"type":"number"},"pypi":{"type":"number"},"crates":{"type":"number"},"gem":{"type":"number"},"packagist":{"type":"number"},"go":{"type":"number"},"maven":{"type":"number"},"nuget":{"type":"number"},"hex":{"type":"number"},"pub":{"type":"number"},"cocoapods":{"type":"number"},"swift":{"type":"number"},"conan":{"type":"number"},"vcpkg":{"type":"number"},"homebrew":{"type":"number"},"docker":{"type":"number"},"terraform":{"type":"number"},"helm":{"type":"number"}}}}},"registries":{"type":"number"},"releasesTracked":{"type":"number"},"releasesLast24h":{"type":"number"},"releasesLast24hByEcosystem":{"type":"object","required":["actions","npm","pypi","crates","gem","packagist","go","maven","nuget","hex","pub","cocoapods","swift","conan","vcpkg","homebrew","docker","terraform","helm"],"properties":{"actions":{"type":"number"},"npm":{"type":"number"},"pypi":{"type":"number"},"crates":{"type":"number"},"gem":{"type":"number"},"packagist":{"type":"number"},"go":{"type":"number"},"maven":{"type":"number"},"nuget":{"type":"number"},"hex":{"type":"number"},"pub":{"type":"number"},"cocoapods":{"type":"number"},"swift":{"type":"number"},"conan":{"type":"number"},"vcpkg":{"type":"number"},"homebrew":{"type":"number"},"docker":{"type":"number"},"terraform":{"type":"number"},"helm":{"type":"number"}}},"majorReleasesLast7d":{"type":"number"},"breakingChangesLast7d":{"type":"number"},"deprecationsLast7d":{"type":"number"},"dependentsReachedLast7d":{"type":"object","required":["dependents","packages","packagesCounted"],"properties":{"dependents":{"type":"number"},"packages":{"type":"number"},"packagesCounted":{"type":"number"}}},"advisories":{"type":"number"},"apis":{"type":"number"},"apiRemovals":{"type":"number"},"models":{"type":"number"},"modelMakers":{"type":"number"},"modelsByProvider":{"type":"object","additionalProperties":{"type":"number"}},"modelsByPlatform":{"type":"object","additionalProperties":{"type":"number"}},"modelRetirements":{"type":"object","required":["next30Days","next90Days"],"properties":{"next30Days":{"type":"number"},"next90Days":{"type":"number"}}},"runtimes":{"type":"number"},"endOfLifeNext90Days":{"type":"number"},"publicCode":{"type":"object","required":["files","checkedAt","models"],"properties":{"files":{"type":"number"},"checkedAt":{"type":["string","null"]},"models":{"type":"array","items":{"type":"object","required":["model","retiresOn","files","repositories","repositoriesExact","checkedAt"],"properties":{"model":{"type":"string"},"retiresOn":{"type":"string"},"files":{"type":"number"},"repositories":{"type":"number"},"repositoriesExact":{"type":"boolean"},"checkedAt":{"type":"string"}}}}}},"medianDetectionMinutes":{"type":["number","null"]},"generatedAt":{"type":"string"}}}}}},"429":{"description":"`rate_limited`: more requests than one key or address may send in a short time; `retryAfterSec` and Retry-After say when to try again. Nothing is charged.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait before trying again.","schema":{"type":"integer"}}}},"503":{"description":"Not readable for a moment. Try again shortly.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","enum":["stats_unavailable"]}}}}}},"default":{"description":"Anything else, for example `internal` when something went wrong on our side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/calendar":{"get":{"operationId":"calendar","summary":"The retirement calendar: the deprecation and removal dates providers published for models, APIs and runtimes, soonest first.","description":"The retirement calendar: the deprecation and removal dates providers published for models, APIs and runtimes, soonest first. Page with nextCursor.","security":[],"parameters":[{"name":"provider","in":"query","description":"Only this provider's entries, for example anthropic, openai or nodejs.","schema":{"type":"string","minLength":1,"maxLength":100}},{"name":"kind","in":"query","description":"Only models, APIs or runtimes: model, api, runtime. Every product with release lines is a runtime here; category tells languages, databases, infrastructure and operating systems apart.","schema":{"type":"string","enum":["model","api","runtime"]}},{"name":"category","in":"query","description":"Only these categories, separated by commas: model, api, runtime, language, framework, database, infrastructure, os, software. model,api,runtime,language,framework,database,infrastructure is what a codebase depends on; os and software are the rest.","schema":{"type":"string","maxLength":100}},{"name":"within","in":"query","description":"Only dates from today through this many days ahead, for example 90d.","schema":{"type":"string","pattern":"^\\d{1,4}d$"}},{"name":"id","in":"query","description":"One entry, by the id an earlier answer gave it.","schema":{"type":"string","minLength":1,"maxLength":100}},{"name":"path","in":"query","description":"An address on the site: that page's entry, plus any variants under it. A provider's address, such as /calendar/openai, gives all its entries.","schema":{"type":"string","maxLength":300,"pattern":"^\\/calendar(\\/[a-z0-9.-]+)+\\/?$"}},{"name":"limit","in":"query","description":"Entries per page, 1 to 500.","schema":{"default":100,"type":"integer","minimum":1,"maximum":500}},{"name":"cursor","in":"query","description":"The nextCursor of the previous page.","schema":{"type":"string","maxLength":500}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["entries","nextCursor","from","generatedAt"],"properties":{"entries":{"type":"array","items":{"type":"object","required":["id","kind","category","categoryLabel","event","provider","providerName","name","modelId","platform","platformName","version","symbol","title","summary","date","dateKind","dates","daysLeft","severity","replacement","source","sources","lastCheckedAt","announcedAt","path"],"properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["api","model","runtime"]},"category":{"type":"string","enum":["api","database","framework","infrastructure","language","model","os","runtime","software"]},"categoryLabel":{"type":"string"},"event":{"type":"string","enum":["change","end_of_life","removal","retirement"]},"provider":{"type":"string"},"providerName":{"type":"string"},"name":{"type":"string"},"modelId":{"type":["string","null"]},"platform":{"type":["string","null"]},"platformName":{"type":["string","null"]},"version":{"type":["string","null"]},"symbol":{"type":["string","null"]},"title":{"type":"string"},"summary":{"type":["string","null"]},"date":{"type":"string"},"dateKind":{"type":"string","enum":["eol","hard","not_before"]},"dates":{"type":"array","items":{"type":"object","required":["date","kind"],"properties":{"date":{"type":"string"},"kind":{"type":"string","enum":["announced","deprecated","end_active","end_extended","eol","hard","not_before"]}}}},"daysLeft":{"type":"number"},"severity":{"type":"string","enum":["critical","high","low","medium","unknown"]},"replacement":{"type":["string","null"]},"source":{"type":["object","null"],"required":["url","quote","license"],"properties":{"url":{"type":"string"},"quote":{"type":["string","null"]},"license":{"type":["string","null"]}}},"sources":{"type":"array","items":{"type":"string"}},"lastCheckedAt":{"type":["string","null"]},"announcedAt":{"type":"string"},"path":{"type":"string"}}}},"nextCursor":{"type":["string","null"]},"from":{"type":"string"},"generatedAt":{"type":"string"}}}}}},"400":{"description":"`invalid_input`: an unknown field or a value the filter does not take. The message names the field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: more requests than one key or address may send in a short time; `retryAfterSec` and Retry-After say when to try again. Nothing is charged.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait before trying again.","schema":{"type":"integer"}}}},"503":{"description":"Not readable for a moment. Try again shortly.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","enum":["calendar_unavailable"]}}}}}},"default":{"description":"Anything else, for example `internal` when something went wrong on our side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/calendar.ics":{"get":{"operationId":"calendar.ics","summary":"The retirement calendar as a calendar to subscribe to, with the same filters.","description":"The retirement calendar as a calendar to subscribe to, with the same filters.","security":[],"parameters":[{"name":"provider","in":"query","description":"Only this provider's entries, for example anthropic, openai or nodejs.","schema":{"type":"string","minLength":1,"maxLength":100}},{"name":"kind","in":"query","description":"Only models, APIs or runtimes: model, api, runtime. Every product with release lines is a runtime here; category tells languages, databases, infrastructure and operating systems apart.","schema":{"type":"string","enum":["model","api","runtime"]}},{"name":"category","in":"query","description":"Only these categories, separated by commas: model, api, runtime, language, framework, database, infrastructure, os, software. model,api,runtime,language,framework,database,infrastructure is what a codebase depends on; os and software are the rest.","schema":{"type":"string","maxLength":100}},{"name":"within","in":"query","description":"Only dates from today through this many days ahead, for example 90d.","schema":{"type":"string","pattern":"^\\d{1,4}d$"}},{"name":"id","in":"query","description":"One entry, by the id an earlier answer gave it.","schema":{"type":"string","minLength":1,"maxLength":100}},{"name":"path","in":"query","description":"An address on the site: that page's entry, plus any variants under it. A provider's address, such as /calendar/openai, gives all its entries.","schema":{"type":"string","maxLength":300,"pattern":"^\\/calendar(\\/[a-z0-9.-]+)+\\/?$"}}],"responses":{"200":{"description":"OK","content":{"text/calendar":{"schema":{"type":"string"}}}},"400":{"description":"`invalid_input`: an unknown field or a value the filter does not take. The message names the field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: more requests than one key or address may send in a short time; `retryAfterSec` and Retry-After say when to try again. Nothing is charged.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait before trying again.","schema":{"type":"integer"}}}},"503":{"description":"Not readable for a moment. Try again shortly.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","enum":["calendar_unavailable"]}}}}}},"default":{"description":"Anything else, for example `internal` when something went wrong on our side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/calendar.rss":{"get":{"operationId":"calendar.rss","summary":"The retirement calendar as an RSS feed, newest announcements first, with the same filters.","description":"The retirement calendar as an RSS feed, newest announcements first, with the same filters.","security":[],"parameters":[{"name":"provider","in":"query","description":"Only this provider's entries, for example anthropic, openai or nodejs.","schema":{"type":"string","minLength":1,"maxLength":100}},{"name":"kind","in":"query","description":"Only models, APIs or runtimes: model, api, runtime. Every product with release lines is a runtime here; category tells languages, databases, infrastructure and operating systems apart.","schema":{"type":"string","enum":["model","api","runtime"]}},{"name":"category","in":"query","description":"Only these categories, separated by commas: model, api, runtime, language, framework, database, infrastructure, os, software. model,api,runtime,language,framework,database,infrastructure is what a codebase depends on; os and software are the rest.","schema":{"type":"string","maxLength":100}},{"name":"within","in":"query","description":"Only dates from today through this many days ahead, for example 90d.","schema":{"type":"string","pattern":"^\\d{1,4}d$"}},{"name":"id","in":"query","description":"One entry, by the id an earlier answer gave it.","schema":{"type":"string","minLength":1,"maxLength":100}},{"name":"path","in":"query","description":"An address on the site: that page's entry, plus any variants under it. A provider's address, such as /calendar/openai, gives all its entries.","schema":{"type":"string","maxLength":300,"pattern":"^\\/calendar(\\/[a-z0-9.-]+)+\\/?$"}}],"responses":{"200":{"description":"OK","content":{"application/rss+xml":{"schema":{"type":"string"}}}},"400":{"description":"`invalid_input`: an unknown field or a value the filter does not take. The message names the field.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: more requests than one key or address may send in a short time; `retryAfterSec` and Retry-After say when to try again. Nothing is charged.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait before trying again.","schema":{"type":"integer"}}}},"503":{"description":"Not readable for a moment. Try again shortly.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","enum":["calendar_unavailable"]}}}}}},"default":{"description":"Anything else, for example `internal` when something went wrong on our side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/scan/{owner}/{repo}":{"get":{"operationId":"scan.read","summary":"The last public scan of a GitHub repository, as its share link shows it.","description":"The last public scan of a GitHub repository, as its share link shows it. 404 not_scanned when nobody has scanned it.","security":[],"parameters":[{"name":"owner","in":"path","required":true,"description":"The repository's owner on GitHub.","schema":{"type":"string"}},{"name":"repo","in":"path","required":true,"description":"The repository's name.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["repository","scannedAt","summary","findings","truncated","reading","coverage"],"properties":{"repository":{"type":"object","required":["owner","repo","fullName","url","headSha","defaultBranch"],"properties":{"owner":{"type":"string"},"repo":{"type":"string"},"fullName":{"type":"string"},"url":{"type":"string"},"headSha":{"type":"string"},"defaultBranch":{"type":"string"}}},"scannedAt":{"type":"string"},"summary":{"type":"object","required":["findings","bySeverity","dependencies","files","references"],"properties":{"findings":{"type":"number"},"bySeverity":{"type":"object","required":["unknown","critical","high","medium","low"],"properties":{"unknown":{"type":"number"},"critical":{"type":"number"},"high":{"type":"number"},"medium":{"type":"number"},"low":{"type":"number"}}},"dependencies":{"type":"number"},"files":{"type":"number"},"references":{"type":"number"}}},"findings":{"type":"array","items":{"type":"object","required":["kind","surface","state","severity","title","reason","replacement","effectiveDate","daysLeft","where","more","source","changeId"],"properties":{"kind":{"type":"string","enum":["behind","change"]},"surface":{"type":"object","required":["kind","key","name","ecosystem"],"properties":{"kind":{"type":"string","enum":["api","model","package","runtime"]},"key":{"type":"string"},"name":{"type":"string"},"ecosystem":{"type":["string","null"]}}},"state":{"type":"string","enum":["active","needs_review","upgrade_blocker"]},"severity":{"type":"string","enum":["critical","high","low","medium","unknown"]},"title":{"type":"string"},"reason":{"type":"string"},"replacement":{"type":["string","null"]},"effectiveDate":{"type":["string","null"]},"daysLeft":{"type":["number","null"]},"where":{"type":"array","items":{"type":"object","required":["path","line"],"properties":{"path":{"type":"string"},"line":{"type":["number","null"]}}}},"more":{"type":"number"},"source":{"type":"object","required":["url","sources"],"properties":{"url":{"type":["string","null"]},"sources":{"type":"array","items":{"type":"string"}}}},"changeId":{"type":["string","null"]}}}},"truncated":{"type":"boolean"},"reading":{"type":"number"},"coverage":{"type":"object","required":["headSha","roots","languages","detections","ecosystems","gaps","complete","notes"],"properties":{"headSha":{"type":["string","null"]},"roots":{"type":"array","items":{"type":"string"}},"languages":{"type":"array","items":{"type":"object","required":["language","files","analyzed","skipped","partial","unparsed","excluded"],"properties":{"language":{"type":"string"},"files":{"type":"number"},"analyzed":{"type":"number"},"skipped":{"type":"number"},"partial":{"type":"number"},"unparsed":{"type":"number"},"excluded":{"type":"number"}}}},"detections":{"type":"object","properties":{"type":{"type":"number"},"literal":{"type":"number"},"http":{"type":"number"},"config":{"type":"number"},"call":{"type":"number"},"new":{"type":"number"},"import":{"type":"number"}}},"ecosystems":{"type":"array","items":{"type":"object","required":["ecosystem","usage","gaps"],"properties":{"ecosystem":{"type":"string"},"usage":{"type":"string","enum":["full","partial"]},"gaps":{"type":"array","items":{"type":"string","enum":["assembled_value","deferred","dropped_reference","dynamic_import","dynamic_request","excluded_directory","generated_code","not_read","parse_incomplete","reference_cap","truncated","unread_format","unresolved_import","unresolved_reference","unsupported_language"]}}}}},"gaps":{"type":"array","items":{"type":"object","required":["kind","files","paths"],"properties":{"kind":{"type":"string","enum":["assembled_value","deferred","dropped_reference","dynamic_import","dynamic_request","excluded_directory","generated_code","not_read","parse_incomplete","reference_cap","truncated","unread_format","unresolved_import","unresolved_reference","unsupported_language"]},"files":{"type":"number"},"paths":{"type":"array","items":{"type":"string"}}}}},"inventoryGaps":{"type":"array","items":{"type":"object","required":["path","reason"],"properties":{"path":{"type":["string","null"]},"reason":{"type":"string"},"notRead":{"type":"number"}}}},"complete":{"type":"boolean"},"notes":{"type":"array","items":{"type":"string"}}}}}}}}},"400":{"description":"`invalid_input`: the address names no GitHub repository.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_scanned`: nobody has scanned this repository yet. `not_found`: GitHub serves no public repository by that name.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: more requests than one key or address may send in a short time; `retryAfterSec` and Retry-After say when to try again. Nothing is charged.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait before trying again.","schema":{"type":"integer"}}}},"502":{"description":"`unavailable`: GitHub could not be reached, or its answer could not be read. Try again in a minute.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Anything else, for example `internal` when something went wrong on our side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/scan":{"post":{"operationId":"scan","summary":"Analyzes a public GitHub repository: what it depends on and which changes reach its code.","description":"Analyzes a public GitHub repository: what it depends on and which changes reach its code. A scan younger than an hour is returned as it is, unless some of its packages were still being read. Each address may run 10 scans a day; a repository GitHub does not serve, or one with nothing to scan, does not count.","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"repo":{"type":"string","minLength":1,"maxLength":500,"description":"A public GitHub repository, as owner/repo or its URL."}},"required":["repo"],"additionalProperties":false}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["repository","scannedAt","summary","findings","truncated","reading","coverage"],"properties":{"repository":{"type":"object","required":["owner","repo","fullName","url","headSha","defaultBranch"],"properties":{"owner":{"type":"string"},"repo":{"type":"string"},"fullName":{"type":"string"},"url":{"type":"string"},"headSha":{"type":"string"},"defaultBranch":{"type":"string"}}},"scannedAt":{"type":"string"},"summary":{"type":"object","required":["findings","bySeverity","dependencies","files","references"],"properties":{"findings":{"type":"number"},"bySeverity":{"type":"object","required":["unknown","critical","high","medium","low"],"properties":{"unknown":{"type":"number"},"critical":{"type":"number"},"high":{"type":"number"},"medium":{"type":"number"},"low":{"type":"number"}}},"dependencies":{"type":"number"},"files":{"type":"number"},"references":{"type":"number"}}},"findings":{"type":"array","items":{"type":"object","required":["kind","surface","state","severity","title","reason","replacement","effectiveDate","daysLeft","where","more","source","changeId"],"properties":{"kind":{"type":"string","enum":["behind","change"]},"surface":{"type":"object","required":["kind","key","name","ecosystem"],"properties":{"kind":{"type":"string","enum":["api","model","package","runtime"]},"key":{"type":"string"},"name":{"type":"string"},"ecosystem":{"type":["string","null"]}}},"state":{"type":"string","enum":["active","needs_review","upgrade_blocker"]},"severity":{"type":"string","enum":["critical","high","low","medium","unknown"]},"title":{"type":"string"},"reason":{"type":"string"},"replacement":{"type":["string","null"]},"effectiveDate":{"type":["string","null"]},"daysLeft":{"type":["number","null"]},"where":{"type":"array","items":{"type":"object","required":["path","line"],"properties":{"path":{"type":"string"},"line":{"type":["number","null"]}}}},"more":{"type":"number"},"source":{"type":"object","required":["url","sources"],"properties":{"url":{"type":["string","null"]},"sources":{"type":"array","items":{"type":"string"}}}},"changeId":{"type":["string","null"]}}}},"truncated":{"type":"boolean"},"reading":{"type":"number"},"coverage":{"type":"object","required":["headSha","roots","languages","detections","ecosystems","gaps","complete","notes"],"properties":{"headSha":{"type":["string","null"]},"roots":{"type":"array","items":{"type":"string"}},"languages":{"type":"array","items":{"type":"object","required":["language","files","analyzed","skipped","partial","unparsed","excluded"],"properties":{"language":{"type":"string"},"files":{"type":"number"},"analyzed":{"type":"number"},"skipped":{"type":"number"},"partial":{"type":"number"},"unparsed":{"type":"number"},"excluded":{"type":"number"}}}},"detections":{"type":"object","properties":{"type":{"type":"number"},"literal":{"type":"number"},"http":{"type":"number"},"config":{"type":"number"},"call":{"type":"number"},"new":{"type":"number"},"import":{"type":"number"}}},"ecosystems":{"type":"array","items":{"type":"object","required":["ecosystem","usage","gaps"],"properties":{"ecosystem":{"type":"string"},"usage":{"type":"string","enum":["full","partial"]},"gaps":{"type":"array","items":{"type":"string","enum":["assembled_value","deferred","dropped_reference","dynamic_import","dynamic_request","excluded_directory","generated_code","not_read","parse_incomplete","reference_cap","truncated","unread_format","unresolved_import","unresolved_reference","unsupported_language"]}}}}},"gaps":{"type":"array","items":{"type":"object","required":["kind","files","paths"],"properties":{"kind":{"type":"string","enum":["assembled_value","deferred","dropped_reference","dynamic_import","dynamic_request","excluded_directory","generated_code","not_read","parse_incomplete","reference_cap","truncated","unread_format","unresolved_import","unresolved_reference","unsupported_language"]},"files":{"type":"number"},"paths":{"type":"array","items":{"type":"string"}}}}},"inventoryGaps":{"type":"array","items":{"type":"object","required":["path","reason"],"properties":{"path":{"type":["string","null"]},"reason":{"type":"string"},"notRead":{"type":"number"}}}},"complete":{"type":"boolean"},"notes":{"type":"array","items":{"type":"string"}}}}}}}}},"400":{"description":"`invalid_input`: an unknown field, or repo names no public GitHub repository.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: GitHub serves no public repository by that name.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"`empty`, `too_large` or `too_slow`: the repository has no commits, is larger than a public scan reads, or took too long. Connect it to track all of it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: this address has run its scans for today; `retryAfterSec` says when the next one is free. `rate_limited`: more requests than one key or address may send in a short time; `retryAfterSec` and Retry-After say when to try again. Nothing is charged.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait before trying again.","schema":{"type":"integer"}}}},"502":{"description":"`unavailable`: GitHub could not be reached, or its answer could not be read. Try again in a minute.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`busy`: every scan slot is taken. Try again shortly; nothing is spent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait before trying again.","schema":{"type":"integer"}}}},"default":{"description":"Anything else, for example `internal` when something went wrong on our side. Try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"webhooks":{"change.detected":{"post":{"operationId":"webhook.change.detected","description":"As it goes out, data gains impacts, the first connected repositories the change reaches, each with its repository, url, state, open fixPullRequest or null and, on the Business and Platform plans, locations (path and line); and impactCount, how many it reaches in all. The plan is read as each delivery goes out.","parameters":[{"name":"Since-Signature","in":"header","required":true,"schema":{"type":"string"}},{"name":"Since-Event","in":"header","required":true,"schema":{"type":"string"}},{"name":"Since-Delivery","in":"header","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","idempotencyKey","createdAt","data"],"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["change.detected"]},"idempotencyKey":{"type":"string"},"createdAt":{"type":"string"},"data":{"type":"object","required":["change","context"],"properties":{"change":{"type":"object","required":["changeId","idempotencyKey","status","kind","aspect","subject","headline","consequence","replacement","effectiveDate","severity","dates","fieldChanges","source","significance","detectedAt","occurredAt"],"properties":{"changeId":{"type":"string"},"idempotencyKey":{"type":"string"},"status":{"type":"string","enum":["new","updated"]},"kind":{"type":["string","null"]},"aspect":{"type":"string"},"subject":{"type":"object","required":["key","type","name","provider"],"properties":{"key":{"type":"string"},"type":{"type":"string"},"name":{"type":"string"},"provider":{"type":["string","null"]}}},"headline":{"type":"string"},"consequence":{"type":["string","null"]},"replacement":{"type":["string","null"]},"effectiveDate":{"type":["string","null"]},"severity":{"type":"string"},"dates":{"type":"object","properties":{"deprecated":{"type":"string"},"announced":{"type":"string"},"notBefore":{"type":"string"},"retires":{"type":"string"},"endOfLife":{"type":"string"},"endOfActiveSupport":{"type":"string"},"endOfExtendedSupport":{"type":"string"}}},"fieldChanges":{"type":"array","items":{"type":"object","required":["path","label","from","to"],"properties":{"path":{"type":"string"},"label":{"type":"string"},"from":{"type":["string","null"]},"to":{"type":["string","null"]}}}},"source":{"type":"object","required":["publisher","url"],"properties":{"publisher":{"type":"string"},"url":{"type":["string","null"]}}},"significance":{"type":"number"},"detectedAt":{"type":"string"},"occurredAt":{"type":["string","null"]}}},"context":{"type":"object","required":["assessment","assessedAt","subjectType","publisher","changedFields","evidenceQuote","summary"],"properties":{"assessment":{"type":["object","null"],"required":["category","basis","breaking","upstreamGuide"],"properties":{"category":{"type":"string","enum":["additive","advisory","behavioral","breaking","deprecated"]},"basis":{"type":"array","items":{"type":"string"}},"breaking":{"type":"object","required":["answer","reasoning"],"properties":{"answer":{"type":"string","enum":["no","unknown","yes"]},"reasoning":{"type":"string"}}},"upstreamGuide":{"type":"object","required":["available","text","why"],"properties":{"available":{"type":"boolean"},"text":{"type":["string","null"]},"why":{"type":"string"}}}}},"assessedAt":{"type":["string","null"]},"subjectType":{"type":"string"},"publisher":{"type":"string"},"changedFields":{"type":"array","items":{"type":"string"}},"evidenceQuote":{"type":["string","null"]},"summary":{"type":["string","null"]}}}}}}}}}},"responses":{"2XX":{"description":"Received. Any other answer is retried."}}}},"fix.ci_failed":{"post":{"operationId":"webhook.fix.ci_failed","parameters":[{"name":"Since-Signature","in":"header","required":true,"schema":{"type":"string"}},{"name":"Since-Event","in":"header","required":true,"schema":{"type":"string"}},{"name":"Since-Delivery","in":"header","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","idempotencyKey","createdAt","data"],"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["fix.ci_failed"]},"idempotencyKey":{"type":"string"},"createdAt":{"type":"string"},"data":{"anyOf":[{"type":"object","required":["type","pullRequest","repository","failedChecks","runIds","revision"],"properties":{"type":{"type":"string","enum":["fix.ci_failed"]},"pullRequest":{"type":"object","required":["id","number","url","headSha"],"properties":{"id":{"type":"string"},"number":{"type":["number","null"]},"url":{"type":["string","null"]},"headSha":{"type":["string","null"]}}},"repository":{"type":"object","required":["id","fullName"],"properties":{"id":{"type":"string"},"fullName":{"type":"string"}}},"failedChecks":{"type":"array","items":{"type":"object","required":["name","url"],"properties":{"name":{"type":"string"},"url":{"type":["string","null"]}}}},"runIds":{"type":"array","items":{"type":"string"}},"revision":{"type":"object","required":["state","attempt","maxAttempts"],"properties":{"state":{"type":"string","enum":["exhausted","in_progress"]},"attempt":{"type":"number"},"maxAttempts":{"type":"number"}}}}},{"type":"object","required":["type","pullRequest","repository","failedChecks","runIds","revision"],"properties":{"type":{"type":"string","enum":["fix.ci_failed"]},"pullRequest":{"type":"object","required":["id","number","url","headSha"],"properties":{"id":{"type":"string"},"number":{"type":["number","null"]},"url":{"type":["string","null"]},"headSha":{"type":["string","null"]}}},"repository":{"type":"object","required":["id","fullName"],"properties":{"id":{"type":"string"},"fullName":{"type":"string"}}},"failedChecks":{"type":"array","items":{"type":"object","required":["name","url"],"properties":{"name":{"type":"string"},"url":{"type":["string","null"]}}}},"runIds":{"type":"array","items":{"type":"string"}},"revision":{"type":"object","required":["state","attempt","maxAttempts"],"properties":{"state":{"type":"string","enum":["exhausted","in_progress"]},"attempt":{"type":"number"},"maxAttempts":{"type":"number"}}}}}]}}}}}},"responses":{"2XX":{"description":"Received. Any other answer is retried."}}}},"fix.deferred":{"post":{"operationId":"webhook.fix.deferred","parameters":[{"name":"Since-Signature","in":"header","required":true,"schema":{"type":"string"}},{"name":"Since-Event","in":"header","required":true,"schema":{"type":"string"}},{"name":"Since-Delivery","in":"header","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","idempotencyKey","createdAt","data"],"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["fix.deferred"]},"idempotencyKey":{"type":"string"},"createdAt":{"type":"string"},"data":{"type":"object","required":["type","runId","repository","change","reason","sites","sitesTotal","locations","migrationNotes","url"],"properties":{"type":{"type":"string","enum":["fix.deferred"]},"runId":{"type":"string"},"repository":{"type":"object","required":["id","fullName"],"properties":{"id":{"type":"string"},"fullName":{"type":"string"}}},"change":{"type":"object","required":["id","kind","subject","replacement","headline","severity","effectiveDate"],"properties":{"id":{"type":"string"},"kind":{"type":"string"},"subject":{"type":"string"},"replacement":{"type":["string","null"]},"headline":{"type":"string"},"severity":{"type":"string"},"effectiveDate":{"type":["string","null"]}}},"reason":{"type":"object","required":["code","message","nextStep"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"nextStep":{"type":"string"}}},"sites":{"type":"array","items":{"type":"object","required":["path","line","reason"],"properties":{"path":{"type":"string"},"line":{"type":"number"},"reason":{"type":"string"}}}},"sitesTotal":{"type":"number"},"locations":{"type":"array","items":{"type":"object","required":["path","line"],"properties":{"path":{"type":"string"},"line":{"type":"number"}}}},"migrationNotes":{"type":["string","null"]},"url":{"type":"string"}}}}}}}},"responses":{"2XX":{"description":"Received. Any other answer is retried."}}}},"fix.revised":{"post":{"operationId":"webhook.fix.revised","parameters":[{"name":"Since-Signature","in":"header","required":true,"schema":{"type":"string"}},{"name":"Since-Event","in":"header","required":true,"schema":{"type":"string"}},{"name":"Since-Delivery","in":"header","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","idempotencyKey","createdAt","data"],"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["fix.revised"]},"idempotencyKey":{"type":"string"},"createdAt":{"type":"string"},"data":{"type":"object","required":["type","pullRequest","reason","commitSha","sites"],"properties":{"type":{"type":"string","enum":["fix.revised"]},"pullRequest":{"type":"object","required":["id","number","url","headSha"],"properties":{"id":{"type":"string"},"number":{"type":["number","null"]},"url":{"type":["string","null"]},"headSha":{"type":["string","null"]}}},"reason":{"anyOf":[{"type":"object","required":["kind","checks","headSha"],"properties":{"kind":{"type":"string","enum":["ci_failed"]},"checks":{"type":"array","items":{"type":"string"}},"headSha":{"type":"string"},"login":{},"commentUrl":{}}},{"type":"object","required":["kind","login","commentUrl"],"properties":{"kind":{"type":"string","enum":["request"]},"login":{"type":"string"},"commentUrl":{"type":["string","null"]},"checks":{},"headSha":{}}}]},"commitSha":{"type":"string"},"sites":{"type":"array","items":{"type":"object","required":["path","line"],"properties":{"path":{"type":"string"},"line":{"type":"number"}}}}}}}}}}},"responses":{"2XX":{"description":"Received. Any other answer is retried."}}}},"fix.revision_failed":{"post":{"operationId":"webhook.fix.revision_failed","parameters":[{"name":"Since-Signature","in":"header","required":true,"schema":{"type":"string"}},{"name":"Since-Event","in":"header","required":true,"schema":{"type":"string"}},{"name":"Since-Delivery","in":"header","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","idempotencyKey","createdAt","data"],"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["fix.revision_failed"]},"idempotencyKey":{"type":"string"},"createdAt":{"type":"string"},"data":{"anyOf":[{"type":"object","required":["type","pullRequest","reason","keptCommit"],"properties":{"type":{"type":"string","enum":["fix.revision_failed"]},"pullRequest":{"type":"object","required":["id","number","url","headSha"],"properties":{"id":{"type":"string"},"number":{"type":["number","null"]},"url":{"type":["string","null"]},"headSha":{"type":["string","null"]}}},"reason":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}},"keptCommit":{"type":["string","null"]}}},{"type":"object","required":["type","pullRequest","reason","keptCommit"],"properties":{"type":{"type":"string","enum":["fix.revision_failed"]},"pullRequest":{"type":"object","required":["id","number","url","headSha"],"properties":{"id":{"type":"string"},"number":{"type":["number","null"]},"url":{"type":["string","null"]},"headSha":{"type":["string","null"]}}},"reason":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}},"keptCommit":{"type":["string","null"]}}}]}}}}}},"responses":{"2XX":{"description":"Received. Any other answer is retried."}}}}},"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"An API key created in the Since.dev app."}},"schemas":{"Error":{"type":"object","required":["error","message"],"properties":{"error":{"type":"string","description":"A stable code, for example invalid_input, unauthorized, credits_exhausted or not_found."},"message":{"type":"string","description":"One plain sentence saying what to change."},"details":{"type":"object","additionalProperties":{}}}}}}}