Fwozen Branches API
Watched branches. Watching a branch is what tells Fwozen where to write the `fwozen` check and whose rules to read, and a branch id (`wbr_…`) is what a branch-scoped freeze names.
Watched branches. Watching a branch is what tells Fwozen where to write the `fwozen` check and whose rules to read, and a branch id (`wbr_…`) is what a branch-scoped freeze names.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/fwozen-com:fwozen-com-branches-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Fwozen Com Branches API
version: 1.0.0
contact:
name: Fwozen support
url: https://fwozen.com/docs
email: hello@fwozen.com
license:
name: Fwozen Terms of Service
url: https://fwozen.com/legal/terms
description: 'Operations tagged Branches across 2 of this provider''s published API definitions: fwozen-com-openapi.json, fwozen-com-openapi.yml. Each path carries the servers of the definition it was published in.'
servers:
- url: https://api.fwozen.com
security:
- bearerApiKey: []
tags:
- name: Branches
description: Watched branches. Watching a branch is what tells Fwozen where to write the `fwozen` check and whose rules to read, and a branch id (`wbr_…`) is what a branch-scoped freeze names.
paths:
/v1/repos/{repoId}/branches:
get:
operationId: listRepoBranches
summary: List watched branches of a repository
tags:
- Branches
security:
- bearerApiKey:
- repo:read
- bearerJwt: []
parameters:
- name: repoId
in: path
required: true
schema:
type: string
pattern: ^repo_[1-9A-HJ-NP-Za-km-z]{16}$
responses:
'200':
description: List watched branches of a repository
content:
application/json:
schema:
$ref: '#/components/schemas/BranchList'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'422':
$ref: '#/components/responses/ValidationFailed'
'429':
$ref: '#/components/responses/RateLimited'
x-fwozen-rate-cost: 1
x-fwozen-scopes:
- repo:read
post:
operationId: watchBranch
summary: Watch a branch
tags:
- Branches
security:
- bearerApiKey:
- repo:write
- bearerJwt: []
parameters:
- name: repoId
in: path
required: true
schema:
type: string
pattern: ^repo_[1-9A-HJ-NP-Za-km-z]{16}$
responses:
'201':
description: Watch a branch
content:
application/json:
schema:
$ref: '#/components/schemas/Branch'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'422':
$ref: '#/components/responses/ValidationFailed'
'429':
$ref: '#/components/responses/RateLimited'
x-fwozen-rate-cost: 1
x-fwozen-permissions:
- repo:configure
x-fwozen-scopes:
- repo:write
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/WatchBranchInputInput'
servers:
- url: https://api.fwozen.com
/v1/repos/{repoId}/remote-branches:
get:
operationId: listRemoteBranches
summary: List branches live from GitHub (cached 60s, budget-gated)
tags:
- Branches
security:
- bearerApiKey:
- repo:read
- bearerJwt: []
parameters:
- name: repoId
in: path
required: true
schema:
type: string
pattern: ^repo_[1-9A-HJ-NP-Za-km-z]{16}$
- name: q
in: query
required: false
schema:
type: string
maxLength: 200
- name: limit
in: query
required: false
schema:
default: 100
type: integer
minimum: 1
maximum: 200
responses:
'200':
description: List branches live from GitHub (cached 60s, budget-gated)
content:
application/json:
schema:
$ref: '#/components/schemas/RemoteBranches'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'422':
$ref: '#/components/responses/ValidationFailed'
'429':
$ref: '#/components/responses/RateLimited'
x-fwozen-rate-cost: 5
x-fwozen-scopes:
- repo:read
servers:
- url: https://api.fwozen.com
/v1/branches:
get:
operationId: listBranches
summary: List watched branches
tags:
- Branches
security:
- bearerApiKey:
- repo:read
- bearerJwt: []
parameters:
- name: limit
in: query
required: false
schema:
default: 50
type: integer
minimum: 1
maximum: 200
- name: cursor
in: query
required: false
schema:
type: string
maxLength: 512
- name: repoId
in: query
required: false
schema:
type: string
pattern: ^repo_[1-9A-HJ-NP-Za-km-z]{16}$
- name: frozen
in: query
required: false
schema:
type: string
- name: paused
in: query
required: false
schema:
type: string
- name: enforcement
in: query
required: false
schema:
anyOf:
- type: array
items:
type: string
enum:
- green
- yellow
- red
- unknown
- type: string
enum:
- green
- yellow
- red
- unknown
- name: q
in: query
required: false
schema:
type: string
maxLength: 120
responses:
'200':
description: List watched branches
content:
application/json:
schema:
$ref: '#/components/schemas/BranchPage'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'422':
$ref: '#/components/responses/ValidationFailed'
'429':
$ref: '#/components/responses/RateLimited'
x-fwozen-rate-cost: 1
x-fwozen-scopes:
- repo:read
servers:
- url: https://api.fwozen.com
/v1/branches/{branchId}:
get:
operationId: getBranch
summary: Get a watched branch
tags:
- Branches
security:
- bearerApiKey:
- repo:read
- bearerJwt: []
parameters:
- name: branchId
in: path
required: true
schema:
type: string
pattern: ^wbr_[1-9A-HJ-NP-Za-km-z]{16}$
responses:
'200':
description: Get a watched branch
content:
application/json:
schema:
$ref: '#/components/schemas/Branch'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'422':
$ref: '#/components/responses/ValidationFailed'
'429':
$ref: '#/components/responses/RateLimited'
x-fwozen-rate-cost: 1
x-fwozen-scopes:
- repo:read
patch:
operationId: updateBranch
summary: Update watched-branch settings
tags:
- Branches
security:
- bearerApiKey:
- repo:write
- bearerJwt: []
parameters:
- name: branchId
in: path
required: true
schema:
type: string
pattern: ^wbr_[1-9A-HJ-NP-Za-km-z]{16}$
responses:
'200':
description: Update watched-branch settings
content:
application/json:
schema:
$ref: '#/components/schemas/Branch'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'422':
$ref: '#/components/responses/ValidationFailed'
'429':
$ref: '#/components/responses/RateLimited'
x-fwozen-rate-cost: 1
x-fwozen-permissions:
- repo:configure
x-fwozen-scopes:
- repo:write
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateBranchInputInput'
delete:
operationId: unwatchBranch
summary: Stop watching a branch
tags:
- Branches
security:
- bearerApiKey:
- repo:write
- bearerJwt: []
parameters:
- name: branchId
in: path
required: true
schema:
type: string
pattern: ^wbr_[1-9A-HJ-NP-Za-km-z]{16}$
responses:
'200':
description: Stop watching a branch
content:
application/json:
schema:
$ref: '#/components/schemas/Ok'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'422':
$ref: '#/components/responses/ValidationFailed'
'429':
$ref: '#/components/responses/RateLimited'
x-fwozen-rate-cost: 1
x-fwozen-permissions:
- repo:configure
x-fwozen-scopes:
- repo:write
servers:
- url: https://api.fwozen.com
components:
schemas:
EnforcementDetailView:
type: object
properties:
checkedAt:
type: string
format: date-time
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
probedAt:
type: string
format: date-time
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
verifiedAt:
anyOf:
- type: string
format: date-time
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
- type: 'null'
probeStatus:
type: string
enum:
- ok
- forbidden
- not_found
- error
configuration:
type: string
enum:
- verified
- needs_attention
- missing
- unknown
bypassAssurance:
type: string
enum:
- present
- known_none
- unknown
required:
type: boolean
pinnedIntegrationId:
anyOf:
- type: integer
minimum: -9007199254740991
maximum: 9007199254740991
- type: 'null'
ourAppId:
type: integer
minimum: -9007199254740991
maximum: 9007199254740991
contextName:
type: string
requiredChecks:
type: array
items:
type: object
properties:
context:
type: string
integrationId:
anyOf:
- type: integer
minimum: -9007199254740991
maximum: 9007199254740991
- type: 'null'
sourceType:
type: string
enum:
- Repository
- Organization
- Enterprise
- ClassicBranchProtection
rulesetId:
anyOf:
- type: integer
minimum: -9007199254740991
maximum: 9007199254740991
- type: 'null'
required:
- context
- integrationId
- sourceType
- rulesetId
additionalProperties: false
sources:
type: array
items:
type: object
properties:
type:
type: string
enum:
- Repository
- Organization
- Enterprise
- ClassicBranchProtection
rulesetId:
type: integer
minimum: -9007199254740991
maximum: 9007199254740991
rulesetName:
type: string
enforcement:
type: string
enum:
- active
- evaluate
- disabled
contributesRequirement:
type: boolean
detailProbe:
type: string
enum:
- ok
- forbidden
- failed
- not_attempted
bypassField:
type: string
enum:
- present
- absent
bypassActorCount:
type: integer
minimum: -9007199254740991
maximum: 9007199254740991
required:
- type
- contributesRequirement
- detailProbe
- bypassField
- bypassActorCount
additionalProperties: false
evidence:
type: object
properties:
pagesRead:
type: integer
minimum: -9007199254740991
maximum: 9007199254740991
complete:
type: boolean
truncated:
type: boolean
rulesetPathObserved:
type: boolean
setupKind:
type: string
enum:
- unknown
- organization_ruleset
- repository_ruleset
- classic
- unavailable
stale:
type: boolean
required:
- pagesRead
- complete
- truncated
- rulesetPathObserved
- setupKind
- stale
additionalProperties: false
bypassActors:
type: array
items:
type: object
properties:
actorId:
anyOf:
- type: integer
minimum: -9007199254740991
maximum: 9007199254740991
- type: 'null'
actorType:
type: string
actorName:
type: string
bypassMode:
type: string
required:
- actorId
- actorType
- actorName
- bypassMode
additionalProperties: false
enforceAdmins:
anyOf:
- type: boolean
- type: 'null'
strictPolicy:
type: boolean
mergeQueue:
anyOf:
- type: object
properties:
enabled:
type: boolean
checkResponseTimeoutMinutes:
type: integer
minimum: -9007199254740991
maximum: 9007199254740991
groupingStrategy:
type: string
required:
- enabled
- checkResponseTimeoutMinutes
- groupingStrategy
additionalProperties: false
- type: 'null'
warnings:
type: array
items:
type: string
enum:
- not_required
- not_pinned
- bypass_actors_present
- enforce_admins_disabled
- classic_and_ruleset_conflict
- status_and_check_same_name
- strict_policy_enabled
- ruleset_evaluate_mode
- merge_queue_timeout_low
- probe_forbidden
- pinned_wrong_app
- conflicting_required_entries
- evidence_truncated
- evidence_stale
- classic_guidance_only
- bypass_unknown
- bypass_evidence_incomplete
- no_rules_observed
- probe_not_found
- probe_failed
branchId:
type: string
pattern: ^wbr_[1-9A-HJ-NP-Za-km-z]{16}$
repoFullName:
type: string
branch:
type: string
level:
type: string
enum:
- green
- yellow
- red
- unknown
display:
type: string
enum:
- enforced
- advisory_unpinned
- advisory_bypass
- advisory_classic_conflict
- advisory_other
- unenforced
- unknown
problems:
type: array
items:
$ref: '#/components/schemas/EnforcementProblem'
required:
- checkedAt
- probedAt
- verifiedAt
- probeStatus
- configuration
- bypassAssurance
- required
- pinnedIntegrationId
- ourAppId
- contextName
- requiredChecks
- sources
- evidence
- bypassActors
- enforceAdmins
- strictPolicy
- mergeQueue
- warnings
- branchId
- repoFullName
- branch
- level
- display
- problems
additionalProperties: false
EnforcementProblem:
type: object
properties:
code:
type: string
severity:
type: string
enum:
- error
- warn
- info
message:
type: string
fix:
anyOf:
- type: string
enum:
- auto
- manual
- iac
- type: 'null'
required:
- code
- severity
- message
- fix
additionalProperties: false
RemoteBranches:
type: object
properties:
branches:
type: array
items:
type: object
properties:
name:
type: string
isDefault:
type: boolean
protected:
type: boolean
watched:
type: boolean
required:
- name
- isDefault
- protected
- watched
additionalProperties: false
cachedAt:
type: string
format: date-time
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
truncated:
type: boolean
required:
- branches
- cachedAt
- truncated
additionalProperties: false
BranchPage:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/Branch'
nextCursor:
anyOf:
- type: string
- type: 'null'
required:
- data
- nextCursor
additionalProperties: false
UpdateBranchInputInput:
type: object
properties:
freezeMethod:
type: string
enum:
- check_run
- commit_status
exceptionPolicy:
type: string
enum:
- sticky
- strict
allowDeploymentsWhileFrozen:
type: boolean
paused:
type: boolean
deployGateEnabled:
type: boolean
usesClassicProtection:
type: boolean
Ok:
type: object
properties:
ok:
type: boolean
const: true
required:
- ok
additionalProperties: false
WatchBranchInputInput:
type: object
properties:
branch:
type: string
minLength: 1
maxLength: 255
freezeMethod:
type: string
enum:
- check_run
- commit_status
deployGateEnabled:
default: false
type: boolean
required:
- branch
Branch:
type: object
properties:
id:
type: string
pattern: ^wbr_[1-9A-HJ-NP-Za-km-z]{16}$
repoId:
type: string
pattern: ^repo_[1-9A-HJ-NP-Za-km-z]{16}$
repoFullName:
type: string
branch:
type: string
freezeMethod:
type: string
enum:
- check_run
- commit_status
exceptionPolicy:
anyOf:
- type: string
enum:
- sticky
- strict
- type: 'null'
allowDeploymentsWhileFrozen:
type: boolean
deployGateEnabled:
type: boolean
paused:
type: boolean
frozen:
type: boolean
activeFreezeId:
anyOf:
- type: string
pattern: ^frz_[1-9A-HJ-NP-Za-km-z]{16}$
- type: 'null'
enforcement:
type: string
enum:
- green
- yellow
- red
- unknown
enforcementStatus:
type: string
enum:
- enforcing
- enrolled_not_enforcing
- unknown
enforcementDetail:
anyOf:
- $ref: '#/components/schemas/EnforcementDetailView'
- type: 'null'
enforcementVerifiedAt:
anyOf:
- type: string
format: date-time
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
- type: 'null'
lastReconciledAt:
anyOf:
- type: string
format: date-time
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
- type: 'null'
reconcileDriftCount:
type: integer
minimum: -9007199254740991
maximum: 9007199254740991
nextScheduledFreezeAt:
anyOf:
- type: string
format: date-time
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
- type: 'null'
warnings:
default: []
type: array
items:
type: string
required:
- id
- repoId
- repoFullName
- branch
- freezeMethod
- exceptionPolicy
- allowDeploymentsWhileFrozen
- deployGateEnabled
- paused
- frozen
- activeFreezeId
- enforcement
- enforcementStatus
- enforcementDetail
- enforcementVerifiedAt
- lastReconciledAt
- reconcileDriftCount
- nextScheduledFreezeAt
- warnings
additionalProperties: false
ErrorEnvelope:
type: object
properties:
error:
type: object
properties:
type:
type: string
code:
type: string
message:
type: string
details:
type: array
items:
type: object
properties:
path:
type: string
message:
type: string
required:
- path
- message
additionalProperties: false
docsUrl:
type: string
requestId:
type: string
warnings:
type: array
items:
type: string
required:
- type
- code
- message
- requestId
additionalProperties: false
required:
- error
additionalProperties: false
BranchList:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/Branch'
required:
- data
additionalProperties: false
responses:
Forbidden:
description: Authenticated, but not permitted.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
NotFound:
description: No such resource — also returned for another organization's id.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
BadRequest:
description: Malformed request.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
RateLimited:
description: Rate limit exceeded. Honour the `Retry-After` header.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
Unauthorized:
description: Missing or invalid credentials.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
ValidationFailed:
description: The request failed schema validation; see `error.details`.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
securitySchemes:
bearerApiKey:
type: http
scheme: bearer
bearerFormat: fwz_<env>_<40 base58>
description: 'Org-scoped, never user-scoped: the scope list IS the authorization. Calling a
session-only route with a key returns **403 `credential_type_not_allowed`**, never 401,
so scripts get an actionable message.
**Where one comes from.** Sign in at
[https://fwozen.com/app/settings/api-keys](https://fwozen.com/app/settings/api-keys) as an owner or an
admin, press **Create key**, tick the narrowest scopes that do the job (`freeze:read`
for a deploy gate, `freeze:write` to freeze and thaw), pick an expiry, and copy the
secret, which is shown once. `POST /v1/api-keys` is the same thing programmatically and
takes a **session** credential only, so a key can never mint another key. Scopes are
fixed at creation and cannot be widened.
- `freeze:read` — List freezes, freeze targets and freeze state, including GET /v1/freeze-state.
- `freeze:write` — Start a freeze, lift one, extend one, create a thaw override, retry targets.
- `schedule:read` — List schedules, occurrences and previews.
- `schedule:write` — Create, edit, delete, skip and import schedules.
- `exception:read` — List per-PR exceptions and exception requests.
- `exception:write` — Grant, decide and revoke per-PR exceptions.
- `repo:read` — List repositories, watched branches and enforcement state.
- `repo:write` — Enable or disable repositories and change watched-branch settings.
- `audit:read` — Read the audit log and stream the CSV export.
- `billing:read` — Read the billing summary, plan, trial state and resolved entitlements.
- `billing:write` — Start the 14-day no-card trial, and ask for a Stripe Checkout or Customer Portal link. It cannot pay for anything: those routes return a URL for a human to open and take no card details of any kind.'
bearerJwt:
type: http
scheme: bearer
bearerFormat: JWT
description: A short-lived RS256 session token from `GET /api/auth/token` on the web origin. Used by the dashboard, the CLI and agents; audience-bound to this API.
x-refined-from:
- fwozen-com-openapi.json
- fwozen-com-openapi.yml
x-provenance:
method: harvested
publisher: Fwozen
source: https://fwozen.com/openapi.json
note: split by refine-openapis from the provider's own published document, verified by fetch (openapi/_original/*.fetch.json);
stamped by stamp-openapi-provenance.py (roadmap#793)