Fwozen Exceptions API

Letting one pull request through an active freeze, with a reason and a time limit, and the request-and-approve flow for organizations that require a second person.

GitHub OpenAPI

Operations 7

GET /v1/exceptions List exceptions #
POST /v1/exceptions Grant a per-PR exception (one row per covering freeze) #
GET /v1/exceptions/{exceptionId} Get an exception #
POST /v1/exceptions/{exceptionId}/revoke Revoke an exception (never entitlement-gated) #
GET /v1/exception-requests List pending exception requests #
POST /v1/exception-requests Request an exception for a pull request #
POST /v1/exception-requests/{exceptionId}/decide Grant or deny an exception request #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • 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.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/fwozen-com:fwozen-com-exceptions-api"
All apis
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.

Get an API 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 Specification

fwozen-com-exceptions-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Fwozen Com Exceptions 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 Exceptions 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: Exceptions
  description: Letting one pull request through an active freeze, with a reason and a time limit, and the request-and-approve flow for organizations that require a second person.
paths:
  /v1/exceptions:
    get:
      operationId: listExceptions
      summary: List exceptions
      tags:
      - Exceptions
      security:
      - bearerApiKey:
        - exception: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: state
        in: query
        required: false
        schema:
          anyOf:
          - type: array
            items:
              type: string
              enum:
              - pending
              - active
              - expired
              - revoked
              - consumed
              - denied
          - type: string
            enum:
            - pending
            - active
            - expired
            - revoked
            - consumed
            - denied
      - name: freezeId
        in: query
        required: false
        schema:
          type: string
          pattern: ^frz_[1-9A-HJ-NP-Za-km-z]{16}$
      - name: repoId
        in: query
        required: false
        schema:
          type: string
          pattern: ^repo_[1-9A-HJ-NP-Za-km-z]{16}$
      - name: prNumber
        in: query
        required: false
        schema:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
      responses:
        '200':
          description: List exceptions
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ExceptionPage'
        '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:
      - freeze:read
      x-fwozen-scopes:
      - exception:read
    post:
      operationId: grantException
      summary: Grant a per-PR exception (one row per covering freeze)
      tags:
      - Exceptions
      security:
      - bearerApiKey:
        - exception:write
      - bearerJwt: []
      responses:
        '201':
          description: Grant a per-PR exception (one row per covering freeze)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Exception'
        '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-feature: pr_exceptions
      x-fwozen-permissions:
      - exception:grant
      x-fwozen-scopes:
      - exception:write
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/GrantExceptionInputInput'
    servers:
    - url: https://api.fwozen.com
  /v1/exceptions/{exceptionId}:
    get:
      operationId: getException
      summary: Get an exception
      tags:
      - Exceptions
      security:
      - bearerApiKey:
        - exception:read
      - bearerJwt: []
      parameters:
      - name: exceptionId
        in: path
        required: true
        schema:
          type: string
          pattern: ^exc_[1-9A-HJ-NP-Za-km-z]{16}$
      responses:
        '200':
          description: Get an exception
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Exception'
        '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:
      - freeze:read
      x-fwozen-scopes:
      - exception:read
    servers:
    - url: https://api.fwozen.com
  /v1/exceptions/{exceptionId}/revoke:
    post:
      operationId: revokeException
      summary: Revoke an exception (never entitlement-gated)
      tags:
      - Exceptions
      security:
      - bearerApiKey:
        - exception:write
      - bearerJwt: []
      parameters:
      - name: exceptionId
        in: path
        required: true
        schema:
          type: string
          pattern: ^exc_[1-9A-HJ-NP-Za-km-z]{16}$
      responses:
        '200':
          description: Revoke an exception (never entitlement-gated)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Exception'
        '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:
      - exception:revoke
      x-fwozen-scopes:
      - exception:write
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RevokeExceptionInputInput'
    servers:
    - url: https://api.fwozen.com
  /v1/exception-requests:
    get:
      operationId: listExceptionRequests
      summary: List pending exception requests
      tags:
      - Exceptions
      security:
      - bearerApiKey:
        - exception: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: state
        in: query
        required: false
        schema:
          anyOf:
          - type: array
            items:
              type: string
              enum:
              - pending
              - active
              - expired
              - revoked
              - consumed
              - denied
          - type: string
            enum:
            - pending
            - active
            - expired
            - revoked
            - consumed
            - denied
      - name: repoId
        in: query
        required: false
        schema:
          type: string
          pattern: ^repo_[1-9A-HJ-NP-Za-km-z]{16}$
      - name: prNumber
        in: query
        required: false
        schema:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
      responses:
        '200':
          description: List pending exception requests
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ExceptionRequestPage'
        '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:
      - freeze:read
      x-fwozen-scopes:
      - exception:read
    post:
      operationId: requestException
      summary: Request an exception for a pull request
      tags:
      - Exceptions
      security:
      - bearerApiKey:
        - exception:write
      - bearerJwt: []
      responses:
        '201':
          description: Request an exception for a pull request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ExceptionRequest'
        '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-feature: pr_exceptions
      x-fwozen-permissions:
      - exception:request
      x-fwozen-scopes:
      - exception:write
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RequestExceptionInputInput'
    servers:
    - url: https://api.fwozen.com
  /v1/exception-requests/{exceptionId}/decide:
    post:
      operationId: decideExceptionRequest
      summary: Grant or deny an exception request
      tags:
      - Exceptions
      security:
      - bearerApiKey:
        - exception:write
      - bearerJwt: []
      parameters:
      - name: exceptionId
        in: path
        required: true
        schema:
          type: string
          pattern: ^exc_[1-9A-HJ-NP-Za-km-z]{16}$
      responses:
        '200':
          description: Grant or deny an exception request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ExceptionRequest'
        '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-feature: pr_exceptions
      x-fwozen-permissions:
      - exception:grant
      x-fwozen-scopes:
      - exception:write
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DecideExceptionRequestInputInput'
    servers:
    - url: https://api.fwozen.com
