{"openapi":"3.1.0","info":{"title":"down.guide API","version":"1.0.0","description":"The REST twin of every down.guide MCP operation. No key.","contact":{"url":"https://down.guide/about"}},"servers":[{"url":"https://down.guide"}],"paths":{"/api/v1/providers/{slug}":{"get":{"operationId":"get_provider","summary":"Get provider","description":"Is <provider> down? One provider's live state from its official status page (operational, degraded, partial_outage, major_outage, maintenance, or not_reporting when down.guide can't read the page), a one-line verdict, open incidents, 90 days of daily bars and reliability stats.","responses":{"200":{"description":"OK","content":{"application/json":{}}},"400":{"description":"Bad input"},"404":{"description":"Not found"}},"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}]}},"/api/v1/incidents":{"get":{"operationId":"list_feed","summary":"List feed","description":"The newest incidents across providers (14 days), newest first, open ones on top, in pages of 30 (limit up to 100; pass next_cursor back as cursor for the next page; next_cursor is null on the last page). Filters combine: provider, category, impact, region, component, confidence (confirmed, corroborated), kind (incident, maintenance, all), state (active or recent) and filter=major (major outages plus 30+ minute incidents at the 50 most-depended-on providers). History imported from provider archives is never listed.","responses":{"200":{"description":"OK","content":{"application/json":{}}},"400":{"description":"Bad input"},"404":{"description":"Not found"}},"parameters":[{"name":"provider","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"description":"Provider slugs"},"style":"form","explode":false},{"name":"category","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","enum":["cloud","hosting","data","ai","devtools","observability","auth","commerce","messaging","workplace"]},"description":"Categories"},"style":"form","explode":false},{"name":"impact","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","enum":["operational","maintenance","degraded","partial_outage","major_outage","unknown"]},"description":"Worst impact reached"},"style":"form","explode":false},{"name":"region","in":"query","required":false,"schema":{"type":"string","description":"A region at any level: region: a cloud provider's own region, as the provider names it (us-east-1, europe-west4); area: a market area (us, eu, apac, latam, me); country: one country (au, ca, in, jp)"}},{"name":"component","in":"query","required":false,"schema":{"type":"string","description":"A component name or part of one"}},{"name":"confidence","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","enum":["confirmed","corroborated","unverified"]},"description":"How sure down.guide is that it happened (any of them): confirmed (the provider posted it) or corroborated (our own evidence). unverified is never public, so it lists nothing"},"style":"form","explode":false},{"name":"level","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","enum":["early_warning","confirmed","not_acknowledged"]},"description":"Deprecated, answers until 2027-01-09: use confidence"},"deprecated":true,"style":"form","explode":false},{"name":"kind","in":"query","required":false,"schema":{"type":"string","enum":["incident","maintenance","all"]}},{"name":"state","in":"query","required":false,"schema":{"type":"string","enum":["active","scheduled","resolved","recent"],"description":"active (open now), scheduled (maintenance that has not started), resolved (closed) or recent (the window, default)"}},{"name":"filter","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","enum":["major"]},"description":"major"},"style":"form","explode":false},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":30}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","description":"next_cursor of the last page"}}]}},"/api/v1/incidents/{id}":{"get":{"operationId":"get_incident","summary":"Get incident","description":"One incident by down.guide id (DWN-…): every update the provider posted, verbatim, down.guide's own evidence (always labeled as ours), lead time, a model-written summary (labeled with the model), root cause and postmortem link when published, and the cascade it belongs to.","responses":{"200":{"description":"OK","content":{"application/json":{}}},"400":{"description":"Bad input"},"404":{"description":"Not found"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/api/v1/cascades/{slug}":{"get":{"operationId":"get_cascade","summary":"Get cascade","description":"One cascade by slug: an upstream outage (a cloud, a CDN, an identity provider) and the providers that broke with it within 15 minutes, with the incident behind each and how it relates (upstream, attributed when the provider named the upstream, region when it named the same cloud region while the times overlap, overlapping when only the timing lines up). An incident's cascade field is its cascade's slug.","responses":{"200":{"description":"OK","content":{"application/json":{}}},"400":{"description":"Bad input"},"404":{"description":"Not found"}},"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}]}},"/api/v1/search":{"get":{"operationId":"search","summary":"Search","description":"Search incidents (400 days), providers and cascades: the one tool for finding past and present incidents, by words or by fields, and the providers and cascades a query names. Pass q (free text plus query keys: provider:, category:, impact:, region:, component:, confidence:, acknowledged: (true or false), state:, kind:, date: or started: (>30d, 2026-10, <2026-01-01), type: (incident, provider, cascade, or all; type:provider lists providers), filter:major, duration: (>2h), has: (rca, summary, lead, cascade), cause: (deploy_config, dns, network, certificate, capacity, upstream, datacenter, security), cascade:, sort: (relevance, started, duration, index); terms are ANDed, commas OR values, a leading - excludes), the typed parameters, or both: each parameter is ANDed with q as its key term. With no words, results are newest first, so provider: [\"github\"] lists GitHub's newest incidents. Words match whole words and their English forms, a misspelled word also matches the closest indexed names (githb finds GitHub), and \"last week\" or \"past month\" read as a started: bound. The answer is items: the incidents that match, and, when the query names a provider or cascade exactly, a row for it first; results holds the incidents alone, as it always did. Each result's match says why it matched: the fields each word hit (provider, title, summary, components, updates), the names a misspelled word was also searched as (alsoAs), and the key terms it meets. query echoes what ran, facets counts every match by type, provider, category, impact, confidence, kind and state, and problems lists anything the query couldn't use (a query with problems returns no results). With no matches, suggestions lists broader queries that do match; an empty answer is not evidence that nothing happened. Pass next_cursor back as cursor for the next page.","responses":{"200":{"description":"OK","content":{"application/json":{}}},"400":{"description":"Bad input"},"404":{"description":"Not found"}},"parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","description":"Free text and query keys. Optional when a typed parameter is passed."}},{"name":"provider","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"description":"Provider slugs or names (any of them)"},"style":"form","explode":false},{"name":"category","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","enum":["cloud","hosting","data","ai","devtools","observability","auth","commerce","messaging","workplace"]},"description":"Provider categories (any of them)"},"style":"form","explode":false},{"name":"impact","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","enum":["operational","maintenance","degraded","partial_outage","major_outage","unknown"]},"description":"Worst impact reached (any of them)"},"style":"form","explode":false},{"name":"confidence","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","enum":["confirmed","corroborated","unverified"]},"description":"How sure down.guide is that it happened (any of them); acknowledged:true or false is a key in q"},"style":"form","explode":false},{"name":"level","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","enum":["early_warning","confirmed","not_acknowledged"]},"description":"Deprecated, answers until 2027-01-09: use confidence"},"deprecated":true,"style":"form","explode":false},{"name":"kind","in":"query","required":false,"schema":{"type":"string","enum":["incident","maintenance","notice","all"],"description":"incident or maintenance; both when omitted or all"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","enum":["active","scheduled","resolved"],"description":"active (open now), scheduled (maintenance that has not started) or resolved; all when omitted"}},{"name":"started","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"description":"Start-time bounds, all applied: an age (>30d) or a date (>=2026-10-01, 2026-10); two bounds make a window, e.g. [\">=2026-10-01\", \"<2026-10-08\"]"},"style":"form","explode":false},{"name":"date","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"description":"The same as started: the name both cve.now and down.guide use for the date of an entry"},"style":"form","explode":false},{"name":"type","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","enum":["incident","provider","cascade","all"]},"description":"Entity types (any of them): the incidents, or the providers and cascades themselves. All of them when omitted"},"style":"form","explode":false},{"name":"filter","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","enum":["major"]},"description":"The priority slice: major (a major outage, or 30+ minutes at one of the most-reached providers)"},"style":"form","explode":false},{"name":"has","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","enum":["rca","summary","lead","cascade","event"]},"description":"What each incident has, all of them: rca (a postmortem), summary, lead, cascade or event"},"style":"form","explode":false},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","description":"next_cursor of the last page"}},{"name":"facets","in":"query","required":false,"schema":{"type":"boolean","description":"false leaves out the counts per facet"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Deprecated: use cursor"},"deprecated":true}]}},"/api/v1/check":{"post":{"operationId":"check_stack","summary":"Check stack","description":"Which providers a project depends on, and whether any has a problem now. Pass manifest_content: the contents of a package.json, any lockfile, requirements.txt, go.mod, Gemfile, Terraform, docker-compose, a .env file (only variable names are read) or a list of domains (manifest_name, the file name, is optional: it labels the evidence and breaks ties); packages: the (ecosystem, name) pairs of a lockfile you parsed yourself, names only and no versions (the down.guide CLI does this, so a large lockfile never travels); providers: slugs; or stack_id: the id of a stack saved with POST https://down.guide/api/v1/stacks (the same body as /api/v1/check; only the provider slugs are kept). They combine. Returns each provider with the reasons it matched, a confidence (likely, or possible for weak evidence like a bare REDIS_URL or a homepage link), live state, open incidents and a feed URL for exactly that stack. problems and openIncidents count only likely matches; possibleProblems lists the rest. manifest_content is not stored. No providers matched means none found, not that the project has no providers.","responses":{"200":{"description":"OK","content":{"application/json":{}}},"400":{"description":"Bad input"},"404":{"description":"Not found"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"manifest_name":{"type":"string","description":"Optional. The file name (package.json, poetry.lock, main.tf, .env.example...); the format is detected from the content and the name only breaks ties."},"manifest_content":{"type":"string","description":"The file's contents (2 MB max)"},"stack_id":{"type":"string","description":"The stack_id returned by POST https://down.guide/api/v1/stacks"},"packages":{"type":"array","maxItems":20000,"description":"Packages parsed from a lockfile on the client: [{ecosystem, name}] (or \"npm:name\" strings), each once. Names only: no versions or file contents are needed.","items":{"type":"object","properties":{"ecosystem":{"type":"string"},"name":{"type":"string"}},"required":["ecosystem","name"]}},"providers":{"type":"array","items":{"type":"string"},"description":"Provider slugs"},"input":{"type":"string","description":"Deprecated: use manifest_content"}},"additionalProperties":false}}}}}},"/api/v1/dependency":{"get":{"operationId":"check_dependency","summary":"Check dependency","description":"One dependency to the providers behind it and their live state: a package name (openai, npm:@aws-sdk/client-s3, pypi:stripe), an API host (api.github.com), an environment variable name (STRIPE_SECRET_KEY), a Terraform provider or resource, a container image or a provider name.","responses":{"200":{"description":"OK","content":{"application/json":{}}},"400":{"description":"Bad input"},"404":{"description":"Not found"}},"parameters":[{"name":"name","in":"query","required":false,"schema":{"type":"string"}}]}},"/api/v1/leaderboard":{"get":{"operationId":"get_leaderboard","summary":"Get leaderboard","description":"The Down Index: a week's worst incidents scored 0-100 (impact 30, breadth 20, duration 15, reach 20, acknowledgement 15; maintenance and narrow-scope incidents excluded), or with view=reliability the monthly ranking (minutes per impact, incident count, median time to resolve, median acknowledgement lag, postmortem rate). The same rankings are pages: /rankings/index (a closed week at /rankings/index/<YYYY-Www>) and /rankings/providers/downtime (a closed month at /rankings/providers/downtime/<YYYY-MM>), with uptime at /rankings/providers/uptime.","responses":{"200":{"description":"OK","content":{"application/json":{}}},"400":{"description":"Bad input"},"404":{"description":"Not found"}},"parameters":[{"name":"view","in":"query","required":false,"schema":{"type":"string","enum":["index","reliability"]}},{"name":"week","in":"query","required":false,"schema":{"type":"string","description":"YYYY-Www for the index, this week by default"}},{"name":"month","in":"query","required":false,"schema":{"type":"string","description":"YYYY-MM (01 to 12) for view=reliability"}},{"name":"category","in":"query","required":false,"schema":{"type":"string","enum":["cloud","hosting","data","ai","devtools","observability","auth","commerce","messaging","workplace"]}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":500,"description":"Rows: 1 to 100 for the index, 1 to 500 for reliability"}}]}},"/api/v1/feedback":{"post":{"operationId":"send_feedback","summary":"Send feedback","description":"Send a note to the people who run down.guide: a wrong provider mapping, a missing provider, a bad summary. Not public.","responses":{"200":{"description":"OK","content":{"application/json":{}}},"400":{"description":"Bad input"},"404":{"description":"Not found"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","maxLength":4000},"page":{"type":"string","description":"The down.guide URL it is about"},"contact":{"type":"string","description":"Optional email for a reply"}},"required":["message"],"additionalProperties":false}}}}}},"/api/v1/reports":{"post":{"operationId":"report_outage","summary":"Report outage","description":"Report that a provider isn't working for you (or for the agent's user) right now. Reports count only in aggregate against the provider's own baseline, are deduplicated per caller per 10 minutes, and alone never make a public claim.","responses":{"200":{"description":"OK","content":{"application/json":{}}},"400":{"description":"Bad input"},"404":{"description":"Not found"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"provider":{"type":"string"},"incident_id":{"type":"string"}},"required":["provider"],"additionalProperties":false}}}}}},"/api/v1/reports/affected":{"post":{"operationId":"report_affected","summary":"Report affected","description":"Say an existing incident affects you. Counted in aggregate on the incident page, deduplicated per caller per 10 minutes.","responses":{"200":{"description":"OK","content":{"application/json":{}}},"400":{"description":"Bad input"},"404":{"description":"Not found"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"provider":{"type":"string"},"incident_id":{"type":"string"}},"required":["provider","incident_id"],"additionalProperties":false}}}}}},"/api/v1/rankings":{"get":{"operationId":"rankings.list","summary":"List the rankings","description":"Every ranking the site has, with its id, title, the entity type it ranks, its periods (time tokens, default first), the archive it keeps (week or month, for at) and the filters rankings.get takes. url is the ranking's page, null for a ranking only the API serves.","responses":{"200":{"description":"OK: the same JSON as the MCP operation rankings.list","content":{"application/json":{}}},"400":{"description":"Bad input: { error, param, value?, valid? }"},"404":{"description":"No such ranking: { error: \"not_found\", param, value, valid }"},"429":{"description":"Rate limited: { error }, with Retry-After"}}}},"/api/v1/rankings/{id}":{"get":{"operationId":"rankings.get","summary":"Get one ranking","description":"One ranking's rows, ranked. id is a ranking from rankings.list (incidents, providers-uptime, providers-downtime). period picks a rolling window from the ranking's periods (7d, 30d, 365d, all, 90d; default the first), at an archived ISO week (2026-W45) or month (2026-10) when the ranking keeps that archive; a ranking with no periods shows the current week or month. The filters are the ranking's own (tech, ecosystem, filter, category). Any other argument or value answers 400 with the valid ones. The answer is { id, title, type, period or at, url, rows }.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","enum":["incidents","providers-uptime","providers-downtime"]}},{"name":"period","in":"query","required":false,"schema":{"type":"string","description":"A rolling window from the ranking's periods, such as 7d, 30d, 365d, all or 90d. Default: the ranking's first."}},{"name":"at","in":"query","required":false,"schema":{"type":"string","description":"An archived ISO week (2026-W45) or calendar month (2026-10), when the ranking keeps that archive."}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Rows to return. Default 25."}},{"name":"category","in":"query","required":false,"schema":{"description":"Narrows the rankings that take category. One value, or a list.","oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}}],"responses":{"200":{"description":"OK: the same JSON as the MCP operation rankings.get","content":{"application/json":{}}},"400":{"description":"Bad input: { error, param, value?, valid? }"},"404":{"description":"No such ranking: { error: \"not_found\", param, value, valid }"},"429":{"description":"Rate limited: { error }, with Retry-After"}}}},"/feed":{"get":{"operationId":"get_feed","summary":"Feed","description":"One feed of incidents and cascades: RSS by default, Atom or JSON Feed with format. Without type it lists incidents; type=cascade lists cascades and type=all both. A cascade takes provider (its upstream provider) and no other filter, so a filter other than provider lists incidents only. Unknown parameters are ignored; an invalid value of a known one answers 400.","parameters":[{"name":"type","in":"query","required":false,"description":"The record types to list. Without it the feed lists what it always did.","schema":{"type":"array","items":{"type":"string","enum":["incident","cascade","all"]}},"style":"form","explode":false},{"name":"kind","in":"query","required":false,"description":"The subtype inside a type.","schema":{"type":"array","items":{"type":"string","enum":["incident","maintenance","notice","all"]}},"style":"form","explode":false},{"name":"format","in":"query","required":false,"description":"rss (default), atom or json (JSON Feed 1.1).","schema":{"type":"string","enum":["rss","atom","json"]}},{"name":"provider","in":"query","required":false,"description":"Provider slugs (incidents; cascades: the upstream provider).","schema":{"type":"array","items":{"type":"string"}},"style":"form","explode":false},{"name":"category","in":"query","required":false,"description":"Provider categories (incidents).","schema":{"type":"array","items":{"type":"string"}},"style":"form","explode":false},{"name":"region","in":"query","required":false,"description":"Regions (incidents).","schema":{"type":"array","items":{"type":"string"}},"style":"form","explode":false},{"name":"component","in":"query","required":false,"description":"Components (incidents).","schema":{"type":"array","items":{"type":"string"}},"style":"form","explode":false},{"name":"impact","in":"query","required":false,"description":"Worst impact (incidents).","schema":{"type":"array","items":{"type":"string","enum":["operational","maintenance","degraded","partial_outage","major_outage","unknown"]}},"style":"form","explode":false},{"name":"confidence","in":"query","required":false,"description":"confirmed or corroborated (incidents).","schema":{"type":"array","items":{"type":"string"}},"style":"form","explode":false},{"name":"state","in":"query","required":false,"description":"Where the incident stands (incidents).","schema":{"type":"array","items":{"type":"string","enum":["active","scheduled","resolved","recent"]}},"style":"form","explode":false},{"name":"filter","in":"query","required":false,"description":"major: only major outages (incidents).","schema":{"type":"array","items":{"type":"string","enum":["major"]}},"style":"form","explode":false}],"responses":{"200":{"description":"The feed, in the format asked for","content":{"application/rss+xml":{},"application/atom+xml":{},"application/feed+json":{}}},"400":{"description":"An invalid value of a known parameter: { error, param, value, valid }"}}}},"/api/v1/providers":{"get":{"operationId":"list_provider","summary":"List providers","description":"Providers, one page: 30 by default. `next_cursor` goes back as `cursor` for the next page and is null on the last. A parameter that is unknown or does not apply to this type is a 400. `providers` is the same array as `items`, kept for readers that already use it (legacy).","parameters":[{"name":"type","in":"query","required":false,"description":"Accepted for symmetry with /feed and search; it must be provider","schema":{"type":"string","enum":["provider"]}},{"name":"category","in":"query","required":false,"description":"Narrows Providers by category","style":"form","explode":false,"schema":{"type":"array","items":{"type":"string","enum":["cloud","hosting","data","ai","devtools","observability","auth","commerce","messaging","workplace"]}}},{"name":"q","in":"query","required":false,"description":"Keeps the providers whose name, slug or alias contains the text","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Page size, 1 to 200 (default 30)","schema":{"type":"integer","minimum":1,"maximum":200,"default":30}},{"name":"cursor","in":"query","required":false,"description":"next_cursor of the previous page","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["items","next_cursor"],"properties":{"items":{"type":"array","items":{"type":"object","description":"One provider: type, kind, id, url and title, then this site's own fields","required":["type","kind","id","url","title"],"properties":{"type":{"type":"string","const":"provider"},"kind":{"type":["string","null"]},"id":{"type":"string"},"url":{"type":"string","format":"uri"},"title":{"type":"string"}},"additionalProperties":true}},"next_cursor":{"type":["string","null"]},"total":{"type":"integer"},"providers":{"type":"array","items":{"type":"object","description":"One provider: type, kind, id, url and title, then this site's own fields","required":["type","kind","id","url","title"],"properties":{"type":{"type":"string","const":"provider"},"kind":{"type":["string","null"]},"id":{"type":"string"},"url":{"type":"string","format":"uri"},"title":{"type":"string"}},"additionalProperties":true},"deprecated":true,"description":"Legacy: the same array as items"}},"additionalProperties":true}}}},"400":{"description":"A parameter is unknown, does not apply to this type or has an invalid value: { error, param, value?, valid?, applies_to?, hint? }"},"404":{"description":"Not found: { error: 'not_found', type, id, hint? }"},"429":{"description":"Rate limited: { error }, with Retry-After"},"503":{"description":"Temporarily unavailable: { error }, with Retry-After"}}}},"/api/v1/cascades":{"get":{"operationId":"list_cascade","summary":"List cascades","description":"Cascades, one page: 30 by default. `next_cursor` goes back as `cursor` for the next page and is null on the last. A parameter that is unknown or does not apply to this type is a 400.","parameters":[{"name":"type","in":"query","required":false,"description":"Accepted for symmetry with /feed and search; it must be cascade","schema":{"type":"string","enum":["cascade"]}},{"name":"provider","in":"query","required":false,"description":"Narrows Cascades by provider","style":"form","explode":false,"schema":{"type":"array","items":{"type":"string"}}},{"name":"limit","in":"query","required":false,"description":"Page size, 1 to 200 (default 30)","schema":{"type":"integer","minimum":1,"maximum":200,"default":30}},{"name":"cursor","in":"query","required":false,"description":"next_cursor of the previous page","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["items","next_cursor"],"properties":{"items":{"type":"array","items":{"type":"object","description":"One cascade: type, kind, id, url and title, then this site's own fields","required":["type","kind","id","url","title"],"properties":{"type":{"type":"string","const":"cascade"},"kind":{"type":["string","null"]},"id":{"type":"string"},"url":{"type":"string","format":"uri"},"title":{"type":"string"}},"additionalProperties":true}},"next_cursor":{"type":["string","null"]},"total":{"type":"integer"}},"additionalProperties":true}}}},"400":{"description":"A parameter is unknown, does not apply to this type or has an invalid value: { error, param, value?, valid?, applies_to?, hint? }"},"404":{"description":"Not found: { error: 'not_found', type, id, hint? }"},"429":{"description":"Rate limited: { error }, with Retry-After"},"503":{"description":"Temporarily unavailable: { error }, with Retry-After"}}}},"/api/v1/stacks":{"post":{"operationId":"save_stack","summary":"Save stack","description":"Save a stack from the same body as POST /api/v1/check. Only the matched provider slugs are kept; returns stack_id, which stack.check takes. Saving the same providers again returns the same id.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"manifest_name":{"type":"string","description":"Optional. The file name (package.json, poetry.lock, main.tf, .env.example...); the format is detected from the content and the name only breaks ties."},"manifest_content":{"type":"string","description":"The file's contents (2 MB max)"},"stack_id":{"type":"string","description":"The stack_id returned by POST https://down.guide/api/v1/stacks"},"packages":{"type":"array","maxItems":20000,"description":"Packages parsed from a lockfile on the client: [{ecosystem, name}] (or \"npm:name\" strings), each once. Names only: no versions or file contents are needed.","items":{"type":"object","properties":{"ecosystem":{"type":"string"},"name":{"type":"string"}},"required":["ecosystem","name"]}},"providers":{"type":"array","items":{"type":"string"},"description":"Provider slugs"},"input":{"type":"string","description":"Deprecated: use manifest_content"}},"additionalProperties":false}}}},"responses":{"200":{"description":"OK","content":{"application/json":{}}},"400":{"description":"Bad input"},"422":{"description":"No catalog provider matched"}}}}}}