components:
  schemas:
    GrantExceptionInputInput:
      type: object
      properties:
        repoId:
          type: string
          pattern: ^repo_[1-9A-HJ-NP-Za-km-z]{16}$
        repo:
          type: string
          pattern: ^[^/\s]+\/[^/\s]+$
        prNumber:
          type: integer
          exclusiveMinimum: 0
          maximum: 9007199254740991
        reason:
          type: string
          minLength: 8
          maxLength: 500
        incidentRef:
          type: string
          maxLength: 120
        expiresInMinutes:
          type: integer
          minimum: 5
          maximum: 10080
        policy:
          type: string
          enum:
          - sticky
          - strict
        requestId:
          type: string
          pattern: ^exc_[1-9A-HJ-NP-Za-km-z]{16}$
      required:
      - prNumber
      - reason
    Exception:
      type: object
      properties:
        id:
          type: string
          pattern: ^exc_[1-9A-HJ-NP-Za-km-z]{16}$
        freezeId:
          type: string
          pattern: ^frz_[1-9A-HJ-NP-Za-km-z]{16}$
        freezeIds:
          minItems: 1
          type: array
          items:
            type: string
            pattern: ^frz_[1-9A-HJ-NP-Za-km-z]{16}$
        grantGroupId:
          type: string
        repoId:
          type: string
          pattern: ^repo_[1-9A-HJ-NP-Za-km-z]{16}$
        repoFullName:
          type: string
        prNumber:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
        prTitle:
          anyOf:
          - type: string
          - type: 'null'
        prUrl:
          type: string
          format: uri
        prAuthorLogin:
          anyOf:
          - type: string
          - type: 'null'
        headSha:
          anyOf:
          - type: string
            pattern: ^[0-9a-f]{40}$
          - type: 'null'
        policy:
          type: string
          enum:
          - sticky
          - strict
        state:
          type: string
          enum:
          - pending
          - active
          - expired
          - revoked
          - consumed
          - denied
        reason:
          type: string
        incidentRef:
          anyOf:
          - type: string
          - type: 'null'
        grantedBy:
          $ref: '#/components/schemas/Actor'
        grantedAt:
          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))$
        expiresAt:
          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'
        revokedAt:
          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'
        revokedBy:
          anyOf:
          - $ref: '#/components/schemas/Actor'
          - type: 'null'
        revokeReason:
          anyOf:
          - type: string
          - type: 'null'
      required:
      - id
      - freezeId
      - freezeIds
      - grantGroupId
      - repoId
      - repoFullName
      - prNumber
      - prTitle
      - prUrl
      - prAuthorLogin
      - headSha
      - policy
      - state
      - reason
      - incidentRef
      - grantedBy
      - grantedAt
      - expiresAt
      - revokedAt
      - revokedBy
      - revokeReason
      additionalProperties: false
    RevokeExceptionInputInput:
      type: object
      properties:
        reason:
          type: string
          minLength: 8
          maxLength: 500
    ExceptionRequestPage:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/ExceptionRequest'
        nextCursor:
          anyOf:
          - type: string
          - type: 'null'
      required:
      - data
      - nextCursor
      additionalProperties: false
    Actor:
      type: object
      properties:
        type:
          type: string
          enum:
          - user
          - api_key
          - slack_user
          - scheduler
          - system
          - github_user
        id:
          anyOf:
          - type: string
          - type: 'null'
        displayName:
          type: string
        githubLogin:
          anyOf:
          - type: string
          - type: 'null'
        slackUserId:
          anyOf:
          - type: string
          - type: 'null'
        impersonatorId:
          anyOf:
          - type: string
          - type: 'null'
        apiKeyKind:
          default: null
          anyOf:
          - type: string
            enum:
            - human
            - agent
          - type: 'null'
      required:
      - type
      - id
      - displayName
      - githubLogin
      - slackUserId
      - impersonatorId
      - apiKeyKind
      additionalProperties: false
    ExceptionRequest:
      type: object
      properties:
        id:
          type: string
          pattern: ^exc_[1-9A-HJ-NP-Za-km-z]{16}$
        freezeId:
          type: string
          pattern: ^frz_[1-9A-HJ-NP-Za-km-z]{16}$
        freezeIds:
          minItems: 1
          type: array
          items:
            type: string
            pattern: ^frz_[1-9A-HJ-NP-Za-km-z]{16}$
        grantGroupId:
          type: string
        repoId:
          type: string
          pattern: ^repo_[1-9A-HJ-NP-Za-km-z]{16}$
        repoFullName:
          type: string
        prNumber:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
        prTitle:
          anyOf:
          - type: string
          - type: 'null'
        prUrl:
          type: string
          format: uri
        prAuthorLogin:
          anyOf:
          - type: string
          - type: 'null'
        headSha:
          anyOf:
          - type: string
            pattern: ^[0-9a-f]{40}$
          - type: 'null'
        policy:
          type: string
          enum:
          - sticky
          - strict
        state:
          type: string
          enum:
          - pending
          - active
          - expired
          - revoked
          - consumed
          - denied
        reason:
          type: string
        incidentRef:
          anyOf:
          - type: string
          - type: 'null'
        grantedBy:
          $ref: '#/components/schemas/Actor'
        grantedAt:
          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))$
        expiresAt:
          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'
        revokedAt:
          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'
        revokedBy:
          anyOf:
          - $ref: '#/components/schemas/Actor'
          - type: 'null'
        revokeReason:
          anyOf:
          - type: string
          - type: 'null'
        requestedBy:
          $ref: '#/components/schemas/Actor'
        requestedAt:
          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))$
        decidedBy:
          anyOf:
          - $ref: '#/components/schemas/Actor'
          - type: 'null'
        decidedAt:
          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'
        decisionReason:
          anyOf:
          - type: string
          - type: 'null'
      required:
      - id
      - freezeId
      - freezeIds
      - grantGroupId
      - repoId
      - repoFullName
      - prNumber
      - prTitle
      - prUrl
      - prAuthorLogin
      - headSha
      - policy
      - state
      - reason
      - incidentRef
      - grantedBy
      - grantedAt
      - expiresAt
      - revokedAt
      - revokedBy
      - revokeReason
      - requestedBy
      - requestedAt
      - decidedBy
      - decidedAt
      - decisionReason
      additionalProperties: false
    RequestExceptionInputInput:
      type: object
      properties:
        repoId:
          type: string
          pattern: ^repo_[1-9A-HJ-NP-Za-km-z]{16}$
        repo:
          type: string
          pattern: ^[^/\s]+\/[^/\s]+$
        prNumber:
          type: integer
          exclusiveMinimum: 0
          maximum: 9007199254740991
        reason:
          type: string
          minLength: 8
          maxLength: 500
        incidentRef:
          type: string
          maxLength: 120
        expiresInMinutes:
          type: integer
          minimum: 5
          maximum: 10080
      required:
      - prNumber
      - reason
    ExceptionPage:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/Exception'
        nextCursor:
          anyOf:
          - type: string
          - type: 'null'
      required:
      - data
      - nextCursor
      additionalProperties: false
    DecideExceptionRequestInputInput:
      type: object
      properties:
        decision:
          type: string
          enum:
          - approve
          - deny
        reason:
          type: string
          minLength: 8
          maxLength: 500
        expiresInMinutes:
          type: integer
          minimum: 5
          maximum: 10080
      required:
      - decision
    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
  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)