openapi: 3.2.0
info:
  title: Snapvisor API
  version: 2.0.0
  contact:
    name: Snapvisor Support
    url: https://snapvisor.io
    email: support@snapvisor.io
  termsOfService: https://snapvisor.io/terms
x-gitbook-mcp-url: https://mcp.snapvisor.io
externalDocs:
  description: Snapvisor API reference
  url: https://snapvisor.io/docs/api-reference
servers:
  - url: https://api.snapvisor.io/v2
    description: API Endpoint
tags:
  - name: Authentication
    description: Exchange CI and CLI credentials for a Snapvisor project token. Use
      these endpoints to obtain the bearer token that authenticates every other
      request.
    x-page-icon: key
  - name: Users
    description: Retrieve information about the user authenticated by the current
      personal access token.
    x-page-icon: user
  - name: Projects
    description: Retrieve project metadata, either by slug or for the project tied
      to the current token.
    x-page-icon: folder-open
  - name: Analytics
    description: Retrieve account-level build and screenshot metrics over time.
    x-page-icon: chart-no-axes-combined
  - name: Builds
    description: Create, finalize, update, and inspect visual testing builds,
      including their screenshot diffs. This is the core of the visual testing
      workflow.
    x-page-icon: images
  - name: Reviews
    description: Submit, list, and dismiss reviews to approve or reject the changes
      captured in a build.
    x-page-icon: clipboard-check
  - name: Tests
    description: Inspect a test's flakiness — how often it changed and how
      erratically — list the changes that keep coming back, and ignore the ones
      that are only noise.
    x-page-icon: flask
  - name: Comments
    description: "Collaborate on builds with threaded comments: post and edit
      comments, react with emojis, resolve threads, and manage notification
      subscriptions."
    x-page-icon: comments
  - name: Deployments
    description: Create, finalize, and resolve deployments to publish and serve
      project artifacts.
    x-page-icon: rocket
  - name: Automations
    description: Run actions when a build event matches your conditions — post to
      Slack, Microsoft Teams or Discord when a build completes or is reviewed.
    x-page-icon: workflow
  - name: Media
    description: Upload standalone images and videos, with no build or test run
      behind them, and get back a shareable URL plus ready-to-paste Markdown.
      Built for embedding a screenshot or a screen recording in the pull request
      an agent just opened.
    x-page-icon: image-play
  - name: Members
    description: "Manage who is on a team and what they can reach: list members,
      change their role, remove them, and send or cancel invitations."
    x-page-icon: users
  - name: Free tools
    description: "Free endpoints with no key: compare two images with the same diff
      engine every build uses. Limited per address; see each operation."
    x-page-icon: wrench
security:
  - projectToken: []
paths:
  /accounts/{accountSlug}:
    get:
      operationId: getAccount
      summary: Get an account
      description: Retrieve an account with its plan and current-period usage. Use it
        to watch screenshot consumption against the plan before it runs over.
      tags:
        - Users
      security:
        - personalAccessToken: []
        - oauth2:
            - profile
      parameters:
        - in: path
          name: accountSlug
          schema:
            type: string
            minLength: 1
            description: Slug of the account to retrieve.
          required: true
          description: Slug of the account to retrieve.
      responses:
        "200":
          description: The account with its plan and usage
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AccountDetails"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
    patch:
      operationId: updateAccount
      summary: Update a team's defaults
      description: Change the role given to users that join a team through its invite
        link or a verified email domain. Requires administrator access to the
        team. Use it when a team administrator wants new joiners to start with a
        different role.
      tags:
        - Members
      security:
        - personalAccessToken: []
        - oauth2:
            - account:admin
      parameters:
        - in: path
          name: accountSlug
          schema:
            type: string
            minLength: 1
            description: Slug of the team.
          required: true
          description: Slug of the team.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                defaultUserLevel:
                  $ref: "#/components/schemas/TeamDefaultUserLevel"
              required:
                - defaultUserLevel
      responses:
        "200":
          description: The updated account
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AccountDetails"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /accounts/{accountSlug}/analytics:
    get:
      operationId: getAccountAnalytics
      summary: Get account analytics
      description: Retrieve build and screenshot metrics for an account. The personal
        access token must be scoped to the account. Use it when asked how many
        builds or screenshots an account produced over a period, or how that
        usage is trending.
      tags:
        - Analytics
      security:
        - personalAccessToken: []
        - oauth2:
            - projects:read
      parameters:
        - in: path
          name: accountSlug
          schema:
            type: string
            minLength: 1
            description: Slug of the account to retrieve analytics for.
          required: true
          description: Slug of the account to retrieve analytics for.
        - in: query
          name: from
          schema:
            description: Start of the analytics period. Accepts a full ISO 8601 datetime
              (`2026-09-01T09:30:00Z`) or a date on its own (`2026-09-01`). A
              date on its own starts at 00:00:00.000 UTC on that day.
            type: string
          required: true
          description: Start of the analytics period. Accepts a full ISO 8601 datetime
            (`2026-09-01T09:30:00Z`) or a date on its own (`2026-09-01`). A date
            on its own starts at 00:00:00.000 UTC on that day.
        - in: query
          name: to
          schema:
            description: End of the analytics period, inclusive. Accepts a full ISO 8601
              datetime (`2026-09-01T09:30:00Z`) or a date on its own
              (`2026-09-01`). A date on its own ends at 23:59:59.999 UTC on that
              day. Defaults to the current time.
            type: string
          description: End of the analytics period, inclusive. Accepts a full ISO 8601
            datetime (`2026-09-01T09:30:00Z`) or a date on its own
            (`2026-09-01`). A date on its own ends at 23:59:59.999 UTC on that
            day. Defaults to the current time.
        - in: query
          name: groupBy
          schema:
            type: string
            enum:
              - day
              - week
              - month
            description: Time period used to group each series data point.
          required: true
          description: Time period used to group each series data point.
        - in: query
          name: projectNames
          schema:
            description: Optional project name filter. Pass one value or repeat the
              parameter for multiple projects.
            anyOf:
              - type: string
                minLength: 1
                maxLength: 100
                pattern: ^[a-zA-Z0-9_\-.]+$
              - type: array
                items:
                  type: string
                  minLength: 1
                  maxLength: 100
                  pattern: ^[a-zA-Z0-9_\-.]+$
          description: Optional project name filter. Pass one value or repeat the
            parameter for multiple projects.
      responses:
        "200":
          description: Account analytics
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AccountAnalytics"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /accounts/{accountSlug}/projects:
    get:
      operationId: listProjects
      summary: List an account's projects
      description: >-
        List the projects of an account that are visible to the authenticated
        user, most recently active first. Results are paginated. The token must
        be scoped to the account. Use it to find the project names of an account
        before calling the project, build or test tools.


        Use the `name` field of each project as the `{project}` path parameter
        in project-scoped endpoints like `createBuildForProject` and
        `listBuilds`.
      tags:
        - Projects
      security:
        - personalAccessToken: []
        - oauth2:
            - projects:read
      parameters:
        - in: path
          name: accountSlug
          schema:
            type: string
            minLength: 1
            description: Slug of the account to list projects for.
          required: true
          description: Slug of the account to list projects for.
        - in: query
          name: perPage
          schema:
            description: Number of items per page (max 100)
            type: string
          description: Number of items per page (max 100)
        - in: query
          name: page
          schema:
            description: Page number
            type: string
          description: Page number
      responses:
        "200":
          description: List of projects
          content:
            application/json:
              schema:
                type: object
                properties:
                  pageInfo:
                    $ref: "#/components/schemas/PageInfo"
                  results:
                    type: array
                    items:
                      $ref: "#/components/schemas/Project"
                required:
                  - pageInfo
                  - results
                additionalProperties: false
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /accounts/{accountSlug}/members:
    get:
      operationId: listAccountMembers
      summary: List a team's members
      description: List the members of a team, with their role. Requires administrator
        access to the team. Use it when you need to know who belongs to a team
        or which role each member holds.
      tags:
        - Members
      security:
        - personalAccessToken: []
        - oauth2:
            - account:admin
      parameters:
        - in: path
          name: accountSlug
          schema:
            type: string
            minLength: 1
            description: Slug of the team to list members for.
          required: true
          description: Slug of the team to list members for.
        - in: query
          name: perPage
          schema:
            description: Number of items per page (max 100)
            type: string
          description: Number of items per page (max 100)
        - in: query
          name: page
          schema:
            description: Page number
            type: string
          description: Page number
        - in: query
          name: search
          schema:
            description: Match members on their name, slug, or email address.
            type: string
          description: Match members on their name, slug, or email address.
        - in: query
          name: levels
          schema:
            description: Restrict to the given roles, comma-separated (e.g. `owner,member`).
            type: string
          description: Restrict to the given roles, comma-separated (e.g. `owner,member`).
        - in: query
          name: orderBy
          schema:
            description: Ordering of the results. Defaults to `date`, most recently added
              first.
            type: string
            enum:
              - date
              - name-asc
              - name-desc
          description: Ordering of the results. Defaults to `date`, most recently added
            first.
      responses:
        "200":
          description: List of team members
          content:
            application/json:
              schema:
                type: object
                properties:
                  pageInfo:
                    $ref: "#/components/schemas/PageInfo"
                  results:
                    type: array
                    items:
                      $ref: "#/components/schemas/TeamMember"
                required:
                  - pageInfo
                  - results
                additionalProperties: false
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /accounts/{accountSlug}/members/{userId}:
    patch:
      operationId: setAccountMemberLevel
      summary: Change a member's role
      description: Change the role of an existing team member. Requires administrator
        access to the team. Use it when a team administrator asks to promote or
        demote an existing member.
      tags:
        - Members
      security:
        - personalAccessToken: []
        - oauth2:
            - account:admin
      parameters:
        - in: path
          name: accountSlug
          schema:
            type: string
            minLength: 1
            description: Slug of the team.
          required: true
          description: Slug of the team.
        - in: path
          name: userId
          schema:
            type: string
            description: Identifier of the user to act on — the `user.id` returned by
              `listAccountMembers`, which is the user's account id.
          required: true
          description: Identifier of the user to act on — the `user.id` returned by
            `listAccountMembers`, which is the user's account id.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                level:
                  $ref: "#/components/schemas/TeamUserLevel"
              required:
                - level
      responses:
        "200":
          description: The updated membership
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/TeamMember"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
    delete:
      operationId: removeAccountMember
      summary: Remove a member
      description: Remove a user from a team. Requires administrator access to the
        team. The last member of a team cannot be removed; removing the
        second-to-last one promotes the remaining member to owner. Use it when a
        team administrator explicitly asks to take a user off the team.
      tags:
        - Members
      security:
        - personalAccessToken: []
        - oauth2:
            - account:admin
      parameters:
        - in: path
          name: accountSlug
          schema:
            type: string
            minLength: 1
            description: Slug of the team.
          required: true
          description: Slug of the team.
        - in: path
          name: userId
          schema:
            type: string
            description: Identifier of the user to act on — the `user.id` returned by
              `listAccountMembers`, which is the user's account id.
          required: true
          description: Identifier of the user to act on — the `user.id` returned by
            `listAccountMembers`, which is the user's account id.
      responses:
        "204":
          description: Member removed
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /accounts/{accountSlug}/invites:
    get:
      operationId: listAccountInvites
      summary: List pending invites
      description: List the pending invitations to join a team, most recent first.
        Requires administrator access to the team. Use it to check who has been
        invited to a team but has not joined yet.
      tags:
        - Members
      security:
        - personalAccessToken: []
        - oauth2:
            - account:admin
      parameters:
        - in: path
          name: accountSlug
          schema:
            type: string
            minLength: 1
            description: Slug of the team.
          required: true
          description: Slug of the team.
        - in: query
          name: perPage
          schema:
            description: Number of items per page (max 100)
            type: string
          description: Number of items per page (max 100)
        - in: query
          name: page
          schema:
            description: Page number
            type: string
          description: Page number
        - in: query
          name: search
          schema:
            description: Match invites on their email address.
            type: string
          description: Match invites on their email address.
      responses:
        "200":
          description: List of pending invites
          content:
            application/json:
              schema:
                type: object
                properties:
                  pageInfo:
                    $ref: "#/components/schemas/PageInfo"
                  results:
                    type: array
                    items:
                      $ref: "#/components/schemas/TeamInvite"
                required:
                  - pageInfo
                  - results
                additionalProperties: false
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
    post:
      operationId: createAccountInvites
      summary: Invite members
      description: Invite people by email to join a team as members. Each invited
        address receives an email with a link to join. Re-inviting an address
        that already has a pending invite refreshes it. Requires administrator
        access to the team. Use it when a team administrator asks to invite
        people to the team by email address.
      tags:
        - Members
      security:
        - personalAccessToken: []
        - oauth2:
            - account:admin
      parameters:
        - in: path
          name: accountSlug
          schema:
            type: string
            minLength: 1
            description: Slug of the team.
          required: true
          description: Slug of the team.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                members:
                  minItems: 1
                  maxItems: 100
                  type: array
                  items:
                    type: object
                    properties:
                      email:
                        type: string
                        format: email
                        pattern: ^(?:[A-Za-z0-9_'+\-]+\.)*[A-Za-z0-9_'+\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
                      level:
                        $ref: "#/components/schemas/TeamUserLevel"
                    required:
                      - email
                      - level
                  description: The people to invite.
              required:
                - members
      responses:
        "201":
          description: The invites that were created
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/TeamInvite"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /accounts/{accountSlug}/invites/{inviteId}:
    delete:
      operationId: cancelAccountInvite
      summary: Cancel an invite
      description: Cancel a pending invitation, invalidating its link. Requires
        administrator access to the team. Use it when a pending invitation was
        sent by mistake or should no longer be accepted.
      tags:
        - Members
      security:
        - personalAccessToken: []
        - oauth2:
            - account:admin
      parameters:
        - in: path
          name: accountSlug
          schema:
            type: string
            minLength: 1
            description: Slug of the team.
          required: true
          description: Slug of the team.
        - in: path
          name: inviteId
          schema:
            type: string
            description: Identifier of the invite, as returned when listing them.
          required: true
          description: Identifier of the invite, as returned when listing them.
      responses:
        "204":
          description: Invite cancelled
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /accounts/{accountSlug}/domains:
    get:
      operationId: listTeamDomains
      summary: List a team's email domains
      description: List the email domains a team is open to. Requires administrator
        access to the team. Use it to check which email domains let people join
        a team automatically.
      tags:
        - Members
      security:
        - personalAccessToken: []
        - oauth2:
            - account:admin
      parameters:
        - in: path
          name: accountSlug
          schema:
            type: string
            minLength: 1
            description: Slug of the team.
          required: true
          description: Slug of the team.
      responses:
        "200":
          description: The team's email domains
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/TeamDomain"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
    post:
      operationId: addTeamDomain
      summary: Open a team to an email domain
      description: Add an email domain to a team, so anyone signing up with a verified
        address on it joins automatically. Requires administrator access to the
        team, and you must yourself hold a verified address on the domain — a
        team can only be opened to a domain its administrator demonstrably
        belongs to. Public email providers are refused. Use it when a team
        administrator wants everyone with a company email address to join the
        team automatically.
      tags:
        - Members
      security:
        - personalAccessToken: []
        - oauth2:
            - account:admin
      parameters:
        - in: path
          name: accountSlug
          schema:
            type: string
            minLength: 1
            description: Slug of the team.
          required: true
          description: Slug of the team.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                domain:
                  type: string
                  minLength: 1
                  description: The email domain, e.g. `acme.com`.
              required:
                - domain
      responses:
        "201":
          description: The domain the team is now open to
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/TeamDomain"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /accounts/{accountSlug}/domains/{domain}:
    delete:
      operationId: removeTeamDomain
      summary: Close a team to an email domain
      description: Remove an email domain from a team. New sign-ups on it no longer
        join automatically; members who already joined stay. Requires
        administrator access to the team. Use it when a team should stop
        admitting new sign-ups from an email domain.
      tags:
        - Members
      security:
        - personalAccessToken: []
        - oauth2:
            - account:admin
      parameters:
        - in: path
          name: accountSlug
          schema:
            type: string
            minLength: 1
            description: Slug of the team.
          required: true
          description: Slug of the team.
        - in: path
          name: domain
          schema:
            type: string
            description: The email domain to remove.
          required: true
          description: The email domain to remove.
      responses:
        "204":
          description: Domain removed
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /accounts/{accountSlug}/invite-link/reset:
    post:
      operationId: resetAccountInviteLink
      summary: Reset the invite link
      description: Rotate the team's shared invite link, invalidating the previous
        one. Anyone holding the old link can no longer use it to join. Requires
        administrator access to the team. Use it when the shared invite link has
        leaked or has been shared too widely.
      tags:
        - Members
      security:
        - personalAccessToken: []
        - oauth2:
            - account:admin
      parameters:
        - in: path
          name: accountSlug
          schema:
            type: string
            minLength: 1
            description: Slug of the team.
          required: true
          description: Slug of the team.
      responses:
        "200":
          description: The new invite link
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/InviteLink"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /media:
    post:
      operationId: createMedia
      summary: Create a media upload
      description: >-
        Register a standalone image or video and receive a signed target to
        upload it to.


        Uploading takes three calls:


        1. `POST /media` — declare the file and get back an `upload` target.

        2. `POST` the file to `upload.url` as `multipart/form-data`, appending
        every entry of `upload.fields` **before** the `file` part. When
        `upload.multipart` is set and the file is larger than
        `upload.multipart.partSize`, upload it in parts there instead: the edge
        in front of the API refuses any single request over 100 MB.

        3. `POST /media/{mediaId}/finalize` — confirm the bytes landed.


        When `upload` comes back `null`, Snapvisor already holds this exact file
        and steps 2 and 3 are unnecessary.


        Pass `prNumber` when the pull request already exists, or `branch` when
        it does not. A media uploaded against a branch is **staged**: it has its
        share URL immediately, and the moment a pull request opens for that
        branch Snapvisor attaches it and posts the comment — nothing has to come
        back and connect the two.


        Use it when you have a standalone screenshot or screen recording,
        outside a CI build, to attach to a branch or pull request.
      tags:
        - Media
      security:
        - projectToken: []
        - personalAccessToken: []
        - oauth2:
            - media:write
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  minLength: 1
                  maxLength: 255
                  description: "File name, used for display and as the Markdown alt text. Also the
                    media's identity: uploading the same name on the same pull
                    request adds a version rather than creating a second media."
                  examples:
                    - before.png
                    - checkout-flow.mp4
                state:
                  anyOf:
                    - type: string
                      enum:
                        - before
                        - after
                      description: Which half of a before/after pair this media is, so the two can be
                        shown side by side and compared. Inferred from a file
                        name ending in `-before` or `-after`.
                    - type: "null"
                description:
                  description: Prose shown under the media in the managed pull request comment.
                  anyOf:
                    - type: string
                      maxLength: 2000
                    - type: "null"
                contentType:
                  description: Content type of the media file
                  type: string
                size:
                  type: integer
                  minimum: 1
                  maximum: 9007199254740991
                  description: Size of the file in bytes. Checked against your plan's limit before
                    the upload is signed.
                hash:
                  type: string
                  pattern: ^[A-Fa-f0-9]{64}$
                  description: "SHA-256 of the file contents, hex encoded. Uploading the same file
                    twice is free: Snapvisor recognizes the hash and skips the
                    transfer, and byte-identical bytes do not create a new
                    version."
                visibility:
                  description: "Who can open the media share page. `team` requires a signed-in
                    session with access to the owning account; `public` only
                    requires the share URL. Omit it — the usual case — and the
                    media follows its project's visibility: `public` for a
                    public project, `team` for a private one. `team` requires a
                    paid plan."
                  anyOf:
                    - type: string
                      enum:
                        - team
                        - public
                      description: Who can open the media share page. `team` requires a signed-in
                        session with access to the owning account; `public` only
                        requires the share URL.
                    - type: "null"
                project:
                  description: Project to upload to, as `owner/project`. Required with a personal
                    access token; ignored with a project token, which already
                    identifies its project.
                  examples:
                    - acme/web
                  type:
                    - string
                    - "null"
                prNumber:
                  description: "Pull request this media belongs to. Snapvisor maintains a single
                    comment on it listing every media uploaded, editing it in
                    place rather than posting a new one each time — attaching a
                    media to a pull request and showing it there are the same
                    act, not two. Also part of the media's identity: uploading
                    the same name again on this pull request adds a version."
                  anyOf:
                    - type: integer
                      minimum: 1
                      maximum: 9007199254740991
                    - type: "null"
                branch:
                  anyOf:
                    - type: string
                      minLength: 1
                      maxLength: 255
                      description: "Branch this media belongs to. Upload against a branch when the
                        pull request does not exist yet: the media is staged
                        until one opens for that branch, and Snapvisor publishes
                        it — and posts the comment — on its own at that point.
                        No GitHub connection is needed to name a branch."
                      examples:
                        - feat/checkout
                    - type: "null"
              required:
                - name
                - contentType
                - size
                - hash
      responses:
        "201":
          description: The registered media and where to upload it
          content:
            application/json:
              schema:
                type: object
                properties:
                  media:
                    $ref: "#/components/schemas/Media"
                  upload:
                    anyOf:
                      - $ref: "#/components/schemas/MediaUploadTarget"
                      - type: "null"
                    description: Where to send the bytes, or `null` when Snapvisor already holds
                      this exact file — in which case the media is ready and
                      nothing needs uploading.
                required:
                  - media
                  - upload
                additionalProperties: false
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /media/{mediaId}:
    patch:
      operationId: updateMedia
      summary: Update a staged media
      description: >-
        Change a staged media's name, description or branch.


        Staged media only. A media's name and branch are its identity — what
        decides whether the next upload of that name is a new version or a new
        media, and which pull request will publish it — and once it is published
        that identity is what the pull request comment is built from and what a
        reviewer's comments hang off. Editing it there would rewrite history
        rather than correct a staged media.


        Omitted fields are left alone. `description` and `branch` accept `null`
        to clear them; `name` is required and has no cleared state. Clearing a
        staged media's branch leaves it attached to nothing, so no pull request
        will ever publish it.


        Use it to correct a staged media's name, description or branch before a
        pull request publishes it.
      tags:
        - Media
      security:
        - projectToken: []
        - personalAccessToken: []
        - oauth2:
            - media:write
      parameters:
        - in: path
          name: mediaId
          schema:
            type: string
            description: The media ID
          required: true
          description: The media ID
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  minLength: 1
                  maxLength: 255
                  description: "File name, used for display and as the Markdown alt text. Also the
                    media's identity: uploading the same name on the same pull
                    request adds a version rather than creating a second media."
                  examples:
                    - before.png
                    - checkout-flow.mp4
                description:
                  description: Prose shown under the media in the managed pull request comment.
                  anyOf:
                    - type: string
                      maxLength: 2000
                    - type: "null"
                branch:
                  anyOf:
                    - type: string
                      minLength: 1
                      maxLength: 255
                      description: "Branch this media belongs to. Upload against a branch when the
                        pull request does not exist yet: the media is staged
                        until one opens for that branch, and Snapvisor publishes
                        it — and posts the comment — on its own at that point.
                        No GitHub connection is needed to name a branch."
                      examples:
                        - feat/checkout
                    - type: "null"
      responses:
        "200":
          description: The updated media
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Media"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
    get:
      operationId: getMedia
      summary: Get a media
      description: Retrieve a single media by its ID, including its share URL and
        ready-to-paste Markdown. Use it when you have a media ID and need its
        share URL, Markdown embed or upload state.
      tags:
        - Media
      security:
        - projectToken: []
        - personalAccessToken: []
        - oauth2:
            - media:read
      parameters:
        - in: path
          name: mediaId
          schema:
            type: string
            description: The media ID
          required: true
          description: The media ID
      responses:
        "200":
          description: Media details
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Media"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
    delete:
      operationId: deleteMedia
      summary: Delete a media
      description: Delete a media and the files behind it. Any share link or pull
        request embed pointing at it stops working immediately. Use it when the
        user asks to remove an uploaded image or video permanently.
      tags:
        - Media
      security:
        - projectToken: []
        - personalAccessToken: []
        - oauth2:
            - media:write
      parameters:
        - in: path
          name: mediaId
          schema:
            type: string
            description: The media ID
          required: true
          description: The media ID
      responses:
        "204":
          description: Media deleted
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /media/{mediaId}/versions:
    get:
      operationId: listMediaVersions
      summary: List a media's versions
      description: >-
        List a media's most recent uploaded versions, newest first, up to 100.


        A separate call because it is rarely needed: a media usually has one
        version, and the media itself already carries the newest one flattened
        onto it. Check `versionCount` first — at 1 there is nothing here you do
        not already have.


        Use it when a comment carries a `mediaVersionId` older than the media's
        current version. A pin describes a spot on *those* bytes, so feedback
        written on an earlier upload has to be read against that upload — match
        the id here to get its file.
      tags:
        - Media
      security:
        - projectToken: []
        - personalAccessToken: []
        - oauth2:
            - media:read
      parameters:
        - in: path
          name: mediaId
          schema:
            type: string
            description: The media ID
          required: true
          description: The media ID
      responses:
        "200":
          description: The media's versions, newest first
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/MediaVersion"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /media/{mediaId}/finalize:
    post:
      operationId: finalizeMedia
      summary: Finalize a media upload
      description: "Confirm that a media version's bytes have been uploaded. Snapvisor
        reads the object back to check the file is what it claims to be, records
        an image's dimensions, bills it to the screenshot meter, and updates the
        managed pull request comment. There is no processing step: the media is
        usable the moment this returns. Use it right after uploading the file to
        the target returned by createMedia."
      tags:
        - Media
      security:
        - projectToken: []
        - personalAccessToken: []
        - oauth2:
            - media:write
      parameters:
        - in: path
          name: mediaId
          schema:
            type: string
            description: The media ID
          required: true
          description: The media ID
      responses:
        "200":
          description: The finalized media
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Media"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /media/{mediaId}/comments:
    get:
      operationId: listMediaComments
      summary: List the comments on a media
      description: List the comments on an uploaded media, oldest first. A comment may
        carry an `anchor` pinning it to a point on the image, which is how
        reviewers mark up a screenshot. Use it to read the review discussion on
        an uploaded image or video.
      tags:
        - Comments
      security:
        - personalAccessToken: []
        - oauth2:
            - comments:read
      parameters:
        - in: path
          name: mediaId
          schema:
            type: string
            description: The media ID
            examples:
              - "4821"
          required: true
          description: The media ID
      responses:
        "200":
          description: Comments, oldest first. Replies carry a threadId pointing at their
            root comment.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Comment"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
    post:
      operationId: createMediaComment
      summary: Post a comment (or reply) on a media
      description: Post a comment on an uploaded media. Start a new thread, or reply
        to an existing one with `threadId`. Pass an `anchor` to pin the comment
        to a point on the image — normalized coordinates, so it survives any
        scaling — which is how a reviewer marks up a screenshot. Use it when the
        user wants to leave feedback on an uploaded image or video.
      tags:
        - Comments
      security:
        - personalAccessToken: []
        - oauth2:
            - comments:write
      parameters:
        - in: path
          name: mediaId
          schema:
            type: string
            description: The media ID
            examples:
              - "4821"
          required: true
          description: The media ID
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                body:
                  anyOf:
                    - type: string
                    - type: object
                      propertyNames:
                        type: string
                      additionalProperties: {}
                  description: Comment content. Either Markdown text or the JSON representation of
                    a rich-text document.
                threadId:
                  description: Public ID of the root comment to reply to (e.g. `comment-xf23d`).
                  type: string
                anchor:
                  oneOf:
                    - type: object
                      properties:
                        type:
                          type: string
                          const: point
                        x:
                          type: number
                        y:
                          type: number
                      required:
                        - type
                        - x
                        - y
                    - type: object
                      properties:
                        type:
                          type: string
                          const: lines
                        from:
                          type: integer
                          minimum: -9007199254740991
                          maximum: 9007199254740991
                        to:
                          type: integer
                          minimum: -9007199254740991
                          maximum: 9007199254740991
                      required:
                        - type
                        - from
                        - to
                  description: Where on the referenced screenshot diff the comment points. A point
                    uses normalized (0–1) coordinates; lines is a 1-based
                    inclusive range.
                  type: object
              required:
                - body
      responses:
        "201":
          description: Comment created successfully — returns the comment
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Comment"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /media/{mediaId}/comments/{commentId}:
    get:
      operationId: getMediaComment
      summary: Get a single comment on a media
      description: Retrieve a single comment on a media by its ID. Use it when you
        have a comment ID and need its full content.
      tags:
        - Comments
      security:
        - personalAccessToken: []
        - oauth2:
            - comments:read
      parameters:
        - in: path
          name: mediaId
          schema:
            type: string
            description: The media ID
            examples:
              - "4821"
          required: true
          description: The media ID
        - in: path
          name: commentId
          schema:
            $ref: "#/components/schemas/CommentId"
          required: true
          description: The public ID of the comment (e.g. `comment-xf23d`)
      responses:
        "200":
          description: Comment
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Comment"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
    patch:
      operationId: updateMediaComment
      summary: Update a comment on a media
      description: Update the body of a comment on a media. Only the comment's author
        can edit it. Use it when the author wants to correct or reword their own
        comment.
      tags:
        - Comments
      security:
        - personalAccessToken: []
        - oauth2:
            - comments:write
      parameters:
        - in: path
          name: mediaId
          schema:
            type: string
            description: The media ID
            examples:
              - "4821"
          required: true
          description: The media ID
        - in: path
          name: commentId
          schema:
            $ref: "#/components/schemas/CommentId"
          required: true
          description: The public ID of the comment (e.g. `comment-xf23d`)
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                body:
                  anyOf:
                    - type: string
                    - type: object
                      propertyNames:
                        type: string
                      additionalProperties: {}
                  description: Comment content. Either Markdown text or the JSON representation of
                    a rich-text document.
              required:
                - body
      responses:
        "200":
          description: Comment updated successfully — returns the comment
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Comment"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
    delete:
      operationId: deleteMediaComment
      summary: Delete a comment on a media
      description: Delete a comment on a media. Only the comment's author can delete
        it. Use it when the author asks to remove their own comment.
      tags:
        - Comments
      security:
        - personalAccessToken: []
        - oauth2:
            - comments:write
      parameters:
        - in: path
          name: mediaId
          schema:
            type: string
            description: The media ID
            examples:
              - "4821"
          required: true
          description: The media ID
        - in: path
          name: commentId
          schema:
            $ref: "#/components/schemas/CommentId"
          required: true
          description: The public ID of the comment (e.g. `comment-xf23d`)
      responses:
        "200":
          description: Comment deleted successfully — returns the comment
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Comment"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /media/{mediaId}/comments/{commentId}/reactions:
    post:
      operationId: addMediaCommentReaction
      summary: Add an emoji reaction to a comment on a media
      description: Add an emoji reaction to a comment on a media, on behalf of the
        authenticated user. Use it to acknowledge a comment with an emoji rather
        than a reply.
      tags:
        - Comments
      security:
        - personalAccessToken: []
        - oauth2:
            - comments:write
      parameters:
        - in: path
          name: mediaId
          schema:
            type: string
            description: The media ID
            examples:
              - "4821"
          required: true
          description: The media ID
        - in: path
          name: commentId
          schema:
            $ref: "#/components/schemas/CommentId"
          required: true
          description: The public ID of the comment (e.g. `comment-xf23d`)
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                emoji:
                  type: string
                  description: The emoji to react with.
              required:
                - emoji
      responses:
        "200":
          description: Reaction added — returns the comment
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Comment"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
    delete:
      operationId: removeMediaCommentReaction
      summary: Remove an emoji reaction from a comment on a media
      description: Remove an emoji reaction previously added by the authenticated user
        from a comment on a media. Use it to take back an emoji reaction added
        by mistake.
      tags:
        - Comments
      security:
        - personalAccessToken: []
        - oauth2:
            - comments:write
      parameters:
        - in: path
          name: mediaId
          schema:
            type: string
            description: The media ID
            examples:
              - "4821"
          required: true
          description: The media ID
        - in: path
          name: commentId
          schema:
            $ref: "#/components/schemas/CommentId"
          required: true
          description: The public ID of the comment (e.g. `comment-xf23d`)
        - in: query
          name: emoji
          schema:
            type: string
            description: The emoji reaction to remove.
          required: true
          description: The emoji reaction to remove.
      responses:
        "200":
          description: Reaction removed — returns the comment
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Comment"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /media/{mediaId}/comments/{commentId}/resolve:
    post:
      operationId: resolveMediaCommentThread
      summary: Mark a media comment thread as resolved
      description: Mark a comment thread on a media as resolved. Use it when the
        feedback in a thread has been addressed.
      tags:
        - Comments
      security:
        - personalAccessToken: []
        - oauth2:
            - comments:write
      parameters:
        - in: path
          name: mediaId
          schema:
            type: string
            description: The media ID
            examples:
              - "4821"
          required: true
          description: The media ID
        - in: path
          name: commentId
          schema:
            $ref: "#/components/schemas/ThreadCommentId"
          required: true
          description: Public ID of any comment in the thread (e.g. `comment-xf23d`)
      responses:
        "200":
          description: Thread resolved — returns the root comment
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Comment"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /media/{mediaId}/comments/{commentId}/unresolve:
    post:
      operationId: unresolveMediaCommentThread
      summary: Reopen a resolved media comment thread
      description: Reopen a previously resolved comment thread on a media. Use it when
        a resolved thread needs more discussion.
      tags:
        - Comments
      security:
        - personalAccessToken: []
        - oauth2:
            - comments:write
      parameters:
        - in: path
          name: mediaId
          schema:
            type: string
            description: The media ID
            examples:
              - "4821"
          required: true
          description: The media ID
        - in: path
          name: commentId
          schema:
            $ref: "#/components/schemas/ThreadCommentId"
          required: true
          description: Public ID of any comment in the thread (e.g. `comment-xf23d`)
      responses:
        "200":
          description: Thread reopened — returns the root comment
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Comment"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /media/{mediaId}/comments/{commentId}/subscription:
    post:
      operationId: subscribeMediaCommentThread
      summary: Subscribe to a media comment thread's notifications
      description: Subscribe the authenticated user to a comment thread on a media to
        receive notifications about new replies. Use it when the user wants to
        follow replies to a thread they have not taken part in.
      tags:
        - Comments
      security:
        - personalAccessToken: []
        - oauth2:
            - comments:write
      parameters:
        - in: path
          name: mediaId
          schema:
            type: string
            description: The media ID
            examples:
              - "4821"
          required: true
          description: The media ID
        - in: path
          name: commentId
          schema:
            $ref: "#/components/schemas/ThreadCommentId"
          required: true
          description: Public ID of any comment in the thread (e.g. `comment-xf23d`)
      responses:
        "200":
          description: Subscribed — returns the root comment
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Comment"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
    delete:
      operationId: unsubscribeMediaCommentThread
      summary: Unsubscribe from a media comment thread's notifications
      description: Unsubscribe the authenticated user from a media comment thread's
        notifications. Use it when the user no longer wants notifications for a
        thread.
      tags:
        - Comments
      security:
        - personalAccessToken: []
        - oauth2:
            - comments:write
      parameters:
        - in: path
          name: mediaId
          schema:
            type: string
            description: The media ID
            examples:
              - "4821"
          required: true
          description: The media ID
        - in: path
          name: commentId
          schema:
            $ref: "#/components/schemas/ThreadCommentId"
          required: true
          description: Public ID of any comment in the thread (e.g. `comment-xf23d`)
      responses:
        "200":
          description: Unsubscribed — returns the root comment
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Comment"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /builds:
    post:
      operationId: createBuild
      summary: Create a build
      description: Create a build and receive signed upload targets for its
        screenshots and Playwright traces. The response lists, for every file
        Snapvisor doesn't already have, a secure `postUrl` with `fields` (or a
        legacy `putUrl`) to upload it to. Supports single and parallel builds.
      tags:
        - Builds
      security:
        - projectToken: []
      requestBody:
        content:
          application/json:
            schema:
              anyOf:
                - type: object
                  properties:
                    commit:
                      description: The commit the build is running on
                      $ref: "#/components/schemas/Sha1Hash"
                    branch:
                      description: The branch the build is running on
                      $ref: "#/components/schemas/GitBranch"
                    pwTraceKeys:
                      description: Keys of Playwright trace files
                      type: array
                      items:
                        $ref: "#/components/schemas/Sha256Hash"
                    name:
                      description: The name of the build (for multi-build setups)
                      type:
                        - string
                        - "null"
                    parallel:
                      description: Whether to run the build in parallel
                      type:
                        - boolean
                        - "null"
                    parallelNonce:
                      description: A unique nonce for the parallel build
                      type:
                        - string
                        - "null"
                    prNumber:
                      description: The pull request number
                      anyOf:
                        - type: integer
                          minimum: 1
                          maximum: 9007199254740991
                        - type: "null"
                    prHeadCommit:
                      description: The head commit of the pull request
                      anyOf:
                        - $ref: "#/components/schemas/Sha1Hash"
                        - type: "null"
                    referenceCommit:
                      description: The commit to use as a reference for the build
                      anyOf:
                        - $ref: "#/components/schemas/Sha1Hash"
                        - type: "null"
                    referenceBranch:
                      description: The branch to use as a reference for the build
                      type:
                        - string
                        - "null"
                    parentCommits:
                      description: The parent commits of the build
                      anyOf:
                        - type: array
                          items:
                            $ref: "#/components/schemas/Sha1Hash"
                        - type: "null"
                    mode:
                      description: The mode in which the build is running
                      anyOf:
                        - type: string
                          enum:
                            - ci
                            - monitoring
                        - type: "null"
                    ciProvider:
                      description: The CI provider being used
                      type:
                        - string
                        - "null"
                    argosSdk:
                      description: The version of the Snapvisor SDK being used
                      type:
                        - string
                        - "null"
                    runId:
                      description: The ID of the current run
                      type:
                        - string
                        - "null"
                    runAttempt:
                      description: The attempt number of the current run
                      anyOf:
                        - type: integer
                          minimum: 1
                          maximum: 9007199254740991
                        - type: "null"
                    skipped:
                      description: Whether the build was skipped, not comparing anything and always
                        succeeding
                      type:
                        - boolean
                        - "null"
                    mergeQueue:
                      description: Whether the build has been created in a merge queue
                      type:
                        - boolean
                        - "null"
                    mergeQueuePrNumbers:
                      description: Pull request numbers aggregated by the merge queue build. Requires
                        `mergeQueue` to be `true`.
                      anyOf:
                        - minItems: 1
                          type: array
                          items:
                            type: integer
                            minimum: 1
                            maximum: 9007199254740991
                        - type: "null"
                    subset:
                      description: >-
                        Indicates whether this build contains only a subset of
                        screenshots.

                        This is useful when a build is created from an
                        incomplete test suite where some tests are skipped.
                      type:
                        - boolean
                        - "null"
                    screenshotKeys:
                      type: array
                      items:
                        $ref: "#/components/schemas/Sha256Hash"
                      deprecated: true
                      description: Keys of screenshot files
                    screenshots:
                      not: {}
                  required:
                    - commit
                    - branch
                    - screenshotKeys
                - type: object
                  properties:
                    commit:
                      description: The commit the build is running on
                      $ref: "#/components/schemas/Sha1Hash"
                    branch:
                      description: The branch the build is running on
                      $ref: "#/components/schemas/GitBranch"
                    pwTraceKeys:
                      description: Keys of Playwright trace files
                      type: array
                      items:
                        $ref: "#/components/schemas/Sha256Hash"
                    name:
                      description: The name of the build (for multi-build setups)
                      type:
                        - string
                        - "null"
                    parallel:
                      description: Whether to run the build in parallel
                      type:
                        - boolean
                        - "null"
                    parallelNonce:
                      description: A unique nonce for the parallel build
                      type:
                        - string
                        - "null"
                    prNumber:
                      description: The pull request number
                      anyOf:
                        - type: integer
                          minimum: 1
                          maximum: 9007199254740991
                        - type: "null"
                    prHeadCommit:
                      description: The head commit of the pull request
                      anyOf:
                        - $ref: "#/components/schemas/Sha1Hash"
                        - type: "null"
                    referenceCommit:
                      description: The commit to use as a reference for the build
                      anyOf:
                        - $ref: "#/components/schemas/Sha1Hash"
                        - type: "null"
                    referenceBranch:
                      description: The branch to use as a reference for the build
                      type:
                        - string
                        - "null"
                    parentCommits:
                      description: The parent commits of the build
                      anyOf:
                        - type: array
                          items:
                            $ref: "#/components/schemas/Sha1Hash"
                        - type: "null"
                    mode:
                      description: The mode in which the build is running
                      anyOf:
                        - type: string
                          enum:
                            - ci
                            - monitoring
                        - type: "null"
                    ciProvider:
                      description: The CI provider being used
                      type:
                        - string
                        - "null"
                    argosSdk:
                      description: The version of the Snapvisor SDK being used
                      type:
                        - string
                        - "null"
                    runId:
                      description: The ID of the current run
                      type:
                        - string
                        - "null"
                    runAttempt:
                      description: The attempt number of the current run
                      anyOf:
                        - type: integer
                          minimum: 1
                          maximum: 9007199254740991
                        - type: "null"
                    skipped:
                      description: Whether the build was skipped, not comparing anything and always
                        succeeding
                      type:
                        - boolean
                        - "null"
                    mergeQueue:
                      description: Whether the build has been created in a merge queue
                      type:
                        - boolean
                        - "null"
                    mergeQueuePrNumbers:
                      description: Pull request numbers aggregated by the merge queue build. Requires
                        `mergeQueue` to be `true`.
                      anyOf:
                        - minItems: 1
                          type: array
                          items:
                            type: integer
                            minimum: 1
                            maximum: 9007199254740991
                        - type: "null"
                    subset:
                      description: >-
                        Indicates whether this build contains only a subset of
                        screenshots.

                        This is useful when a build is created from an
                        incomplete test suite where some tests are skipped.
                      type:
                        - boolean
                        - "null"
                    screenshots:
                      maxItems: 5000
                      type: array
                      items:
                        $ref: "#/components/schemas/ScreenshotUploadRequest"
                      description: Screenshot files to upload
                    screenshotKeys:
                      not: {}
                  required:
                    - commit
                    - branch
                    - screenshots
      responses:
        "201":
          description: Result of build creation
          content:
            application/json:
              schema:
                type: object
                properties:
                  build:
                    $ref: "#/components/schemas/Build"
                  screenshots:
                    type: array
                    items:
                      anyOf:
                        - type: object
                          properties:
                            key:
                              type: string
                            putUrl:
                              type: string
                              format: uri
                              deprecated: true
                              description: Deprecated. Use postUrl and fields instead.
                          required:
                            - key
                            - putUrl
                          additionalProperties: false
                        - type: object
                          properties:
                            key:
                              type: string
                            postUrl:
                              type: string
                              format: uri
                            fields:
                              type: object
                              propertyNames:
                                type: string
                              additionalProperties:
                                type: string
                          required:
                            - key
                            - postUrl
                            - fields
                          additionalProperties: false
                  pwTraces:
                    type: array
                    items:
                      anyOf:
                        - type: object
                          properties:
                            key:
                              type: string
                            putUrl:
                              type: string
                              format: uri
                              deprecated: true
                              description: Deprecated. Use postUrl and fields instead.
                          required:
                            - key
                            - putUrl
                          additionalProperties: false
                        - type: object
                          properties:
                            key:
                              type: string
                            postUrl:
                              type: string
                              format: uri
                            fields:
                              type: object
                              propertyNames:
                                type: string
                              additionalProperties:
                                type: string
                          required:
                            - key
                            - postUrl
                            - fields
                          additionalProperties: false
                required:
                  - build
                  - screenshots
                  - pwTraces
                additionalProperties: false
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "409":
          description: Conflict
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
  /tools/image-diff:
    post:
      operationId: diffImagesTool
      summary: Compare two images (free, no key)
      description: "Diffs two screenshots with the engine every Snapvisor build uses
        (odiff, two passes) and answers whether the pair counts as a visual
        change. No account or key; 20 requests a day per address; images up to 5
        MB and 16 million pixels each, nothing stored. Answers JSON, or Markdown
        with `Accept: text/markdown`; errors are RFC 9457 problem details."
      tags:
        - Free tools
      security: []
      requestBody:
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                base:
                  type: string
                  format: binary
                  description: The baseline image (PNG, JPEG or WebP).
                head:
                  type: string
                  format: binary
                  description: The image to check against it.
                threshold:
                  description: Sensitivity from 0 to 1, default 0.5 (lower finds more).
                  type: string
              required:
                - base
                - head
            encoding:
              base:
                contentType: image/*
              head:
                contentType: image/*
      responses:
        "200":
          description: The verdict.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ImageDiffVerdict"
            text/markdown:
              schema:
                type: string
        "400":
          description: Not multipart, or a file or field is missing or extra.
          content:
            application/problem+json:
              schema:
                $ref: "#/components/schemas/Problem"
        "413":
          description: An image is larger than 5 MB.
          content:
            application/problem+json:
              schema:
                $ref: "#/components/schemas/Problem"
        "415":
          description: A file is not an image sharp can decode.
          content:
            application/problem+json:
              schema:
                $ref: "#/components/schemas/Problem"
        "422":
          description: An image is over 16 million pixels, or the threshold is not between
            0 and 1.
          content:
            application/problem+json:
              schema:
                $ref: "#/components/schemas/Problem"
        "429":
          description: More than 20 requests from this address today.
          content:
            application/problem+json:
              schema:
                $ref: "#/components/schemas/Problem"
        "503":
          description: Two diffs are already running; retry after the Retry-After delay.
          content:
            application/problem+json:
              schema:
                $ref: "#/components/schemas/Problem"
  /uploads:
    post:
      operationId: uploadObject
      summary: Upload a file to a proxied upload target
      description: "Receives one file for an upload target returned by `createBuild`
        (`postUrl` + `fields`) or `createMedia` (`upload.url` + `upload.fields`)
        when the object store does not implement S3 presigned POST (e.g.
        Backblaze B2); on other stores the URL points at the store itself and
        this route is not used. Behaves like an S3 POST-object endpoint: send
        the `fields` as form fields, then the file. No bearer token: the signed
        `policy` field is the authorization."
      tags:
        - Builds
      x-internal: true
      security: []
      requestBody:
        content:
          multipart/form-data:
            schema:
              $ref: "#/components/schemas/UploadObjectRequest"
            encoding:
              file:
                contentType: "*/*"
      responses:
        "204":
          description: File stored at the key pinned in the policy. Empty body, like S3
            POST object.
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "409":
          description: Conflict
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "413":
          description: Payload too large
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "429":
          description: The dedicated `/v2/uploads` rate limit was exceeded. The body is
            the rate limiter's one-line message (served as `text/html`), with a
            `Retry-After` header.
          content:
            text/html:
              schema:
                type: string
        "500":
          description: Server error
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      message:
                        type: string
                      code:
                        type:
                          - string
                          - number
                    required:
                      - message
                    additionalProperties: false
                required:
                  - error
                additionalProperties: false
        "503":
          description: Service unavailable
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
  /uploads/multipart:
    post:
      operationId: startMultipartUpload
      summary: Start a multipart upload
      description: "Exchange the `upload.fields` of a proxied `createMedia` target for
        a multipart upload session. Part of the multipart variant of the proxied
        upload, for a file larger than `upload.multipart.partSize` returned by
        `createMedia`: start, send each part, complete. No bearer token: the
        signed policy, then the signed session, is the authorization."
      tags:
        - Media
      x-internal: true
      security: []
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/StartMultipartUploadRequest"
      responses:
        "201":
          description: The multipart upload is open
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/StartMultipartUploadResponse"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "409":
          description: Conflict
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "413":
          description: Payload too large
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "429":
          description: The dedicated `/v2/uploads` rate limit was exceeded. The body is
            the rate limiter's one-line message (served as `text/html`), with a
            `Retry-After` header.
          content:
            text/html:
              schema:
                type: string
        "503":
          description: Service unavailable
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
  /uploads/multipart/parts/{partNumber}:
    put:
      operationId: uploadMultipartPart
      summary: Upload one part of a multipart upload
      description: "Store one part. The body is the part's raw bytes and must be
        exactly `partSize` long, except the last part, which holds the remainder
        (400 when shorter, 413 when longer). Re-sending a part replaces it. Part
        of the multipart variant of the proxied upload, for a file larger than
        `upload.multipart.partSize` returned by `createMedia`: start, send each
        part, complete. No bearer token: the signed policy, then the signed
        session, is the authorization."
      tags:
        - Media
      x-internal: true
      security: []
      parameters:
        - in: path
          name: partNumber
          schema:
            type: string
            description: 1-based part number, from 1 to `partCount`.
          required: true
          description: 1-based part number, from 1 to `partCount`.
        - in: header
          name: x-upload-session
          schema:
            type: string
            minLength: 1
            maxLength: 4096
            description: The signed `session` token returned when the multipart upload was
              started.
          required: true
          description: The signed `session` token returned when the multipart upload was
            started.
      requestBody:
        content:
          application/octet-stream:
            schema:
              type: string
              format: binary
              contentEncoding: binary
      responses:
        "200":
          description: The part is stored
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/UploadedMultipartPartOutput"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "413":
          description: Payload too large
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "429":
          description: The dedicated `/v2/uploads` rate limit was exceeded. The body is
            the rate limiter's one-line message (served as `text/html`), with a
            `Retry-After` header.
          content:
            text/html:
              schema:
                type: string
  /uploads/multipart/complete:
    post:
      operationId: completeMultipartUpload
      summary: Complete a multipart upload
      description: "Assemble every uploaded part into the object. Finalize the media
        afterwards, exactly as after a single upload. Part of the multipart
        variant of the proxied upload, for a file larger than
        `upload.multipart.partSize` returned by `createMedia`: start, send each
        part, complete. No bearer token: the signed policy, then the signed
        session, is the authorization."
      tags:
        - Media
      x-internal: true
      security: []
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CompleteMultipartUploadRequest"
      responses:
        "204":
          description: The object is stored
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "429":
          description: The dedicated `/v2/uploads` rate limit was exceeded. The body is
            the rate limiter's one-line message (served as `text/html`), with a
            `Retry-After` header.
          content:
            text/html:
              schema:
                type: string
  /uploads/multipart/abort:
    post:
      operationId: abortMultipartUpload
      summary: Abort a multipart upload
      description: "Discard an unfinished multipart upload and every part stored for
        it. Aborting an upload that no longer exists succeeds. Part of the
        multipart variant of the proxied upload, for a file larger than
        `upload.multipart.partSize` returned by `createMedia`: start, send each
        part, complete. No bearer token: the signed policy, then the signed
        session, is the authorization."
      tags:
        - Media
      x-internal: true
      security: []
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/AbortMultipartUploadRequest"
      responses:
        "204":
          description: The upload is discarded
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "429":
          description: The dedicated `/v2/uploads` rate limit was exceeded. The body is
            the rate limiter's one-line message (served as `text/html`), with a
            `Retry-After` header.
          content:
            text/html:
              schema:
                type: string
  /deployments:
    post:
      operationId: createDeployment
      summary: Create a deployment
      description: Create a deployment and receive signed upload URLs for the files
        Snapvisor doesn't already store. Files already present (matched by
        content hash) are reused and omitted from `uploadFiles`. The environment
        is inferred from the branch when omitted.
      tags:
        - Deployments
      security:
        - projectToken: []
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                commit:
                  description: The commit SHA
                  $ref: "#/components/schemas/Sha1Hash"
                branch:
                  description: The branch name
                  $ref: "#/components/schemas/GitBranch"
                prNumber:
                  description: The pull request number
                  anyOf:
                    - type: integer
                      minimum: 1
                      maximum: 9007199254740991
                    - type: "null"
                environment:
                  description: "The deployment environment. When omitted, it is inferred from
                    `branch`: branches matching the configured production-branch
                    glob are treated as `production`; all others default to
                    `preview`. A tokenless GitHub Actions credential cannot
                    choose: it is deployed to `production` only from the
                    production branch of the repository itself (never from a
                    fork), and asking for `production` from anywhere else is
                    refused with 403."
                  type: string
                  enum:
                    - preview
                    - production
                files:
                  minItems: 1
                  type: array
                  items:
                    type: object
                    properties:
                      path:
                        type: string
                        minLength: 1
                      hash:
                        $ref: "#/components/schemas/Sha256Hash"
                      size:
                        type: integer
                        exclusiveMinimum: 0
                        maximum: 9007199254740991
                      contentType:
                        type: string
                        minLength: 1
                    required:
                      - path
                      - hash
                      - size
                      - contentType
                  description: List of files to deploy
              required:
                - commit
                - branch
                - files
      responses:
        "201":
          description: Deployment created
          content:
            application/json:
              schema:
                type: object
                properties:
                  deploymentId:
                    type: string
                  uploadFiles:
                    type: array
                    items:
                      type: object
                      properties:
                        path:
                          type: string
                        hash:
                          type: string
                        uploadUrl:
                          type: string
                          format: uri
                      required:
                        - path
                        - hash
                        - uploadUrl
                      additionalProperties: false
                required:
                  - deploymentId
                  - uploadFiles
                additionalProperties: false
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
  /deployments/{deploymentId}:
    get:
      operationId: getDeployment
      summary: Get a deployment
      description: Retrieve a single deployment by its ID.
      tags:
        - Deployments
      security:
        - projectToken: []
      parameters:
        - in: path
          name: deploymentId
          schema:
            type: string
            description: The deployment ID
          required: true
          description: The deployment ID
      responses:
        "200":
          description: Deployment details
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: string
                  status:
                    type: string
                    enum:
                      - pending
                      - ready
                      - error
                  environment:
                    type: string
                    enum:
                      - preview
                      - production
                  branch:
                    $ref: "#/components/schemas/GitBranch"
                  commitSha:
                    $ref: "#/components/schemas/Sha256Hash"
                  url:
                    type: string
                    format: uri
                  createdAt:
                    type: string
                required:
                  - id
                  - status
                  - environment
                  - branch
                  - commitSha
                  - url
                  - createdAt
                additionalProperties: false
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
  /deployments/{deploymentId}/finalize:
    post:
      operationId: finalizeDeployment
      summary: Finalize a deployment
      description: Mark a deployment as ready once all of its files have been
        uploaded. Snapvisor assigns the deployment's aliases and starts serving
        it.
      tags:
        - Deployments
      security:
        - projectToken: []
      parameters:
        - in: path
          name: deploymentId
          schema:
            type: string
            description: The deployment ID
          required: true
          description: The deployment ID
      responses:
        "200":
          description: Deployment finalized
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: string
                  status:
                    type: string
                    enum:
                      - pending
                      - ready
                      - error
                  environment:
                    type: string
                    enum:
                      - preview
                      - production
                  branch:
                    $ref: "#/components/schemas/GitBranch"
                  commitSha:
                    $ref: "#/components/schemas/Sha256Hash"
                  url:
                    type: string
                    format: uri
                  createdAt:
                    type: string
                required:
                  - id
                  - status
                  - environment
                  - branch
                  - commitSha
                  - url
                  - createdAt
                additionalProperties: false
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
  /deployments/resolve/{domain}:
    get:
      operationId: resolveDeploymentDomain
      summary: Resolve a deployment domain
      description: Resolve a deployment domain or URL to the deployment it currently
        serves. This endpoint is public and does not require authentication.
      tags:
        - Deployments
      security: []
      parameters:
        - in: path
          name: domain
          schema:
            type: string
            description: A deployment domain or URL
          required: true
          description: A deployment domain or URL
      responses:
        "200":
          description: Deployment domain resolved
          content:
            application/json:
              schema:
                type: object
                properties:
                  deploymentId:
                    type: string
                  projectId:
                    type: string
                  environment:
                    type: string
                    enum:
                      - preview
                      - production
                  visibility:
                    type: string
                    enum:
                      - private
                      - public
                required:
                  - deploymentId
                  - projectId
                  - environment
                  - visibility
                additionalProperties: false
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
  /builds/finalize:
    post:
      operationId: finalizeBuilds
      summary: Finalize parallel builds
      description: Mark every parallel shard sharing the given `parallelNonce` as
        complete. Once finalized, Snapvisor compares the aggregated screenshots
        and starts processing the build.
      tags:
        - Builds
      security:
        - projectToken: []
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                parallelNonce:
                  type: string
                  minLength: 1
              required:
                - parallelNonce
      responses:
        "200":
          description: Result of build finalization
          content:
            application/json:
              schema:
                type: object
                properties:
                  builds:
                    type: array
                    items:
                      $ref: "#/components/schemas/Build"
                required:
                  - builds
                additionalProperties: false
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "409":
          description: Conflict
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
  /baseline:
    post:
      operationId: findBaseline
      summary: Find an eligible baseline from a list of commits
      description: "Find the build eligible to be used as a baseline among a list of
        commits. Useful when no Git provider is connected: the CLI can send the
        candidate ancestor commits and let Snapvisor pick the closest one that
        has an eligible (complete, valid, approved and not rejected) baseline
        build."
      tags:
        - Builds
      security:
        - projectToken: []
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                commits:
                  minItems: 1
                  type: array
                  items:
                    $ref: "#/components/schemas/Sha1Hash"
                  description: The commits to look for an eligible baseline, ordered from the
                    closest to the furthest ancestor. The first commit with an
                    eligible baseline wins.
                name:
                  default: default
                  description: The name of the build to find a baseline for.
                  type: string
                  minLength: 1
                mode:
                  default: ci
                  description: The mode of the build to find a baseline for.
                  type: string
                  enum:
                    - ci
                    - monitoring
              required:
                - commits
      responses:
        "200":
          description: The eligible baseline build, or null when none is found
          content:
            application/json:
              schema:
                type: object
                properties:
                  baseline:
                    anyOf:
                      - $ref: "#/components/schemas/Build"
                      - type: "null"
                    description: The eligible baseline build found among the commits, or null when
                      none is found.
                required:
                  - baseline
                additionalProperties: false
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
  /auth/cli/token:
    post:
      operationId: exchangeCliToken
      summary: Exchange a CLI authorization code for a token
      tags:
        - Authentication
      x-internal: true
      security: []
      description: Called by the CLI to exchange a PKCE authorization code for an API token.
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                code:
                  type: string
                  description: PKCE authorization code from the login flow
                code_verifier:
                  type: string
                  description: PKCE code verifier matching the code challenge
              required:
                - code
                - code_verifier
      responses:
        "200":
          description: Token exchange successful
          content:
            application/json:
              schema:
                type: object
                properties:
                  token:
                    type: string
                    description: Snapvisor API token for CLI use
                required:
                  - token
                additionalProperties: false
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
  /auth/github-actions/oidc/exchange:
    post:
      operationId: exchangeGitHubActionsOidcToken
      summary: Exchange a GitHub Actions OIDC token for a Snapvisor token
      tags:
        - Authentication
      x-internal: true
      description: Called by GitHub Actions to exchange an OIDC token for a
        short-lived Snapvisor project token.
      security: []
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                oidcToken:
                  type: string
                  minLength: 1
                  description: GitHub Actions OIDC token
                repository:
                  description: GitHub repository in owner/name format
                  type: string
                  pattern: ^[^/]+\/[^/]+$
                commit:
                  description: Expected commit SHA
                  $ref: "#/components/schemas/Sha1Hash"
              required:
                - oidcToken
      responses:
        "200":
          description: Token exchange successful
          content:
            application/json:
              schema:
                type: object
                properties:
                  token:
                    type: string
                    description: Short-lived Snapvisor project token
                  expiresAt:
                    type: string
                    description: Token expiration date as an ISO string
                required:
                  - token
                  - expiresAt
                additionalProperties: false
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
  /auth/github-actions/tokenless/exchange:
    post:
      operationId: exchangeGitHubActionsTokenlessToken
      summary: Exchange a tokenless GitHub Actions token for a Snapvisor token
      tags:
        - Authentication
      x-internal: true
      description: Called by GitHub Actions to exchange a tokenless bearer token for a
        short-lived Snapvisor project token. The provided commit and branch must
        match the GitHub workflow run.
      security: []
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                tokenlessToken:
                  type: string
                  minLength: 1
                  description: Snapvisor tokenless GitHub Actions bearer token
                commit:
                  description: Expected commit SHA
                  $ref: "#/components/schemas/Sha1Hash"
                branch:
                  type: string
                  minLength: 1
                  description: Expected branch name
              required:
                - tokenlessToken
                - commit
                - branch
      responses:
        "200":
          description: Token exchange successful
          content:
            application/json:
              schema:
                type: object
                properties:
                  token:
                    type: string
                    description: Short-lived Snapvisor project token
                  expiresAt:
                    type: string
                    description: Token expiration date as an ISO string
                required:
                  - token
                  - expiresAt
                additionalProperties: false
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "503":
          description: Service unavailable
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
  /me:
    get:
      operationId: getMe
      summary: Get the current user
      description: >-
        Retrieve the user associated with the token used to authenticate the
        request, along with their accessible accounts (organizations) and GitHub
        linkage. Use it first in a conversation to learn which accounts, and so
        which owner slugs, this connection can reach.


        **Start here.** Call `getMe` first to discover which accounts (the
        `slug` field) the token can act on — `slug` is the `{owner}` path
        parameter used by every project-scoped endpoint. Then call
        `listProjects` with that owner to find the projects you can work with.
      tags:
        - Users
      security:
        - personalAccessToken: []
        - oauth2:
            - profile
      responses:
        "200":
          description: Authenticated user, accounts, and GitHub linkage
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Me"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /me/deletion-request:
    post:
      operationId: requestAccountDeletion
      summary: Request deletion of your account
      description: Email a confirmation link for deleting the authenticated user's
        personal account. Nothing is deleted until the person opens the link and
        confirms in the web app, so this call is safe to retry. A personal
        access token or the Snapvisor iOS app's own OAuth session may call it;
        other OAuth clients are refused.
      tags:
        - Users
      security:
        - personalAccessToken: []
        - oauth2:
            - profile
      x-mcp:
        enabled: false
      responses:
        "200":
          description: The confirmation email was sent
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AccountDeletionRequest"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
  /accounts/{accountSlug}/app-store-purchase:
    post:
      operationId: startAppStorePurchase
      summary: Check that a team can buy Pro in the iOS app
      description: Before the iOS app offers an in-app purchase, check that the team
        can take it and get the RevenueCat app user id to buy under. The caller
        must administer the team. Refused with 409 when the team already has a
        live subscription (a team has exactly one billing source), and with 503
        while in-app purchase is not switched on or its RevenueCat key is not
        configured. Writes nothing, so it is safe to repeat. A personal access
        token or the Snapvisor iOS app's own OAuth session may call it; other
        OAuth clients are refused.
      tags:
        - Users
      security:
        - personalAccessToken: []
        - oauth2:
            - profile
      x-mcp:
        enabled: false
      parameters:
        - in: path
          name: accountSlug
          schema:
            type: string
            minLength: 1
            description: Slug of the team that would be upgraded.
          required: true
          description: Slug of the team that would be upgraded.
      responses:
        "200":
          description: The team can buy through the iOS app
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AppStorePurchase"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "409":
          description: Conflict
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "503":
          description: Service unavailable
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
  /me/devices:
    post:
      operationId: registerDevice
      summary: Register a push device
      description: "Register the Snapvisor iOS app's APNs device token for the
        authenticated user, so builds that need their review reach the phone.
        Safe to repeat: the same token registered again moves to the caller and
        refreshes its environment. A personal access token or the Snapvisor iOS
        app's own OAuth session may call it; other OAuth clients are refused."
      tags:
        - Users
      security:
        - personalAccessToken: []
        - oauth2:
            - profile
      x-mcp:
        enabled: false
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                token:
                  description: The APNs device token, as hexadecimal.
                  type: string
                  pattern: ^[0-9a-fA-F]{64,200}$
                environment:
                  type: string
                  enum:
                    - sandbox
                    - production
                  description: "The APNs environment the token was issued for. A build signed with
                    a development profile (run from Xcode) gets `sandbox`
                    tokens; TestFlight and App Store builds get `production`
                    tokens. Send what the app's `aps-environment` entitlement
                    says: a token sent to the wrong environment is refused by
                    APNs and the device is removed."
                bundleId:
                  type: string
                  minLength: 1
                  maxLength: 255
                  description: The app's bundle identifier, which must be the one this server
                    sends pushes for.
              required:
                - token
                - environment
                - bundleId
      responses:
        "200":
          description: The device is registered
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Device"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
  /me/devices/{token}:
    delete:
      operationId: unregisterDevice
      summary: Unregister a push device
      description: Stop sending pushes to an APNs device token registered by the
        authenticated user, as when they sign out of the iOS app. Removing a
        token that is not registered, or that belongs to someone else, changes
        nothing and still succeeds. A personal access token or the Snapvisor iOS
        app's own OAuth session may call it; other OAuth clients are refused.
      tags:
        - Users
      security:
        - personalAccessToken: []
        - oauth2:
            - profile
      x-mcp:
        enabled: false
      parameters:
        - in: path
          name: token
          schema:
            description: The APNs device token, as hexadecimal.
            type: string
            pattern: ^[0-9a-fA-F]{64,200}$
          required: true
          description: The APNs device token, as hexadecimal.
      responses:
        "204":
          description: The device no longer receives pushes
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
  /project:
    get:
      operationId: getAuthProject
      summary: Get the current project
      description: Retrieve the project associated with the project token used to
        authenticate the request.
      tags:
        - Projects
      security:
        - projectToken: []
      responses:
        "200":
          description: Project
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Project"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
  /builds/{buildId}:
    put:
      operationId: updateBuild
      summary: Update a build
      description: Add screenshots to an existing build and update its metadata. Used
        to push the screenshots of a parallel shard, identified by
        `parallelIndex` and `parallelTotal`.
      tags:
        - Builds
      security:
        - projectToken: []
      parameters:
        - in: path
          name: buildId
          schema:
            $ref: "#/components/schemas/BuildId"
          required: true
          description: A unique identifier for the build
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                screenshots:
                  type: array
                  items:
                    $ref: "#/components/schemas/ScreenshotInput"
                parallel:
                  type:
                    - boolean
                    - "null"
                parallelTotal:
                  anyOf:
                    - type: integer
                      minimum: -1
                      maximum: 9007199254740991
                    - type: "null"
                parallelIndex:
                  anyOf:
                    - type: integer
                      minimum: 1
                      maximum: 9007199254740991
                    - type: "null"
                final:
                  description: Only used for non-parallel builds. Indicates that this is the last
                    request of the build, so Snapvisor can finalize it. A build
                    whose screenshots are too large to fit in a single request
                    can split them across several sequential requests, leaving
                    `final` falsy on every request but the last. Defaults to
                    `true`.
                  type:
                    - boolean
                    - "null"
                metadata:
                  $ref: "#/components/schemas/BuildMetadata"
              required:
                - screenshots
      responses:
        "200":
          description: Result of build update
          content:
            application/json:
              schema:
                type: object
                properties:
                  build:
                    $ref: "#/components/schemas/Build"
                required:
                  - build
                additionalProperties: false
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "409":
          description: Conflict
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
  /projects:
    post:
      operationId: createProject
      summary: Create a project
      description: Create a new project in an account you administer. The
        authenticated personal access token must be scoped to the target
        account, and the acting user must be an administrator of it. Use it when
        the user wants to start visual testing for a new app or repository.
      tags:
        - Projects
      security:
        - personalAccessToken: []
        - oauth2:
            - projects:write
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  minLength: 1
                  maxLength: 100
                  pattern: ^[a-zA-Z0-9_\-.]+$
                  description: Name of the project to create. Must be unique within the account
                    (case-insensitive) and cannot be a reserved name.
                accountSlug:
                  type: string
                  minLength: 1
                  description: Slug of the account (personal or team) that will own the project.
                    The personal access token must be scoped to this account and
                    the acting user must be one of its administrators.
              required:
                - name
                - accountSlug
      responses:
        "201":
          description: Project created successfully — returns the project
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Project"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /projects/{owner}/{project}:
    get:
      operationId: getProject
      summary: Get a project
      description: Retrieve a project by its owner (account slug) and project name.
        Use it when you need a project's details or settings, for example before
        changing them. Returns the project's settings including default base
        branch and auto-approve globs — useful for understanding how baselines
        are selected.
      tags:
        - Projects
      security:
        - projectToken: []
        - personalAccessToken: []
        - oauth2:
            - projects:read
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
      responses:
        "200":
          description: Project
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Project"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
    patch:
      operationId: updateProject
      summary: Update a project
      description: Update a project's settings. Only the fields present in the request
        are changed. Requires administrator access to the project. Use it when a
        project administrator asks to change a project's settings.
      tags:
        - Projects
      security:
        - personalAccessToken: []
        - oauth2:
            - projects:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  minLength: 1
                  description: New name for the project. Must be unique within the owning account
                    (case-insensitive).
                defaultBaseBranch:
                  description: Branch used as the baseline when no better one applies. `null`
                    falls back to the repository's default branch.
                  type:
                    - string
                    - "null"
                autoApprovedBranchGlob:
                  description: Glob matching the branches whose builds are approved automatically.
                    `null` falls back to the default base branch.
                  type:
                    - string
                    - "null"
                deploymentProductionBranchGlob:
                  description: Glob matching the branches whose deployments count as production.
                    `null` falls back to the repository's default branch.
                  type:
                    - string
                    - "null"
                private:
                  description: Force the project's privacy. `null` inherits it from the linked
                    repository.
                  type:
                    - boolean
                    - "null"
                summaryCheck:
                  $ref: "#/components/schemas/SummaryCheck"
                defaultUserLevel:
                  anyOf:
                    - $ref: "#/components/schemas/ProjectUserLevel"
                    - type: "null"
                  description: Access given to team members that are not contributors on this
                    project. `null` gives them none.
                ignoreConfig:
                  $ref: "#/components/schemas/IgnoreConfig"
                deploymentEnabled:
                  type: boolean
                deploymentAuth:
                  $ref: "#/components/schemas/DeploymentAuth"
                githubActionsOidcEnabled:
                  type: boolean
                tokenlessAuthEnabled:
                  type: boolean
      responses:
        "200":
          description: The updated project
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Project"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /projects/{owner}/{project}/automation-rules:
    get:
      operationId: listAutomationRules
      summary: List a project's automation rules
      description: List the automation rules of a project, most recent first. Requires
        administrator access to the project. Use it to see which actions, such
        as Slack messages, a project runs automatically on build events.
      tags:
        - Automations
      security:
        - personalAccessToken: []
        - oauth2:
            - projects:read
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: query
          name: perPage
          schema:
            description: Number of items per page (max 100)
            type: string
          description: Number of items per page (max 100)
        - in: query
          name: page
          schema:
            description: Page number
            type: string
          description: Page number
        - in: query
          name: active
          schema:
            description: Restrict to rules that still fire (`true`) or to deactivated ones
              (`false`). Omit for both.
            type: string
            enum:
              - "true"
              - "false"
          description: Restrict to rules that still fire (`true`) or to deactivated ones
            (`false`). Omit for both.
      responses:
        "200":
          description: List of automation rules
          content:
            application/json:
              schema:
                type: object
                properties:
                  pageInfo:
                    $ref: "#/components/schemas/PageInfo"
                  results:
                    type: array
                    items:
                      $ref: "#/components/schemas/AutomationRule"
                required:
                  - pageInfo
                  - results
                additionalProperties: false
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
    post:
      operationId: createAutomationRule
      summary: Create an automation rule
      description: Create an automation rule on a project. Requires administrator
        access to the project. Action targets must belong to the project's
        account. Use it when the user wants a project to react automatically to
        build events, for example by posting to Slack.
      tags:
        - Automations
      security:
        - personalAccessToken: []
        - oauth2:
            - projects:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  minLength: 3
                  maxLength: 100
                events:
                  minItems: 1
                  type: array
                  items:
                    $ref: "#/components/schemas/AutomationEvent"
                conditions:
                  default: []
                  type: array
                  items:
                    $ref: "#/components/schemas/AutomationCondition"
                actions:
                  minItems: 1
                  type: array
                  items:
                    $ref: "#/components/schemas/AutomationActionInput"
              required:
                - name
                - events
                - actions
      responses:
        "201":
          description: The created rule
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AutomationRule"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /projects/{owner}/{project}/automation-rules/{ruleId}:
    get:
      operationId: getAutomationRule
      summary: Get an automation rule
      description: Retrieve a single automation rule. Requires administrator access to
        the project. Use it when you need the full definition of one rule, for
        example before changing it.
      tags:
        - Automations
      security:
        - personalAccessToken: []
        - oauth2:
            - projects:read
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: ruleId
          schema:
            type: string
            description: Identifier of the automation rule.
          required: true
          description: Identifier of the automation rule.
      responses:
        "200":
          description: The automation rule
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AutomationRule"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
    put:
      operationId: updateAutomationRule
      summary: Update an automation rule
      description: Replace an automation rule's definition. Requires administrator
        access to the project. The whole definition is replaced, so send the
        events, conditions and actions you want the rule to end up with. Use it
        when an existing rule should fire on different events, conditions or
        actions.
      tags:
        - Automations
      security:
        - personalAccessToken: []
        - oauth2:
            - projects:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: ruleId
          schema:
            type: string
            description: Identifier of the automation rule.
          required: true
          description: Identifier of the automation rule.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  minLength: 3
                  maxLength: 100
                events:
                  minItems: 1
                  type: array
                  items:
                    $ref: "#/components/schemas/AutomationEvent"
                conditions:
                  default: []
                  type: array
                  items:
                    $ref: "#/components/schemas/AutomationCondition"
                actions:
                  minItems: 1
                  type: array
                  items:
                    $ref: "#/components/schemas/AutomationActionInput"
              required:
                - name
                - events
                - actions
      responses:
        "200":
          description: The updated rule
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AutomationRule"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /projects/{owner}/{project}/automation-rules/{ruleId}/deactivate:
    post:
      operationId: deactivateAutomationRule
      summary: Deactivate an automation rule
      description: Stop a rule from firing. Rules are never deleted — a deactivated
        one keeps its run history, which is what tells you why something fired.
        Requires administrator access to the project. Use it when a rule should
        stop firing but its history should be kept.
      tags:
        - Automations
      security:
        - personalAccessToken: []
        - oauth2:
            - projects:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: ruleId
          schema:
            type: string
            description: Identifier of the automation rule.
          required: true
          description: Identifier of the automation rule.
      responses:
        "200":
          description: The deactivated rule
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AutomationRule"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /projects/{owner}/{project}/contributors:
    get:
      operationId: listProjectContributors
      summary: List a project's contributors
      description: List the users explicitly granted access to a project, with their
        level. Team owners and members are not listed — they reach every project
        through their team role. The authenticated user comes first when they
        are one of them. Use it to check who, beyond the team's owners and
        members, can access a project.
      tags:
        - Projects
      security:
        - personalAccessToken: []
        - oauth2:
            - projects:read
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: query
          name: perPage
          schema:
            description: Number of items per page (max 100)
            type: string
          description: Number of items per page (max 100)
        - in: query
          name: page
          schema:
            description: Page number
            type: string
          description: Page number
      responses:
        "200":
          description: List of contributors
          content:
            application/json:
              schema:
                type: object
                properties:
                  pageInfo:
                    $ref: "#/components/schemas/PageInfo"
                  results:
                    type: array
                    items:
                      $ref: "#/components/schemas/ProjectContributor"
                required:
                  - pageInfo
                  - results
                additionalProperties: false
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /projects/{owner}/{project}/contributors/{userId}:
    put:
      operationId: setProjectContributor
      summary: Grant a contributor access to a project
      description: "Grant a user access to a project, or change the level they already
        hold. Requires administrator access to the project. Only meaningful for
        team contributors: owners and members already reach every project. Use
        it when a project administrator asks to give someone access to a single
        project, or to change that access."
      tags:
        - Projects
      security:
        - personalAccessToken: []
        - oauth2:
            - projects:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: userId
          schema:
            type: string
            description: Identifier of the user — the `user.id` returned by
              `listAccountMembers` or `listProjectContributors`.
          required: true
          description: Identifier of the user — the `user.id` returned by
            `listAccountMembers` or `listProjectContributors`.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                level:
                  $ref: "#/components/schemas/ProjectUserLevel"
              required:
                - level
      responses:
        "200":
          description: The granted access
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProjectContributor"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
    delete:
      operationId: removeProjectContributor
      summary: Revoke a contributor's access
      description: Revoke a user's access to a project. Requires administrator access
        to the project, except when removing yourself — a contributor can always
        walk away from a project. Use it when someone should lose access to a
        project, or wants to leave it.
      tags:
        - Projects
      security:
        - personalAccessToken: []
        - oauth2:
            - projects:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: userId
          schema:
            type: string
            description: Identifier of the user — the `user.id` returned by
              `listAccountMembers` or `listProjectContributors`.
          required: true
          description: Identifier of the user — the `user.id` returned by
            `listAccountMembers` or `listProjectContributors`.
      responses:
        "204":
          description: Access revoked
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /projects/{owner}/{project}/transfer:
    post:
      operationId: transferProject
      summary: Transfer a project
      description: Move a project to another account, optionally renaming it. The
        token must be scoped to both accounts, and the acting user must
        administer the project as well as the account receiving it. Use it when
        a project should move to another team or personal account.
      tags:
        - Projects
      security:
        - personalAccessToken: []
        - oauth2:
            - projects:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                targetAccountSlug:
                  type: string
                  minLength: 1
                  description: Slug of the account that will own the project.
                name:
                  description: Name to give the project on the target account. Defaults to its
                    current name, which must be free there.
                  type: string
                  minLength: 1
              required:
                - targetAccountSlug
      responses:
        "200":
          description: The transferred project
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Project"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /projects/{owner}/{project}/media:
    get:
      operationId: listMedia
      summary: List a project's media
      description: >-
        List the standalone images and videos uploaded to a project, most recent
        first.


        `branch` and `prNumber` are what this is usually for: everything
        uploaded for the work in hand, whether or not a pull request exists yet.
        `branch` covers both — a media keeps its branch after publishing — so it
        stays a single query across the moment the pull request opens.


        Use it to find everything uploaded for a branch or pull request.
      tags:
        - Media
      security:
        - projectToken: []
        - personalAccessToken: []
        - oauth2:
            - media:read
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: query
          name: perPage
          schema:
            description: Number of items per page (max 100)
            type: string
          description: Number of items per page (max 100)
        - in: query
          name: page
          schema:
            description: Page number
            type: string
          description: Page number
        - in: query
          name: branch
          schema:
            description: Only media uploaded for this branch, staged and published alike.
            examples:
              - feat/checkout
            type: string
            minLength: 1
          description: Only media uploaded for this branch, staged and published alike.
        - in: query
          name: prNumber
          schema:
            description: Only media published to this pull request.
            type: integer
            minimum: 1
            maximum: 9007199254740991
          description: Only media published to this pull request.
        - in: query
          name: stage
          schema:
            description: Restrict to staged media (no pull request yet) or to published
              media.
            type: string
            enum:
              - staged
              - published
          description: Restrict to staged media (no pull request yet) or to published media.
        - in: query
          name: search
          schema:
            description: Match media on their file name or slug.
            type: string
          description: Match media on their file name or slug.
        - in: query
          name: type
          schema:
            description: Restrict to images or to videos.
            type: string
            enum:
              - image
              - video
          description: Restrict to images or to videos.
      responses:
        "200":
          description: List of media
          content:
            application/json:
              schema:
                type: object
                properties:
                  pageInfo:
                    $ref: "#/components/schemas/PageInfo"
                  results:
                    type: array
                    items:
                      $ref: "#/components/schemas/Media"
                required:
                  - pageInfo
                  - results
                additionalProperties: false
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /projects/{owner}/{project}/builds:
    get:
      operationId: listBuilds
      summary: List a project's builds
      description: List the builds of a project, most recent first. Results are
        paginated. Use `search` to match builds by name, branch or commit, and
        `distinctName` to return only the latest build per name and commit. Use
        it to find a build by branch, commit or name, or to see the latest
        builds of a project.
      tags:
        - Builds
      security:
        - projectToken: []
        - personalAccessToken: []
        - oauth2:
            - projects:read
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: query
          name: perPage
          schema:
            description: Number of items per page (max 100)
            type: string
          description: Number of items per page (max 100)
        - in: query
          name: page
          schema:
            description: Page number
            type: string
          description: Page number
        - in: query
          name: head
          schema:
            type: string
            minLength: 1
        - in: query
          name: headSha
          schema:
            $ref: "#/components/schemas/Sha1Hash"
        - in: query
          name: search
          schema:
            description: Search builds by name, branch (substring) or commit (prefix).
            type: string
            minLength: 1
          description: Search builds by name, branch (substring) or commit (prefix).
        - in: query
          name: distinctName
          schema:
            description: Only return the latest builds created, unique by name and commit.
            type: string
          description: Only return the latest builds created, unique by name and commit.
      responses:
        "200":
          description: List of builds
          content:
            application/json:
              schema:
                type: object
                properties:
                  pageInfo:
                    $ref: "#/components/schemas/PageInfo"
                  results:
                    type: array
                    items:
                      $ref: "#/components/schemas/Build"
                required:
                  - pageInfo
                  - results
                additionalProperties: false
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
    post:
      operationId: createBuildForProject
      summary: Create a build for a project
      description: >-
        Create a build and receive signed upload targets for its screenshots and
        Playwright traces. The response lists, for every file the server doesn't
        already have, a secure `postUrl` with `fields` to upload it to. After
        uploading, call **updateBuildForProject** to push the screenshot
        metadata and finalize the build.


        **Agent workflow:** `createBuildForProject` → upload files to the
        returned URLs → `updateBuildForProject` (with `final: true`) → poll
        `getBuild` while `status` is `pending` or `progress` → on
        `changes-detected`, `listBuildDiffs` → `createReview`.


        **Uploading is not a tool call:** send each file as a
        `multipart/form-data` POST to its `postUrl`, with every entry of
        `fields` as a form field and the file itself last, as `file`. That needs
        an environment that can make HTTP requests and read the screenshot
        files, such as a coding agent's shell.


        **No shell?** A client that cannot make that POST can send each
        screenshot's bytes inline with `uploadScreenshotForProject` (one call
        per screenshot, base64) and then pass the returned `key`s (each with a
        `name`) to `updateBuildForProject` — the whole loop runs over tool calls
        alone, with no multipart upload.


        **Baseline:** if the project has no connected Git repository, a build
        that sends no `referenceCommit` and whose `parentCommits` match nothing
        is compared against the latest approved build on its `referenceBranch`
        (the default base branch when unset), else the latest completed one. A
        `referenceCommit` with no build is never replaced: that build is
        compared against nothing. Simplest: call `findBaselineForProject` first
        and pass the returned build's `head.sha` as `referenceCommit` (and its
        branch as `referenceBranch`). The first build has no baseline; approve
        it and later builds compare against it.


        Use it to start a visual test build for a project without a CI pipeline.
      tags:
        - Builds
      security:
        - projectToken: []
        - personalAccessToken: []
        - oauth2:
            - builds:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                commit:
                  description: The commit the build is running on
                  $ref: "#/components/schemas/Sha1Hash"
                branch:
                  description: The branch the build is running on
                  $ref: "#/components/schemas/GitBranch"
                pwTraceKeys:
                  description: Keys of Playwright trace files
                  type: array
                  items:
                    $ref: "#/components/schemas/Sha256Hash"
                name:
                  description: The name of the build (for multi-build setups)
                  type:
                    - string
                    - "null"
                parallel:
                  description: Whether to run the build in parallel
                  type:
                    - boolean
                    - "null"
                parallelNonce:
                  description: A unique nonce for the parallel build
                  type:
                    - string
                    - "null"
                prNumber:
                  description: The pull request number
                  anyOf:
                    - type: integer
                      minimum: 1
                      maximum: 9007199254740991
                    - type: "null"
                prHeadCommit:
                  description: The head commit of the pull request
                  anyOf:
                    - $ref: "#/components/schemas/Sha1Hash"
                    - type: "null"
                referenceCommit:
                  description: The commit to use as a reference for the build
                  anyOf:
                    - $ref: "#/components/schemas/Sha1Hash"
                    - type: "null"
                referenceBranch:
                  description: The branch to use as a reference for the build
                  type:
                    - string
                    - "null"
                parentCommits:
                  description: The parent commits of the build
                  anyOf:
                    - type: array
                      items:
                        $ref: "#/components/schemas/Sha1Hash"
                    - type: "null"
                mode:
                  description: The mode in which the build is running
                  anyOf:
                    - type: string
                      enum:
                        - ci
                        - monitoring
                    - type: "null"
                ciProvider:
                  description: The CI provider being used
                  type:
                    - string
                    - "null"
                argosSdk:
                  description: The version of the Snapvisor SDK being used
                  type:
                    - string
                    - "null"
                runId:
                  description: The ID of the current run
                  type:
                    - string
                    - "null"
                runAttempt:
                  description: The attempt number of the current run
                  anyOf:
                    - type: integer
                      minimum: 1
                      maximum: 9007199254740991
                    - type: "null"
                skipped:
                  description: Whether the build was skipped, not comparing anything and always
                    succeeding
                  type:
                    - boolean
                    - "null"
                mergeQueue:
                  description: Whether the build has been created in a merge queue
                  type:
                    - boolean
                    - "null"
                mergeQueuePrNumbers:
                  description: Pull request numbers aggregated by the merge queue build. Requires
                    `mergeQueue` to be `true`.
                  anyOf:
                    - minItems: 1
                      type: array
                      items:
                        type: integer
                        minimum: 1
                        maximum: 9007199254740991
                    - type: "null"
                subset:
                  description: >-
                    Indicates whether this build contains only a subset of
                    screenshots.

                    This is useful when a build is created from an incomplete
                    test suite where some tests are skipped.
                  type:
                    - boolean
                    - "null"
                screenshots:
                  maxItems: 5000
                  type: array
                  items:
                    $ref: "#/components/schemas/ScreenshotUploadRequest"
                  description: Screenshot files to upload
              required:
                - commit
                - branch
                - screenshots
      responses:
        "201":
          description: Result of build creation
          content:
            application/json:
              schema:
                type: object
                properties:
                  build:
                    $ref: "#/components/schemas/Build"
                  screenshots:
                    type: array
                    items:
                      anyOf:
                        - type: object
                          properties:
                            key:
                              type: string
                            putUrl:
                              type: string
                              format: uri
                              deprecated: true
                              description: Deprecated. Use postUrl and fields instead.
                          required:
                            - key
                            - putUrl
                          additionalProperties: false
                        - type: object
                          properties:
                            key:
                              type: string
                            postUrl:
                              type: string
                              format: uri
                            fields:
                              type: object
                              propertyNames:
                                type: string
                              additionalProperties:
                                type: string
                          required:
                            - key
                            - postUrl
                            - fields
                          additionalProperties: false
                  pwTraces:
                    type: array
                    items:
                      anyOf:
                        - type: object
                          properties:
                            key:
                              type: string
                            putUrl:
                              type: string
                              format: uri
                              deprecated: true
                              description: Deprecated. Use postUrl and fields instead.
                          required:
                            - key
                            - putUrl
                          additionalProperties: false
                        - type: object
                          properties:
                            key:
                              type: string
                            postUrl:
                              type: string
                              format: uri
                            fields:
                              type: object
                              propertyNames:
                                type: string
                              additionalProperties:
                                type: string
                          required:
                            - key
                            - postUrl
                            - fields
                          additionalProperties: false
                required:
                  - build
                  - screenshots
                  - pwTraces
                additionalProperties: false
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "409":
          description: Conflict
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /projects/{owner}/{project}/captures:
    post:
      operationId: captureScreenshotsForProject
      summary: Capture screenshots of web pages
      description: >-
        Create a build from public web pages: Snapvisor opens each address in a
        browser, takes the screenshot itself and compares it with the previous
        build. Nothing to upload and no CI needed.


        **Workflow:** `captureScreenshotsForProject` → poll `getBuild` while
        `status` is `pending` or `progress` (capturing takes a few seconds per
        page) → on `changes-detected`, `listBuildDiffs` shows what changed. If
        `status` is `error`, a page could not be captured: check that every page
        loads in a normal browser without logging in and try again.


        **Pages:** only addresses on the public internet; private, local and
        internal addresses are refused. Give every page a stable `name`:
        screenshots are compared by name. If one page cannot be captured,
        nothing is stored for the build.


        Use it to check how a live or preview website looks when there are no
        screenshot files or CI pipeline, such as for a site built without code.
      tags:
        - Builds
      security:
        - projectToken: []
        - personalAccessToken: []
        - oauth2:
            - builds:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                pages:
                  minItems: 1
                  maxItems: 10
                  type: array
                  items:
                    type: object
                    properties:
                      name:
                        type: string
                        minLength: 1
                        maxLength: 256
                        description: 'Screenshot name in the build, such as "home" or "pricing". Use the
                          same name for the same page every time: the comparison
                          matches screenshots by name.'
                      url:
                        type: string
                        maxLength: 2048
                        description: Address of the page, http or https, reachable from the public
                          internet. Pages behind a login cannot be captured.
                      width:
                        default: 1280
                        description: Browser window width in pixels. Default 1280.
                        type: integer
                        minimum: 320
                        maximum: 3840
                      height:
                        default: 800
                        description: Browser window height in pixels. Default 800.
                        type: integer
                        minimum: 240
                        maximum: 2160
                      fullPage:
                        default: true
                        description: Capture the whole page down to its end (default) instead of only
                          the visible window.
                        type: boolean
                    required:
                      - name
                      - url
                  description: The pages to capture, at most 10.
                branch:
                  description: "Branch to record the build on. Default: the project's default base
                    branch, where each build is compared against the previous
                    one."
                  $ref: "#/components/schemas/GitBranch"
                name:
                  description: Build name, to keep separate series of captures apart (for example
                    "mobile"). Default "default".
                  type: string
                  minLength: 1
                  maxLength: 256
              required:
                - pages
      responses:
        "201":
          description: The build, pending until its pages are captured
          content:
            application/json:
              schema:
                type: object
                properties:
                  build:
                    $ref: "#/components/schemas/Build"
                required:
                  - build
                additionalProperties: false
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "503":
          description: Service unavailable
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /projects/{owner}/{project}/builds/finalize:
    post:
      operationId: finalizeProjectBuilds
      summary: Finalize parallel builds for a project
      description: >-
        Mark every parallel shard sharing the given `parallelNonce` as complete.
        Once finalized, the server compares the aggregated screenshots and
        starts processing the build.


        Use it when all shards of a parallel build have been uploaded.
      tags:
        - Builds
      security:
        - projectToken: []
        - personalAccessToken: []
        - oauth2:
            - builds:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                parallelNonce:
                  type: string
                  minLength: 1
              required:
                - parallelNonce
      responses:
        "200":
          description: Result of build finalization
          content:
            application/json:
              schema:
                type: object
                properties:
                  builds:
                    type: array
                    items:
                      $ref: "#/components/schemas/Build"
                required:
                  - builds
                additionalProperties: false
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "409":
          description: Conflict
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /projects/{owner}/{project}/baseline:
    post:
      operationId: findBaselineForProject
      summary: Find an eligible baseline for a project
      description: >-
        Find the build eligible to be used as a baseline among a list of
        ancestor commits. Useful when creating a build without a Git provider:
        send the candidate ancestor commits and the server picks the closest one
        with an eligible (complete, approved) baseline build.


        **Agent workflow:** call this before `createBuildForProject` and pass
        the returned build's `head.sha` as its `referenceCommit`. Without a
        connected Git repository, a build that sends no `referenceCommit` and
        whose `parentCommits` match nothing compares against the latest build on
        its `referenceBranch`; a `referenceCommit` with no build compares
        against nothing.


        Use it to discover which ancestor commit has an approved baseline build.
      tags:
        - Builds
      security:
        - projectToken: []
        - personalAccessToken: []
        - oauth2:
            - builds:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                commits:
                  minItems: 1
                  type: array
                  items:
                    $ref: "#/components/schemas/Sha1Hash"
                  description: The commits to look for an eligible baseline, ordered from the
                    closest to the furthest ancestor. The first commit with an
                    eligible baseline wins.
                name:
                  default: default
                  description: The name of the build to find a baseline for.
                  type: string
                  minLength: 1
                mode:
                  default: ci
                  description: The mode of the build to find a baseline for.
                  type: string
                  enum:
                    - ci
                    - monitoring
              required:
                - commits
      responses:
        "200":
          description: The eligible baseline build, or null when none is found
          content:
            application/json:
              schema:
                type: object
                properties:
                  baseline:
                    anyOf:
                      - $ref: "#/components/schemas/Build"
                      - type: "null"
                    description: The eligible baseline build found among the commits, or null when
                      none is found.
                required:
                  - baseline
                additionalProperties: false
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /projects/{owner}/{project}/builds/{buildNumber}:
    get:
      operationId: getBuild
      summary: Get a build
      description: >-
        Retrieve a single build by its number within a project, including its
        status and metadata. Use it when you have a build number and need its
        status, for example to check whether it still needs review.


        **Polling for completion:** after creating and finalizing a build, poll
        this endpoint while `status` is `pending` or `progress` (processing is
        still running). It then settles on `no-changes` (nothing to review),
        `changes-detected` (diffs found — review needed), or `error`, `aborted`
        or `expired`. On `changes-detected`, call `listBuildDiffs` to inspect
        the individual screenshot diffs. A reviewed build reads `accepted` or
        `rejected`.
      tags:
        - Builds
      security:
        - projectToken: []
        - personalAccessToken: []
        - oauth2:
            - projects:read
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: buildNumber
          schema:
            $ref: "#/components/schemas/BuildNumberParam"
          required: true
          description: The build number
      responses:
        "200":
          description: Build
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Build"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
    put:
      operationId: updateBuildForProject
      summary: Update a build by number
      description: >-
        Add screenshots to an existing build and optionally finalize it.
        Resolves the build by its public number within the project.


        Set `final: true` on the last request to finalize the build and start
        diff processing. For parallel builds, use `parallelIndex` and
        `parallelTotal` to identify shards.


        Use it after uploading screenshots to push their metadata and close the
        build.
      tags:
        - Builds
      security:
        - projectToken: []
        - personalAccessToken: []
        - oauth2:
            - builds:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: buildNumber
          schema:
            $ref: "#/components/schemas/BuildNumberParam"
          required: true
          description: The build number
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                screenshots:
                  type: array
                  items:
                    $ref: "#/components/schemas/ScreenshotInput"
                parallel:
                  type:
                    - boolean
                    - "null"
                parallelTotal:
                  anyOf:
                    - type: integer
                      minimum: -1
                      maximum: 9007199254740991
                    - type: "null"
                parallelIndex:
                  anyOf:
                    - type: integer
                      minimum: 1
                      maximum: 9007199254740991
                    - type: "null"
                final:
                  description: Only used for non-parallel builds. Indicates that this is the last
                    request of the build, so Snapvisor can finalize it. A build
                    whose screenshots are too large to fit in a single request
                    can split them across several sequential requests, leaving
                    `final` falsy on every request but the last. Defaults to
                    `true`.
                  type:
                    - boolean
                    - "null"
                metadata:
                  $ref: "#/components/schemas/BuildMetadata"
              required:
                - screenshots
      responses:
        "200":
          description: Result of build update
          content:
            application/json:
              schema:
                type: object
                properties:
                  build:
                    $ref: "#/components/schemas/Build"
                required:
                  - build
                additionalProperties: false
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "409":
          description: Conflict
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /projects/{owner}/{project}/builds/{buildNumber}/screenshots:
    post:
      operationId: uploadScreenshotForProject
      summary: Upload a screenshot's bytes to a build
      description: >-
        Add one screenshot to a build by sending its bytes inline,
        base64-encoded, in the request — no separate upload step and no shell.
        The server hashes the bytes, stores them, and returns the content hash
        as `key`.


        Decoded size must be at most 700 KB; a larger image is rejected with
        413.


        Use it when an agent has a screenshot but no way to run a multipart
        upload: create a build with createBuildForProject, call this once per
        screenshot, then pass each returned `key` (with a `name`) to
        updateBuildForProject with `final: true` to run the diff.
      tags:
        - Builds
      security:
        - projectToken: []
        - personalAccessToken: []
        - oauth2:
            - builds:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: buildNumber
          schema:
            $ref: "#/components/schemas/BuildNumberParam"
          required: true
          description: The build number
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                image:
                  type: string
                  minLength: 1
                  description: The screenshot's bytes, base64-encoded. A `data:<type>;base64,`
                    prefix is accepted and stripped. Decoded size must be at
                    most 700 KB; larger screenshots are rejected with 413 and
                    should be uploaded through the CLI.
                contentType:
                  description: The image's content type. Defaults to image/png.
                  type: string
              required:
                - image
      responses:
        "201":
          description: Screenshot stored; its content hash is returned as `key`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  key:
                    type: string
                    description: The screenshot's content hash (sha256). Pass it as a screenshot
                      `key` to updateBuildForProject to register the screenshot
                      on the build.
                required:
                  - key
                additionalProperties: false
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "409":
          description: Conflict
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "413":
          description: Payload too large
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /projects/{owner}/{project}/builds/{buildNumber}/diffs:
    get:
      operationId: listBuildDiffs
      summary: List a build's screenshot diffs
      description: >-
        List the screenshot diffs of a build, with pagination. Each diff
        compares a baseline screenshot to the one captured by the build. Each
        diff also carries its test's flakiness metrics and, when it is a change,
        its ignore state and occurrence count — so you can tell whether a change
        is worth reviewing or is just a flaky one. Use `needsReview` to return
        only the diffs that require review. Use it to see what visually changed
        in a build before reviewing it.


        **Agent workflow:** call this after `getBuild` reports
        `changes-detected`. Inspect the diffs, then call `createReview` with
        `APPROVE` or `REJECT`.
      tags:
        - Builds
      security:
        - projectToken: []
        - personalAccessToken: []
        - oauth2:
            - projects:read
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: buildNumber
          schema:
            $ref: "#/components/schemas/BuildNumberParam"
          required: true
          description: The build number
        - in: query
          name: perPage
          schema:
            description: Number of items per page (max 100)
            type: string
          description: Number of items per page (max 100)
        - in: query
          name: page
          schema:
            description: Page number
            type: string
          description: Page number
        - in: query
          name: needsReview
          schema:
            description: Only return diffs that require review. Matches `changed`, `added`,
              and `removed`, except `removed` is excluded for subset builds.
            type: string
          description: Only return diffs that require review. Matches `changed`, `added`,
            and `removed`, except `removed` is excluded for subset builds.
        - in: query
          name: metricsPeriod
          schema:
            default: LAST_7_DAYS
            description: Period over which the test flakiness metrics are computed.
            type: string
            enum:
              - LAST_24_HOURS
              - LAST_3_DAYS
              - LAST_7_DAYS
              - LAST_30_DAYS
              - LAST_90_DAYS
          description: Period over which the test flakiness metrics are computed.
      responses:
        "200":
          description: List of screenshot diffs
          content:
            application/json:
              schema:
                type: object
                properties:
                  pageInfo:
                    $ref: "#/components/schemas/PageInfo"
                  results:
                    type: array
                    items:
                      $ref: "#/components/schemas/SnapshotDiff"
                required:
                  - pageInfo
                  - results
                additionalProperties: false
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /projects/{owner}/{project}/changes/{changeId}/ignore:
    post:
      operationId: ignoreChange
      summary: Ignore a test change
      description: Ignore a test change so its diffs no longer require review and are
        automatically approved on future builds. Use it to silence a change that
        has been identified as flaky.
      tags:
        - Tests
      security:
        - personalAccessToken: []
        - oauth2:
            - reviews:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: changeId
          schema:
            type: string
            description: Identifier of the change to update, as returned in a diff's
              `change.id`.
          required: true
          description: Identifier of the change to update, as returned in a diff's
            `change.id`.
        - in: query
          name: metricsPeriod
          schema:
            default: LAST_7_DAYS
            description: Period over which the test flakiness metrics are computed.
            type: string
            enum:
              - LAST_24_HOURS
              - LAST_3_DAYS
              - LAST_7_DAYS
              - LAST_30_DAYS
              - LAST_90_DAYS
          description: Period over which the test flakiness metrics are computed.
      responses:
        "200":
          description: Change ignored — returns the updated change
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Change"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /projects/{owner}/{project}/changes/{changeId}/unignore:
    post:
      operationId: unignoreChange
      summary: Unignore a test change
      description: Stop ignoring a test change so its diffs require review again on
        future builds. Use it when a change that was silenced should be reviewed
        again.
      tags:
        - Tests
      security:
        - personalAccessToken: []
        - oauth2:
            - reviews:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: changeId
          schema:
            type: string
            description: Identifier of the change to update, as returned in a diff's
              `change.id`.
          required: true
          description: Identifier of the change to update, as returned in a diff's
            `change.id`.
        - in: query
          name: metricsPeriod
          schema:
            default: LAST_7_DAYS
            description: Period over which the test flakiness metrics are computed.
            type: string
            enum:
              - LAST_24_HOURS
              - LAST_3_DAYS
              - LAST_7_DAYS
              - LAST_30_DAYS
              - LAST_90_DAYS
          description: Period over which the test flakiness metrics are computed.
      responses:
        "200":
          description: Change unignored — returns the updated change
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Change"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /projects/{owner}/{project}/builds/{buildNumber}/reviews:
    get:
      operationId: listReviews
      summary: List the reviews submitted on a build
      description: List the reviews submitted on a build, with pagination. Use it to
        see who approved or rejected a build, and when. Also useful after
        `createReview` to verify a review was recorded, or to check if a build
        has already been reviewed before submitting a duplicate.
      tags:
        - Reviews
      security:
        - personalAccessToken: []
        - oauth2:
            - projects:read
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: buildNumber
          schema:
            $ref: "#/components/schemas/BuildNumberParam"
          required: true
          description: The build number
      responses:
        "200":
          description: Build reviews
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/BuildReview"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
    post:
      operationId: createReview
      summary: Create a review on a build
      description: >-
        Submit a review on a build to approve or reject the changes it captured.
        Use `APPROVE` to accept all changes as the new baseline, or `REJECT` to
        flag them for rework. Optionally pass per-screenshot decisions in
        `snapshots`. Confirm with the user first: the decision is reported to
        GitHub or GitLab, where it can unblock or block a merge.


        Use it after reviewing diffs to approve or reject a build.
      tags:
        - Reviews
      security:
        - personalAccessToken: []
        - oauth2:
            - reviews:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: buildNumber
          schema:
            $ref: "#/components/schemas/BuildNumberParam"
          required: true
          description: The build number
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                event:
                  description: 'Review event to apply to the build: "APPROVE", "REJECT" or
                    "COMMENT". Required when `conclusion` is not provided.'
                  type: string
                  enum:
                    - APPROVE
                    - REJECT
                    - COMMENT
                conclusion:
                  deprecated: true
                  description: 'Deprecated: use `event` instead. Overall review conclusion for the
                    build: "APPROVE" or "REQUEST_CHANGES".'
                  type: string
                  enum:
                    - APPROVE
                    - REQUEST_CHANGES
                body:
                  description: Optional comment to attach to the review. Either Markdown text or
                    the JSON representation of a rich-text document.
                snapshots:
                  default: []
                  description: Optional per-snapshot review decisions. When omitted, only the
                    build-level review is recorded.
                  type: array
                  items:
                    type: object
                    properties:
                      id:
                        type: string
                        description: The ID of the snapshot to review
                      conclusion:
                        type: string
                        enum:
                          - APPROVE
                          - REQUEST_CHANGES
                        description: 'Review conclusion for this individual snapshot: "APPROVE" or
                          "REQUEST_CHANGES"'
                    required:
                      - id
                      - conclusion
      responses:
        "200":
          description: Review submitted successfully — returns the review
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BuildReview"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /repos/{owner}/{repo}/commits/{sha}/pulls:
    get:
      operationId: getRepoCommitPulls
      summary: Get the GitHub pull request for a commit
      description: Look up, on GitHub, the pull request that contains a commit of a
        repository connected to Snapvisor, with its number, title, state, link
        and changed files. Use it when you have a commit SHA, for example from a
        build, and need the pull request it belongs to. Accepts a personal
        access token only; OAuth connections are refused.
      security:
        - personalAccessToken: []
      x-mcp:
        enabled: false
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: repo
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: sha
          schema:
            $ref: "#/components/schemas/Sha1Hash"
          required: true
          description: SHA1 hash
      responses:
        "200":
          description: GitHub PR associated with the commit (or null)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/PrContext"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
  /projects/{owner}/{project}/builds/{buildNumber}/reviewers:
    get:
      operationId: listBuildReviewers
      summary: List a build's requested reviewers
      description: List the users currently requested to review a build. Use it to
        check who has been asked to review a build. Check this before
        `addBuildReviewers` to avoid redundant requests.
      tags:
        - Reviews
      security:
        - personalAccessToken: []
        - oauth2:
            - projects:read
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: buildNumber
          schema:
            $ref: "#/components/schemas/BuildNumberParam"
          required: true
          description: The build number
      responses:
        "200":
          description: The users requested to review the build
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BuildReviewers"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
    post:
      operationId: addBuildReviewers
      summary: Request reviewers on a build
      description: "Ask users to review a build. Each newly-requested reviewer is
        notified. Idempotent: users already requested are left untouched and not
        notified again. Users without access to the project are ignored, and you
        cannot request yourself. Use it when the user wants specific teammates
        to review a build."
      tags:
        - Reviews
      security:
        - personalAccessToken: []
        - oauth2:
            - reviews:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: buildNumber
          schema:
            $ref: "#/components/schemas/BuildNumberParam"
          required: true
          description: The build number
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                userIds:
                  minItems: 1
                  maxItems: 100
                  type: array
                  items:
                    type: string
                  description: Identifiers of the users to act on — the `id` of a user as returned
                    by `listBuildReviewers` or `getMe`.
              required:
                - userIds
      responses:
        "200":
          description: The users requested to review the build
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BuildReviewers"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
    delete:
      operationId: removeBuildReviewers
      summary: Cancel review requests on a build
      description: Cancel the review requests standing on a build. Removing a user
        that was not requested is a no-op. Use it when a review request is no
        longer needed.
      tags:
        - Reviews
      security:
        - personalAccessToken: []
        - oauth2:
            - reviews:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: buildNumber
          schema:
            $ref: "#/components/schemas/BuildNumberParam"
          required: true
          description: The build number
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                userIds:
                  minItems: 1
                  maxItems: 100
                  type: array
                  items:
                    type: string
                  description: Identifiers of the users to act on — the `id` of a user as returned
                    by `listBuildReviewers` or `getMe`.
              required:
                - userIds
      responses:
        "200":
          description: The users still requested to review the build
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BuildReviewers"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /projects/{owner}/{project}/builds/{buildNumber}/subscription:
    post:
      operationId: subscribeBuild
      summary: Subscribe to a build
      description: Start receiving notifications about a build — new comments,
        reviews, and status changes. Clears a previous explicit unsubscription.
        Use it when the user wants to follow a build they are not already
        notified about.
      tags:
        - Builds
      security:
        - personalAccessToken: []
        - oauth2:
            - comments:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: buildNumber
          schema:
            $ref: "#/components/schemas/BuildNumberParam"
          required: true
          description: The build number
      responses:
        "200":
          description: Subscribed
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/NotificationSubscription"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
    delete:
      operationId: unsubscribeBuild
      summary: Unsubscribe from a build
      description: Stop receiving notifications about a build. Recorded as an
        intentional unsubscription, so Snapvisor will not auto-subscribe you to
        it again. Use it when the user no longer wants notifications about a
        build.
      tags:
        - Builds
      security:
        - personalAccessToken: []
        - oauth2:
            - comments:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: buildNumber
          schema:
            $ref: "#/components/schemas/BuildNumberParam"
          required: true
          description: The build number
      responses:
        "200":
          description: Unsubscribed
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/NotificationSubscription"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /projects/{owner}/{project}/tests/{testId}/subscription:
    post:
      operationId: subscribeTest
      summary: Subscribe to a test
      description: Start receiving notifications about a test — new comments and the
        changes it produces. Clears a previous explicit unsubscription. Use it
        when the user wants to follow a test they are not already notified
        about.
      tags:
        - Tests
      security:
        - personalAccessToken: []
        - oauth2:
            - comments:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: testId
          schema:
            $ref: "#/components/schemas/TestId"
          required: true
          description: The test identifier, as returned in a diff's `test.id`
      responses:
        "200":
          description: Subscribed
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/NotificationSubscription"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
    delete:
      operationId: unsubscribeTest
      summary: Unsubscribe from a test
      description: Stop receiving notifications about a test. Recorded as an
        intentional unsubscription, so Snapvisor will not auto-subscribe you to
        it again. Use it when the user no longer wants notifications about a
        test.
      tags:
        - Tests
      security:
        - personalAccessToken: []
        - oauth2:
            - comments:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: testId
          schema:
            $ref: "#/components/schemas/TestId"
          required: true
          description: The test identifier, as returned in a diff's `test.id`
      responses:
        "200":
          description: Unsubscribed
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/NotificationSubscription"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /projects/{owner}/{project}/builds/{buildNumber}/reviews/{reviewId}/dismiss:
    post:
      operationId: dismissReview
      summary: Dismiss a submitted review on a build
      description: Dismiss a previously submitted review on a build, clearing its
        effect on the build's review status. Use it when a review was submitted
        by mistake or no longer reflects the build.
      tags:
        - Reviews
      security:
        - personalAccessToken: []
        - oauth2:
            - reviews:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: buildNumber
          schema:
            $ref: "#/components/schemas/BuildNumberParam"
          required: true
          description: The build number
        - in: path
          name: reviewId
          schema:
            type: string
            description: The ID of the review
          required: true
          description: The ID of the review
      responses:
        "200":
          description: Review dismissed successfully — returns the review
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BuildReview"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /projects/{owner}/{project}/builds/{buildNumber}/comments:
    get:
      operationId: listBuildComments
      summary: List the comments on a build
      description: List the comments on a build. Use it to read the review discussion
        on a build.
      tags:
        - Comments
      security:
        - personalAccessToken: []
        - oauth2:
            - comments:read
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: buildNumber
          schema:
            $ref: "#/components/schemas/BuildNumberParam"
          required: true
          description: The build number
      responses:
        "200":
          description: Comments, oldest first. Replies carry a threadId pointing at their
            root comment.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Comment"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
    post:
      operationId: createBuildComment
      summary: Post a comment (or reply) on a build
      description: Post a comment on a build. Start a new thread, reply to an existing
        one with `threadId`, optionally anchor the comment to a screenshot diff,
        or attach it to your pending review with `addToReview`. Use it when the
        user wants to leave feedback on a build or on a specific screenshot
        diff.
      tags:
        - Comments
      security:
        - personalAccessToken: []
        - oauth2:
            - comments:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: buildNumber
          schema:
            $ref: "#/components/schemas/BuildNumberParam"
          required: true
          description: The build number
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                body:
                  anyOf:
                    - type: string
                    - type: object
                      propertyNames:
                        type: string
                      additionalProperties: {}
                  description: Comment content. Either Markdown text or the JSON representation of
                    a rich-text document.
                threadId:
                  description: Public ID of the root comment to reply to (e.g. `comment-xf23d`).
                  type: string
                screenshotDiffId:
                  description: Screenshot diff to anchor the comment to. Required when anchor is
                    set.
                  type: string
                anchor:
                  oneOf:
                    - type: object
                      properties:
                        type:
                          type: string
                          const: point
                        x:
                          type: number
                        y:
                          type: number
                      required:
                        - type
                        - x
                        - y
                    - type: object
                      properties:
                        type:
                          type: string
                          const: lines
                        from:
                          type: integer
                          minimum: -9007199254740991
                          maximum: 9007199254740991
                        to:
                          type: integer
                          minimum: -9007199254740991
                          maximum: 9007199254740991
                      required:
                        - type
                        - from
                        - to
                  description: Where on the referenced screenshot diff the comment points. A point
                    uses normalized (0–1) coordinates; lines is a 1-based
                    inclusive range.
                  type: object
                addToReview:
                  description: Attach the comment to your pending review (created if needed)
                    instead of posting it immediately. Ignored for replies,
                    which inherit their thread's review.
                  type: boolean
              required:
                - body
      responses:
        "201":
          description: Comment created successfully — returns the comment
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Comment"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /projects/{owner}/{project}/builds/{buildNumber}/comments/{commentId}:
    get:
      operationId: getBuildComment
      summary: Get a single comment on a build
      description: Retrieve a single comment on a build by its ID. Use it when you
        have a comment ID and need its full content.
      tags:
        - Comments
      security:
        - personalAccessToken: []
        - oauth2:
            - comments:read
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: buildNumber
          schema:
            $ref: "#/components/schemas/BuildNumberParam"
          required: true
          description: The build number
        - in: path
          name: commentId
          schema:
            $ref: "#/components/schemas/CommentId"
          required: true
          description: The public ID of the comment (e.g. `comment-xf23d`)
      responses:
        "200":
          description: Comment
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Comment"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
    patch:
      operationId: updateBuildComment
      summary: Update a comment on a build
      description: Update the body of a comment on a build. Only the comment's author
        can edit it. Use it when the author wants to correct or reword their own
        comment.
      tags:
        - Comments
      security:
        - personalAccessToken: []
        - oauth2:
            - comments:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: buildNumber
          schema:
            $ref: "#/components/schemas/BuildNumberParam"
          required: true
          description: The build number
        - in: path
          name: commentId
          schema:
            $ref: "#/components/schemas/CommentId"
          required: true
          description: The public ID of the comment (e.g. `comment-xf23d`)
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                body:
                  anyOf:
                    - type: string
                    - type: object
                      propertyNames:
                        type: string
                      additionalProperties: {}
                  description: Comment content. Either Markdown text or the JSON representation of
                    a rich-text document.
              required:
                - body
      responses:
        "200":
          description: Comment updated successfully — returns the comment
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Comment"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
    delete:
      operationId: deleteBuildComment
      summary: Delete a comment on a build
      description: Delete a comment on a build. Only the comment's author can delete
        it. Use it when the author asks to remove their own comment.
      tags:
        - Comments
      security:
        - personalAccessToken: []
        - oauth2:
            - comments:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: buildNumber
          schema:
            $ref: "#/components/schemas/BuildNumberParam"
          required: true
          description: The build number
        - in: path
          name: commentId
          schema:
            $ref: "#/components/schemas/CommentId"
          required: true
          description: The public ID of the comment (e.g. `comment-xf23d`)
      responses:
        "200":
          description: Comment deleted successfully — returns the comment
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Comment"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /projects/{owner}/{project}/builds/{buildNumber}/comments/{commentId}/reactions:
    post:
      operationId: addBuildCommentReaction
      summary: Add an emoji reaction to a comment on a build
      description: Add an emoji reaction to a comment on a build, on behalf of the
        authenticated user. Use it to acknowledge a comment with an emoji rather
        than a reply.
      tags:
        - Comments
      security:
        - personalAccessToken: []
        - oauth2:
            - comments:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: buildNumber
          schema:
            $ref: "#/components/schemas/BuildNumberParam"
          required: true
          description: The build number
        - in: path
          name: commentId
          schema:
            $ref: "#/components/schemas/CommentId"
          required: true
          description: The public ID of the comment (e.g. `comment-xf23d`)
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                emoji:
                  type: string
                  description: The emoji to react with.
              required:
                - emoji
      responses:
        "200":
          description: Reaction added — returns the comment
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Comment"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
    delete:
      operationId: removeBuildCommentReaction
      summary: Remove an emoji reaction from a comment on a build
      description: Remove an emoji reaction previously added by the authenticated user
        from a comment on a build. Use it to take back an emoji reaction added
        by mistake.
      tags:
        - Comments
      security:
        - personalAccessToken: []
        - oauth2:
            - comments:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: buildNumber
          schema:
            $ref: "#/components/schemas/BuildNumberParam"
          required: true
          description: The build number
        - in: path
          name: commentId
          schema:
            $ref: "#/components/schemas/CommentId"
          required: true
          description: The public ID of the comment (e.g. `comment-xf23d`)
        - in: query
          name: emoji
          schema:
            type: string
            description: The emoji reaction to remove.
          required: true
          description: The emoji reaction to remove.
      responses:
        "200":
          description: Reaction removed — returns the comment
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Comment"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /projects/{owner}/{project}/builds/{buildNumber}/comments/{commentId}/resolve:
    post:
      operationId: resolveBuildCommentThread
      summary: Mark a build comment thread as resolved
      description: Mark a comment thread on a build as resolved. Use it when the
        feedback in a thread has been addressed.
      tags:
        - Comments
      security:
        - personalAccessToken: []
        - oauth2:
            - comments:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: buildNumber
          schema:
            $ref: "#/components/schemas/BuildNumberParam"
          required: true
          description: The build number
        - in: path
          name: commentId
          schema:
            $ref: "#/components/schemas/ThreadCommentId"
          required: true
          description: Public ID of any comment in the thread (e.g. `comment-xf23d`)
      responses:
        "200":
          description: Thread resolved — returns the root comment
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Comment"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /projects/{owner}/{project}/builds/{buildNumber}/comments/{commentId}/unresolve:
    post:
      operationId: unresolveBuildCommentThread
      summary: Reopen a resolved build comment thread
      description: Reopen a previously resolved comment thread on a build. Use it when
        a resolved thread needs more discussion.
      tags:
        - Comments
      security:
        - personalAccessToken: []
        - oauth2:
            - comments:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: buildNumber
          schema:
            $ref: "#/components/schemas/BuildNumberParam"
          required: true
          description: The build number
        - in: path
          name: commentId
          schema:
            $ref: "#/components/schemas/ThreadCommentId"
          required: true
          description: Public ID of any comment in the thread (e.g. `comment-xf23d`)
      responses:
        "200":
          description: Thread reopened — returns the root comment
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Comment"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /projects/{owner}/{project}/builds/{buildNumber}/comments/{commentId}/subscription:
    post:
      operationId: subscribeBuildCommentThread
      summary: Subscribe to a build comment thread's notifications
      description: Subscribe the authenticated user to a comment thread on a build to
        receive notifications about new replies. Use it when the user wants to
        follow replies to a thread they have not taken part in.
      tags:
        - Comments
      security:
        - personalAccessToken: []
        - oauth2:
            - comments:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: buildNumber
          schema:
            $ref: "#/components/schemas/BuildNumberParam"
          required: true
          description: The build number
        - in: path
          name: commentId
          schema:
            $ref: "#/components/schemas/ThreadCommentId"
          required: true
          description: Public ID of any comment in the thread (e.g. `comment-xf23d`)
      responses:
        "200":
          description: Subscribed — returns the root comment
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Comment"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
    delete:
      operationId: unsubscribeBuildCommentThread
      summary: Unsubscribe from a build comment thread's notifications
      description: Unsubscribe the authenticated user from a build comment thread's
        notifications. Use it when the user no longer wants notifications for a
        thread.
      tags:
        - Comments
      security:
        - personalAccessToken: []
        - oauth2:
            - comments:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: buildNumber
          schema:
            $ref: "#/components/schemas/BuildNumberParam"
          required: true
          description: The build number
        - in: path
          name: commentId
          schema:
            $ref: "#/components/schemas/ThreadCommentId"
          required: true
          description: Public ID of any comment in the thread (e.g. `comment-xf23d`)
      responses:
        "200":
          description: Unsubscribed — returns the root comment
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Comment"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /projects/{owner}/{project}/tests:
    get:
      operationId: listTests
      summary: List a project's tests
      description: "List the tests currently running in a project, flakiest first. A
        test is listed when it appeared in the latest reference build of its
        build name — tests that were deleted, renamed or skipped drop out. Use
        it to find what to stabilise: the first page is the project's flakiness
        backlog."
      tags:
        - Tests
      security:
        - projectToken: []
        - personalAccessToken: []
        - oauth2:
            - projects:read
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: query
          name: perPage
          schema:
            description: Number of items per page (max 100)
            type: string
          description: Number of items per page (max 100)
        - in: query
          name: page
          schema:
            description: Page number
            type: string
          description: Page number
        - in: query
          name: metricsPeriod
          schema:
            default: LAST_7_DAYS
            description: Period over which the test flakiness metrics are computed.
            type: string
            enum:
              - LAST_24_HOURS
              - LAST_3_DAYS
              - LAST_7_DAYS
              - LAST_30_DAYS
              - LAST_90_DAYS
          description: Period over which the test flakiness metrics are computed.
        - in: query
          name: buildName
          schema:
            description: Restrict to the tests of a single build name.
            type: string
          description: Restrict to the tests of a single build name.
        - in: query
          name: search
          schema:
            description: Match tests on their name.
            type: string
          description: Match tests on their name.
      responses:
        "200":
          description: List of the project's tests, flakiest first
          content:
            application/json:
              schema:
                type: object
                properties:
                  pageInfo:
                    $ref: "#/components/schemas/PageInfo"
                  results:
                    type: array
                    items:
                      $ref: "#/components/schemas/TestSummary"
                required:
                  - pageInfo
                  - results
                additionalProperties: false
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /projects/{owner}/{project}/deployments:
    get:
      operationId: listProjectDeployments
      summary: List a project's deployments
      description: List a project's deployments, most recent first. Use `environment`
        to keep only the production ones — the deployments that answer "what is
        live right now?". Use it to find what is deployed for a project, or the
        address of a deployment.
      tags:
        - Deployments
      security:
        - projectToken: []
        - personalAccessToken: []
        - oauth2:
            - projects:read
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: query
          name: perPage
          schema:
            description: Number of items per page (max 100)
            type: string
          description: Number of items per page (max 100)
        - in: query
          name: page
          schema:
            description: Page number
            type: string
          description: Page number
        - in: query
          name: environment
          schema:
            description: Restrict to one environment.
            type: string
            enum:
              - preview
              - production
          description: Restrict to one environment.
      responses:
        "200":
          description: List of deployments
          content:
            application/json:
              schema:
                type: object
                properties:
                  pageInfo:
                    $ref: "#/components/schemas/PageInfo"
                  results:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                        status:
                          type: string
                          enum:
                            - pending
                            - ready
                            - error
                        environment:
                          type: string
                          enum:
                            - preview
                            - production
                        branch:
                          $ref: "#/components/schemas/GitBranch"
                        commitSha:
                          $ref: "#/components/schemas/Sha256Hash"
                        url:
                          type: string
                          format: uri
                        createdAt:
                          type: string
                      required:
                        - id
                        - status
                        - environment
                        - branch
                        - commitSha
                        - url
                        - createdAt
                      additionalProperties: false
                required:
                  - pageInfo
                  - results
                additionalProperties: false
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /projects/{owner}/{project}/domain:
    get:
      operationId: getProjectDomain
      summary: Get a project's deployment domain
      description: Retrieve the domain the project's production deployments are served
        on. Use it to find the address a project's production deployments are
        served on.
      tags:
        - Deployments
      security:
        - projectToken: []
        - personalAccessToken: []
        - oauth2:
            - projects:read
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
      responses:
        "200":
          description: The production deployment domain
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProjectDomain"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
    put:
      operationId: updateProjectDomain
      summary: Set a project's deployment domain
      description: Set the domain the project's production deployments are served on.
        Requires administrator access to the project. Only domains under the
        Snapvisor deployments domain are accepted, and reserved slugs are
        refused. Use it when a project administrator asks to change that
        address.
      tags:
        - Deployments
      security:
        - personalAccessToken: []
        - oauth2:
            - projects:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                domain:
                  type: string
                  minLength: 1
                  description: The full domain to serve production deployments on, under the
                    Snapvisor deployments domain (a slug followed by that
                    domain, as shown in the project's deployment settings).
                    `getProjectDomain` returns the project's current one.
              required:
                - domain
      responses:
        "200":
          description: The updated production deployment domain
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProjectDomain"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /projects/{owner}/{project}/ignored-changes:
    get:
      operationId: listIgnoredChanges
      summary: List a project's ignored changes
      description: List the changes currently ignored in a project, most recently
        ignored first. Use it to audit what has been silenced and to unignore
        anything that should be reviewed again.
      tags:
        - Tests
      security:
        - projectToken: []
        - personalAccessToken: []
        - oauth2:
            - projects:read
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: query
          name: perPage
          schema:
            description: Number of items per page (max 100)
            type: string
          description: Number of items per page (max 100)
        - in: query
          name: page
          schema:
            description: Page number
            type: string
          description: Page number
      responses:
        "200":
          description: List of the project's ignored changes
          content:
            application/json:
              schema:
                type: object
                properties:
                  pageInfo:
                    $ref: "#/components/schemas/PageInfo"
                  results:
                    type: array
                    items:
                      $ref: "#/components/schemas/IgnoredChange"
                required:
                  - pageInfo
                  - results
                additionalProperties: false
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /projects/{owner}/{project}/tests/{testId}:
    get:
      operationId: getTest
      summary: Get a test and its flakiness metrics
      description: "Get a test with its flakiness metrics over a period: how many
        builds ran it, how many times it changed, and how stable and consistent
        those changes were. The metrics also come bucketed over time, so you can
        tell a test that has always been flaky from one that started recently.
        Pair it with `listTestChanges` to see what actually keeps changing. Use
        it when asked whether a test is flaky, or since when."
      tags:
        - Tests
      security:
        - projectToken: []
        - personalAccessToken: []
        - oauth2:
            - projects:read
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: testId
          schema:
            $ref: "#/components/schemas/TestId"
          required: true
          description: The test identifier, as returned in a diff's `test.id`
        - in: query
          name: metricsPeriod
          schema:
            default: LAST_7_DAYS
            description: Period over which the test flakiness metrics are computed.
            type: string
            enum:
              - LAST_24_HOURS
              - LAST_3_DAYS
              - LAST_7_DAYS
              - LAST_30_DAYS
              - LAST_90_DAYS
          description: Period over which the test flakiness metrics are computed.
      responses:
        "200":
          description: The test and its flakiness metrics
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/TestDetails"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /projects/{owner}/{project}/tests/{testId}/changes:
    get:
      operationId: listTestChanges
      summary: List a test's changes
      description: "List the distinct changes a test produced over a period, the ones
        that came back most often first. Each change is one exact visual
        difference, with how many times it reappeared, whether it is ignored,
        and the diff of its latest occurrence — so you can look at what moved. A
        change that keeps reappearing while nothing in the UI changed is a flaky
        one: fix what makes it unstable, or silence it with `ignoreChange`. Use
        it to see what keeps changing in a flaky test."
      tags:
        - Tests
      security:
        - projectToken: []
        - personalAccessToken: []
        - oauth2:
            - projects:read
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: testId
          schema:
            $ref: "#/components/schemas/TestId"
          required: true
          description: The test identifier, as returned in a diff's `test.id`
        - in: query
          name: perPage
          schema:
            description: Number of items per page (max 100)
            type: string
          description: Number of items per page (max 100)
        - in: query
          name: page
          schema:
            description: Page number
            type: string
          description: Page number
        - in: query
          name: metricsPeriod
          schema:
            default: LAST_7_DAYS
            description: Period over which the test flakiness metrics are computed.
            type: string
            enum:
              - LAST_24_HOURS
              - LAST_3_DAYS
              - LAST_7_DAYS
              - LAST_30_DAYS
              - LAST_90_DAYS
          description: Period over which the test flakiness metrics are computed.
        - in: query
          name: ignored
          schema:
            description: Restrict the changes to the ones currently ignored (`true`) or to
              the ones still under review (`false`). Omit it to get both.
            type: string
            enum:
              - "true"
              - "false"
          description: Restrict the changes to the ones currently ignored (`true`) or to
            the ones still under review (`false`). Omit it to get both.
      responses:
        "200":
          description: List of the test's changes
          content:
            application/json:
              schema:
                type: object
                properties:
                  pageInfo:
                    $ref: "#/components/schemas/PageInfo"
                  results:
                    type: array
                    items:
                      $ref: "#/components/schemas/TestChange"
                required:
                  - pageInfo
                  - results
                additionalProperties: false
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /projects/{owner}/{project}/tests/{testId}/comments:
    get:
      operationId: listTestComments
      summary: List the comments on a test
      description: List the comments on a test. Use it to read the review discussion
        on a test.
      tags:
        - Comments
      security:
        - personalAccessToken: []
        - oauth2:
            - comments:read
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: testId
          schema:
            $ref: "#/components/schemas/TestId"
          required: true
          description: The test identifier, as returned in a diff's `test.id`
      responses:
        "200":
          description: Comments, oldest first. Replies carry a threadId pointing at their
            root comment.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Comment"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
    post:
      operationId: createTestComment
      summary: Post a comment (or reply) on a test
      description: Post a comment on a test. Start a new thread, or reply to an
        existing one with `threadId`. Use it when the user wants to leave
        feedback on a test.
      tags:
        - Comments
      security:
        - personalAccessToken: []
        - oauth2:
            - comments:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: testId
          schema:
            $ref: "#/components/schemas/TestId"
          required: true
          description: The test identifier, as returned in a diff's `test.id`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                body:
                  anyOf:
                    - type: string
                    - type: object
                      propertyNames:
                        type: string
                      additionalProperties: {}
                  description: Comment content. Either Markdown text or the JSON representation of
                    a rich-text document.
                threadId:
                  description: Public ID of the root comment to reply to (e.g. `comment-xf23d`).
                  type: string
              required:
                - body
      responses:
        "201":
          description: Comment created successfully — returns the comment
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Comment"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /projects/{owner}/{project}/tests/{testId}/comments/{commentId}:
    get:
      operationId: getTestComment
      summary: Get a single comment on a test
      description: Retrieve a single comment on a test by its ID. Use it when you have
        a comment ID and need its full content.
      tags:
        - Comments
      security:
        - personalAccessToken: []
        - oauth2:
            - comments:read
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: testId
          schema:
            $ref: "#/components/schemas/TestId"
          required: true
          description: The test identifier, as returned in a diff's `test.id`
        - in: path
          name: commentId
          schema:
            $ref: "#/components/schemas/CommentId"
          required: true
          description: The public ID of the comment (e.g. `comment-xf23d`)
      responses:
        "200":
          description: Comment
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Comment"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
    patch:
      operationId: updateTestComment
      summary: Update a comment on a test
      description: Update the body of a comment on a test. Only the comment's author
        can edit it. Use it when the author wants to correct or reword their own
        comment.
      tags:
        - Comments
      security:
        - personalAccessToken: []
        - oauth2:
            - comments:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: testId
          schema:
            $ref: "#/components/schemas/TestId"
          required: true
          description: The test identifier, as returned in a diff's `test.id`
        - in: path
          name: commentId
          schema:
            $ref: "#/components/schemas/CommentId"
          required: true
          description: The public ID of the comment (e.g. `comment-xf23d`)
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                body:
                  anyOf:
                    - type: string
                    - type: object
                      propertyNames:
                        type: string
                      additionalProperties: {}
                  description: Comment content. Either Markdown text or the JSON representation of
                    a rich-text document.
              required:
                - body
      responses:
        "200":
          description: Comment updated successfully — returns the comment
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Comment"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
    delete:
      operationId: deleteTestComment
      summary: Delete a comment on a test
      description: Delete a comment on a test. Only the comment's author can delete
        it. Use it when the author asks to remove their own comment.
      tags:
        - Comments
      security:
        - personalAccessToken: []
        - oauth2:
            - comments:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: testId
          schema:
            $ref: "#/components/schemas/TestId"
          required: true
          description: The test identifier, as returned in a diff's `test.id`
        - in: path
          name: commentId
          schema:
            $ref: "#/components/schemas/CommentId"
          required: true
          description: The public ID of the comment (e.g. `comment-xf23d`)
      responses:
        "200":
          description: Comment deleted successfully — returns the comment
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Comment"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /projects/{owner}/{project}/tests/{testId}/comments/{commentId}/reactions:
    post:
      operationId: addTestCommentReaction
      summary: Add an emoji reaction to a comment on a test
      description: Add an emoji reaction to a comment on a test, on behalf of the
        authenticated user. Use it to acknowledge a comment with an emoji rather
        than a reply.
      tags:
        - Comments
      security:
        - personalAccessToken: []
        - oauth2:
            - comments:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: testId
          schema:
            $ref: "#/components/schemas/TestId"
          required: true
          description: The test identifier, as returned in a diff's `test.id`
        - in: path
          name: commentId
          schema:
            $ref: "#/components/schemas/CommentId"
          required: true
          description: The public ID of the comment (e.g. `comment-xf23d`)
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                emoji:
                  type: string
                  description: The emoji to react with.
              required:
                - emoji
      responses:
        "200":
          description: Reaction added — returns the comment
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Comment"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
    delete:
      operationId: removeTestCommentReaction
      summary: Remove an emoji reaction from a comment on a test
      description: Remove an emoji reaction previously added by the authenticated user
        from a comment on a test. Use it to take back an emoji reaction added by
        mistake.
      tags:
        - Comments
      security:
        - personalAccessToken: []
        - oauth2:
            - comments:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: testId
          schema:
            $ref: "#/components/schemas/TestId"
          required: true
          description: The test identifier, as returned in a diff's `test.id`
        - in: path
          name: commentId
          schema:
            $ref: "#/components/schemas/CommentId"
          required: true
          description: The public ID of the comment (e.g. `comment-xf23d`)
        - in: query
          name: emoji
          schema:
            type: string
            description: The emoji reaction to remove.
          required: true
          description: The emoji reaction to remove.
      responses:
        "200":
          description: Reaction removed — returns the comment
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Comment"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /projects/{owner}/{project}/tests/{testId}/comments/{commentId}/resolve:
    post:
      operationId: resolveTestCommentThread
      summary: Mark a test comment thread as resolved
      description: Mark a comment thread on a test as resolved. Use it when the
        feedback in a thread has been addressed.
      tags:
        - Comments
      security:
        - personalAccessToken: []
        - oauth2:
            - comments:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: testId
          schema:
            $ref: "#/components/schemas/TestId"
          required: true
          description: The test identifier, as returned in a diff's `test.id`
        - in: path
          name: commentId
          schema:
            $ref: "#/components/schemas/ThreadCommentId"
          required: true
          description: Public ID of any comment in the thread (e.g. `comment-xf23d`)
      responses:
        "200":
          description: Thread resolved — returns the root comment
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Comment"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /projects/{owner}/{project}/tests/{testId}/comments/{commentId}/unresolve:
    post:
      operationId: unresolveTestCommentThread
      summary: Reopen a resolved test comment thread
      description: Reopen a previously resolved comment thread on a test. Use it when
        a resolved thread needs more discussion.
      tags:
        - Comments
      security:
        - personalAccessToken: []
        - oauth2:
            - comments:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: testId
          schema:
            $ref: "#/components/schemas/TestId"
          required: true
          description: The test identifier, as returned in a diff's `test.id`
        - in: path
          name: commentId
          schema:
            $ref: "#/components/schemas/ThreadCommentId"
          required: true
          description: Public ID of any comment in the thread (e.g. `comment-xf23d`)
      responses:
        "200":
          description: Thread reopened — returns the root comment
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Comment"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
  /projects/{owner}/{project}/tests/{testId}/comments/{commentId}/subscription:
    post:
      operationId: subscribeTestCommentThread
      summary: Subscribe to a test comment thread's notifications
      description: Subscribe the authenticated user to a comment thread on a test to
        receive notifications about new replies. Use it when the user wants to
        follow replies to a thread they have not taken part in.
      tags:
        - Comments
      security:
        - personalAccessToken: []
        - oauth2:
            - comments:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: testId
          schema:
            $ref: "#/components/schemas/TestId"
          required: true
          description: The test identifier, as returned in a diff's `test.id`
        - in: path
          name: commentId
          schema:
            $ref: "#/components/schemas/ThreadCommentId"
          required: true
          description: Public ID of any comment in the thread (e.g. `comment-xf23d`)
      responses:
        "200":
          description: Subscribed — returns the root comment
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Comment"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
    delete:
      operationId: unsubscribeTestCommentThread
      summary: Unsubscribe from a test comment thread's notifications
      description: Unsubscribe the authenticated user from a test comment thread's
        notifications. Use it when the user no longer wants notifications for a
        thread.
      tags:
        - Comments
      security:
        - personalAccessToken: []
        - oauth2:
            - comments:write
      parameters:
        - in: path
          name: owner
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: project
          schema:
            type: string
            minLength: 1
          required: true
        - in: path
          name: testId
          schema:
            $ref: "#/components/schemas/TestId"
          required: true
          description: The test identifier, as returned in a diff's `test.id`
        - in: path
          name: commentId
          schema:
            $ref: "#/components/schemas/ThreadCommentId"
          required: true
          description: Public ID of any comment in the thread (e.g. `comment-xf23d`)
      responses:
        "200":
          description: Unsubscribed — returns the root comment
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Comment"
        "400":
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "404":
          description: Not found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      x-gitbook-mcp: true
components:
  schemas:
    TeamDefaultUserLevel:
      type: string
      enum:
        - member
        - contributor
      description: Role given to users that join a team through its invite link or a
        verified email domain.
    TeamUserLevel:
      type: string
      enum:
        - owner
        - member
        - contributor
      description: Role of a user on a team. Owners administer the team, members see
        every project, contributors only the projects they are added to.
    CommentId:
      type: string
      description: The public ID of the comment (e.g. `comment-xf23d`)
    ThreadCommentId:
      type: string
      description: Public ID of any comment in the thread (e.g. `comment-xf23d`)
    Sha1Hash:
      type: string
      pattern: ^[0-9a-f]{40}$
      description: SHA1 hash
    GitBranch:
      type: string
      minLength: 1
    Sha256Hash:
      type: string
      pattern: ^[A-Fa-f0-9]{64}$
      description: SHA256 hash
    ScreenshotUploadRequest:
      type: object
      properties:
        key:
          $ref: "#/components/schemas/Sha256Hash"
        contentType:
          description: Content type of the snapshot file
          type: string
      required:
        - key
        - contentType
      description: Screenshot file to upload
    UploadObjectRequest:
      type: object
      properties:
        Content-Type:
          type: string
          description: The `Content-Type` value from the `fields` returned by
            `createBuild` or `createMedia`. Must equal the content type the
            policy was signed for (the proxied analogue of S3 POST-object's `eq
            $Content-Type` condition), otherwise 400.
        policy:
          type: string
          description: "The opaque, HMAC-signed `policy` token from the same `fields`. It
            pins the destination key, content type, maximum size and expiry, and
            is the only authorization this route checks: missing, expired or
            wrongly signed is a 403, structurally malformed a 400. A policy
            works once: a second upload with it is a 409."
        file:
          type: string
          format: binary
          contentEncoding: binary
          description: The file bytes, sent as the last part. Between 1 byte (an empty
            file is a 400) and the maximum size pinned in the policy (a 413
            above it). The part's own Content-Type header is not checked.
      required:
        - Content-Type
        - policy
        - file
      description: "An S3 POST-object style form: the fields, then one file part named
        `file`. Before the file part, more than 20 fields or a value over 4096
        bytes is a 400, and so is a first file part with another name. Fields
        and extra file parts sent after the file part are ignored."
    StartMultipartUploadRequest:
      type: object
      properties:
        Content-Type:
          type: string
          description: The `Content-Type` value from the `upload.fields` returned by
            `createMedia`. Must equal the content type the policy was signed
            for, otherwise 400.
        policy:
          type: string
          maxLength: 4096
          description: "The signed `policy` from the same `upload.fields`. It is the only
            authorization: wrongly signed or expired is a 403, structurally
            malformed a 400."
        size:
          type: integer
          minimum: 1
          maximum: 9007199254740991
          description: Total size of the file in bytes. Must equal the `size` declared to
            `createMedia` (400 otherwise) and stay within the plan's maximum
            file size (413 above it).
      required:
        - Content-Type
        - policy
        - size
      description: The `upload.fields` returned by `createMedia`, plus the size of the file.
    CompleteMultipartUploadRequest:
      type: object
      properties:
        session:
          type: string
          minLength: 1
          maxLength: 4096
          description: The signed `session` token returned when the multipart upload was
            started.
        parts:
          maxItems: 10000
          type: array
          items:
            $ref: "#/components/schemas/UploadedMultipartPart"
          description: Every part response, in order from part 1 to `partCount`. A missing
            or out-of-order part is a 400.
      required:
        - session
        - parts
      description: Assemble the uploaded parts into the object.
    UploadedMultipartPart:
      type: object
      properties:
        partNumber:
          type: integer
          minimum: 1
          maximum: 9007199254740991
          description: 1-based number of the part.
        etag:
          type: string
          minLength: 1
          maxLength: 1024
          description: The part's ETag, as returned when it was uploaded.
        checksumCRC32:
          anyOf:
            - type: string
              maxLength: 1024
            - type: "null"
          description: The part's checksum, as returned when it was uploaded (`null` when
            the store computed none).
      required:
        - partNumber
        - etag
        - checksumCRC32
      description: One stored part. Send it back unchanged when completing the upload.
    AbortMultipartUploadRequest:
      type: object
      properties:
        session:
          type: string
          minLength: 1
          maxLength: 4096
          description: The signed `session` token returned when the multipart upload was
            started.
      required:
        - session
      description: Discard an unfinished multipart upload and its parts.
    BuildId:
      type: string
      description: A unique identifier for the build
      example: "12345"
    ScreenshotInput:
      type: object
      properties:
        key:
          type: string
          pattern: ^[A-Fa-f0-9]{64}$
        name:
          type: string
        baseName:
          description: "Name(s) to compare this screenshot against, instead of its own
            name. An array is tried in order: the first name that exists in the
            baseline wins, which lets a new screenshot fall back to an existing
            one."
          examples:
            - home.png
            - - home-variant-b.png
              - home.png
          anyOf:
            - anyOf:
                - type: string
                - minItems: 1
                  type: array
                  items:
                    type: string
            - type: "null"
        parentName:
          type:
            - string
            - "null"
        metadata:
          anyOf:
            - type: object
              properties:
                $schema:
                  description: Ignored. Can be set to get completions, validations and
                    documentation in some editors.
                  examples:
                    - https://api.snapvisor.io/v2/screenshot-metadata.json
                  type: string
                url:
                  description: The URL of the page that was screenshotted
                  type:
                    - string
                    - "null"
                previewUrl:
                  description: An URL to an accessible preview of the screenshot
                  type:
                    - string
                    - "null"
                viewport:
                  anyOf:
                    - type: object
                      properties:
                        width:
                          type: integer
                          minimum: 0
                          maximum: 9007199254740991
                          description: The width of the viewport
                        height:
                          type: integer
                          minimum: 0
                          maximum: 9007199254740991
                          description: The height of the viewport
                      required:
                        - width
                        - height
                      description: The viewport dimensions when the screenshot was taken
                    - type: "null"
                colorScheme:
                  description: The color scheme when the screenshot was taken
                  anyOf:
                    - type: string
                      enum:
                        - light
                        - dark
                    - type: "null"
                mediaType:
                  description: The media type when the screenshot was taken
                  anyOf:
                    - type: string
                      enum:
                        - screen
                        - print
                    - type: "null"
                test:
                  anyOf:
                    - type: object
                      properties:
                        id:
                          description: The unique identifier of the test
                          type:
                            - string
                            - "null"
                        title:
                          type: string
                          description: The title of the test
                        titlePath:
                          type: array
                          items:
                            type: string
                          description: The path of titles leading to the test
                        retries:
                          description: The number of retries for the test
                          anyOf:
                            - type: integer
                              minimum: 0
                              maximum: 9007199254740991
                            - type: "null"
                        retry:
                          description: The current retry count
                          anyOf:
                            - type: integer
                              minimum: 0
                              maximum: 9007199254740991
                            - type: "null"
                        repeat:
                          description: The repeat count for the test
                          anyOf:
                            - type: integer
                              minimum: 0
                              maximum: 9007199254740991
                            - type: "null"
                        location:
                          description: The location of the test in the source code
                          type: object
                          properties:
                            file:
                              type: string
                              description: The located file
                            line:
                              type: integer
                              minimum: 0
                              maximum: 9007199254740991
                              description: The line number in the file
                            column:
                              type: integer
                              minimum: 0
                              maximum: 9007199254740991
                              description: The column number in the file
                          required:
                            - file
                            - line
                            - column
                        annotations:
                          description: Annotations associated to the test
                          type: array
                          items:
                            type: object
                            properties:
                              type:
                                type: string
                                description: The type of annotation
                              description:
                                description: The description of the annotation
                                type: string
                              location:
                                description: The location of the annotation in the source code
                                type: object
                                properties:
                                  file:
                                    type: string
                                    description: The located file
                                  line:
                                    type: integer
                                    minimum: 0
                                    maximum: 9007199254740991
                                    description: The line number in the file
                                  column:
                                    type: integer
                                    minimum: 0
                                    maximum: 9007199254740991
                                    description: The column number in the file
                                required:
                                  - file
                                  - line
                                  - column
                            required:
                              - type
                            description: A test annotation
                        tags:
                          description: Tags associated to the test
                          type: array
                          items:
                            type: string
                      required:
                        - title
                        - titlePath
                      description: The test that generated the screenshot
                    - type: "null"
                browser:
                  anyOf:
                    - type: object
                      properties:
                        name:
                          type: string
                          description: The name of the browser
                        version:
                          type: string
                          description: The version of the browser
                      required:
                        - name
                        - version
                      description: The browser that generated the screenshot
                    - type: "null"
                automationLibrary:
                  type: object
                  properties:
                    name:
                      type: string
                      description: The name of the automation library
                    version:
                      type: string
                      description: The version of the automation library
                  required:
                    - name
                    - version
                  description: The automation library that generated the screenshot
                sdk:
                  type: object
                  properties:
                    name:
                      type: string
                      description: The name of the SDK
                    version:
                      type: string
                      description: The version of the SDK
                  required:
                    - name
                    - version
                  description: The SDK that generated the screenshot
                story:
                  description: Storybook story metadata
                  anyOf:
                    - type: object
                      properties:
                        id:
                          type: string
                          description: Unique ID of the story
                        tags:
                          description: Tags attached to the story
                          type: array
                          items:
                            type: string
                        mode:
                          description: Story mode
                          type: string
                        play:
                          description: True if the story has a play function
                          type: boolean
                      required:
                        - id
                      description: Storybook story metadata
                    - type: "null"
                tags:
                  description: Tags associated to the screenshot
                  type: array
                  items:
                    type: string
              required:
                - automationLibrary
                - sdk
              description: Metadata about a screenshot
            - type: "null"
        pwTraceKey:
          anyOf:
            - type: string
              pattern: ^[A-Fa-f0-9]{64}$
            - type: "null"
        threshold:
          anyOf:
            - type: number
              minimum: 0
              maximum: 1
            - type: "null"
        contentType:
          description: Content type of the snapshot file
          type: string
      required:
        - key
        - name
      description: Screenshot input
    BuildMetadata:
      description: Build metadata
      type: object
      properties:
        testReport:
          description: Test suite report
          type: object
          properties:
            status:
              type: string
              enum:
                - passed
                - failed
                - timedout
                - interrupted
              description: Status of the test suite
            stats:
              type: object
              properties:
                startTime:
                  description: Date when the test suite started
                  type: string
                duration:
                  description: Duration of the test suite in milliseconds
                  type: number
          required:
            - status
    SummaryCheck:
      type: string
      enum:
        - always
        - never
        - auto
      description: "When to post the summary check on a pull request: `always`,
        `never`, or `auto` (only once the project has a baseline)."
    ProjectUserLevel:
      type: string
      enum:
        - admin
        - reviewer
        - viewer
      description: Access level given to team members that are not explicit
        contributors on the project. `null` means they get no access.
    IgnoreConfig:
      type: object
      properties:
        enabled:
          type: boolean
          description: Whether changes can be ignored on this project.
        autoIgnore:
          anyOf:
            - type: object
              properties:
                changes:
                  type: integer
                  minimum: 1
                  maximum: 9007199254740991
                  description: Number of times a change must reappear before it is ignored
                    automatically.
              required:
                - changes
            - type: "null"
          description: Auto-ignore settings, `null` when auto-ignore is off.
      required:
        - enabled
        - autoIgnore
      description: How flaky changes are ignored on a project.
    DeploymentAuth:
      type: string
      enum:
        - public
        - domain-private
        - private
      description: "Who can reach the project's deployments: anyone (`public`), anyone
        with the domain (`domain-private`), or team members only (`private`,
        teams only)."
    AutomationEvent:
      type: string
      enum:
        - build.completed
        - build.reviewed
      description: An event an automation rule can react to.
    AutomationCondition:
      anyOf:
        - anyOf:
            - oneOf:
                - type: object
                  properties:
                    type:
                      type: string
                      const: build-branch
                    value:
                      type: string
                      minLength: 1
                  required:
                    - type
                    - value
                - type: object
                  properties:
                    type:
                      type: string
                      const: build-conclusion
                    value:
                      anyOf:
                        - type: string
                          enum:
                            - no-changes
                            - changes-detected
                        - type: "null"
                  required:
                    - type
                    - value
                - type: object
                  properties:
                    type:
                      type: string
                      const: build-mode
                    value:
                      anyOf:
                        - type: string
                          enum:
                            - ci
                            - monitoring
                        - type: "null"
                  required:
                    - type
                    - value
                - type: object
                  properties:
                    type:
                      type: string
                      const: build-name
                    value:
                      type: string
                      minLength: 1
                  required:
                    - type
                    - value
                - type: object
                  properties:
                    type:
                      type: string
                      const: build-type
                    value:
                      anyOf:
                        - type: string
                          enum:
                            - reference
                            - check
                            - orphan
                            - skipped
                        - type: "null"
                  required:
                    - type
                    - value
              type: object
            - type: object
              properties:
                glob:
                  type: object
                  properties:
                    type:
                      type: string
                      const: build-branch
                    value:
                      type: string
                      minLength: 1
                  required:
                    - type
                    - value
              required:
                - glob
        - type: object
          properties:
            not:
              anyOf:
                - oneOf:
                    - type: object
                      properties:
                        type:
                          type: string
                          const: build-branch
                        value:
                          type: string
                          minLength: 1
                      required:
                        - type
                        - value
                    - type: object
                      properties:
                        type:
                          type: string
                          const: build-conclusion
                        value:
                          anyOf:
                            - type: string
                              enum:
                                - no-changes
                                - changes-detected
                            - type: "null"
                      required:
                        - type
                        - value
                    - type: object
                      properties:
                        type:
                          type: string
                          const: build-mode
                        value:
                          anyOf:
                            - type: string
                              enum:
                                - ci
                                - monitoring
                            - type: "null"
                      required:
                        - type
                        - value
                    - type: object
                      properties:
                        type:
                          type: string
                          const: build-name
                        value:
                          type: string
                          minLength: 1
                      required:
                        - type
                        - value
                    - type: object
                      properties:
                        type:
                          type: string
                          const: build-type
                        value:
                          anyOf:
                            - type: string
                              enum:
                                - reference
                                - check
                                - orphan
                                - skipped
                            - type: "null"
                      required:
                        - type
                        - value
                  type: object
                - type: object
                  properties:
                    glob:
                      type: object
                      properties:
                        type:
                          type: string
                          const: build-branch
                        value:
                          type: string
                          minLength: 1
                      required:
                        - type
                        - value
                  required:
                    - glob
          required:
            - not
      description: "A condition narrowing when a rule fires. Conditions are combined
        with AND; wrap one in `{ not: … }` to negate it, or `{ glob: … }` to
        match a branch by pattern."
    AutomationActionInput:
      oneOf:
        - type: object
          properties:
            type:
              type: string
              const: sendSlackMessage
            payload:
              type: object
              properties:
                slackId:
                  default: ""
                  type: string
                  maxLength: 256
                name:
                  type: string
                  minLength: 1
                  maxLength: 256
              required:
                - name
          required:
            - type
            - payload
        - type: object
          properties:
            type:
              type: string
              const: sendMsTeamsMessage
            payload:
              type: object
              properties:
                webhookId:
                  type: string
                  minLength: 1
              required:
                - webhookId
          required:
            - type
            - payload
        - type: object
          properties:
            type:
              type: string
              const: sendDiscordMessage
            payload:
              type: object
              properties:
                webhookId:
                  type: string
                  minLength: 1
              required:
                - webhookId
          required:
            - type
            - payload
      description: An action to run. Slack channels are addressed by `slackId` when
        known, otherwise by `name`; Teams and Discord by the id of a webhook
        registered on the project's account.
      type: object
    BuildNumberParam:
      description: The build number
      example: 42
      type: string
    TestId:
      type: string
      description: The test identifier, as returned in a diff's `test.id`
      example: WEB-xf23d
    AccountDetails:
      type: object
      properties:
        id:
          type: string
        slug:
          type: string
          minLength: 1
        name:
          type:
            - string
            - "null"
        type:
          type: string
          enum:
            - user
            - team
        plan:
          anyOf:
            - type: object
              properties:
                name:
                  type: string
                includedScreenshots:
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
              required:
                - name
                - includedScreenshots
              additionalProperties: false
            - type: "null"
          description: The account's plan, `null` when it has none.
        periodStartDate:
          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"
          description: Start of the current billing period.
        periodEndDate:
          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"
          description: End of the current billing period.
        currentPeriodScreenshots:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: Screenshots used since the start of the current period.
        includedScreenshots:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: Screenshots included in the plan for a period.
        consumptionRatio:
          type: number
          description: Used screenshots over included screenshots. Above `1` the account
            is over its plan and pays for the extra.
        additionalScreenshotsCost:
          type: number
          description: Cost accrued so far this period for screenshots beyond the plan, in
            the subscription's currency.
        defaultUserLevel:
          anyOf:
            - $ref: "#/components/schemas/TeamDefaultUserLevel"
            - type: "null"
          description: Role given to users joining through the invite link or a verified
            domain. `null` on a personal account.
      required:
        - id
        - slug
        - name
        - type
        - plan
        - periodStartDate
        - periodEndDate
        - currentPeriodScreenshots
        - includedScreenshots
        - consumptionRatio
        - additionalScreenshotsCost
        - defaultUserLevel
      additionalProperties: false
      description: An account with its plan and current-period usage, to watch
        consumption against the plan.
    Error:
      type: object
      properties:
        error:
          type: string
        details:
          type: array
          items:
            type: object
            properties:
              message:
                type: string
            required:
              - message
            additionalProperties: false
      required:
        - error
      additionalProperties: false
      description: Error response
    AccountAnalytics:
      type: object
      properties:
        screenshots:
          type: object
          properties:
            series:
              type: array
              items:
                type: object
                properties:
                  total:
                    type: integer
                    minimum: -9007199254740991
                    maximum: 9007199254740991
                  projects:
                    type: object
                    propertyNames:
                      type: string
                    additionalProperties:
                      type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    description: Counts keyed by project ID. Use the sibling `projects` array to
                      resolve each project name.
                  ts:
                    type: integer
                    minimum: -9007199254740991
                    maximum: 9007199254740991
                    description: Unix timestamp in milliseconds at the start of the period.
                required:
                  - total
                  - projects
                  - ts
                additionalProperties: false
            all:
              type: object
              properties:
                total:
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
                projects:
                  type: object
                  propertyNames:
                    type: string
                  additionalProperties:
                    type: integer
                    minimum: -9007199254740991
                    maximum: 9007199254740991
                  description: Counts keyed by project ID. Use the sibling `projects` array to
                    resolve each project name.
              required:
                - total
                - projects
              additionalProperties: false
            projects:
              type: array
              items:
                type: object
                properties:
                  id:
                    type: string
                  name:
                    type: string
                    minLength: 1
                    maxLength: 100
                    pattern: ^[a-zA-Z0-9_\-.]+$
                required:
                  - id
                  - name
                additionalProperties: false
          required:
            - series
            - all
            - projects
          additionalProperties: false
        builds:
          type: object
          properties:
            series:
              type: array
              items:
                type: object
                properties:
                  total:
                    type: integer
                    minimum: -9007199254740991
                    maximum: 9007199254740991
                  projects:
                    type: object
                    propertyNames:
                      type: string
                    additionalProperties:
                      type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    description: Counts keyed by project ID. Use the sibling `projects` array to
                      resolve each project name.
                  changesDetected:
                    type: integer
                    minimum: -9007199254740991
                    maximum: 9007199254740991
                  noChanges:
                    type: integer
                    minimum: -9007199254740991
                    maximum: 9007199254740991
                  accepted:
                    type: integer
                    minimum: -9007199254740991
                    maximum: 9007199254740991
                  rejected:
                    type: integer
                    minimum: -9007199254740991
                    maximum: 9007199254740991
                  ts:
                    type: integer
                    minimum: -9007199254740991
                    maximum: 9007199254740991
                    description: Unix timestamp in milliseconds at the start of the period.
                required:
                  - total
                  - projects
                  - changesDetected
                  - noChanges
                  - accepted
                  - rejected
                  - ts
                additionalProperties: false
            all:
              type: object
              properties:
                total:
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
                projects:
                  type: object
                  propertyNames:
                    type: string
                  additionalProperties:
                    type: integer
                    minimum: -9007199254740991
                    maximum: 9007199254740991
                  description: Counts keyed by project ID. Use the sibling `projects` array to
                    resolve each project name.
                changesDetected:
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
                noChanges:
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
                accepted:
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
                rejected:
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
              required:
                - total
                - projects
                - changesDetected
                - noChanges
                - accepted
                - rejected
              additionalProperties: false
            projects:
              type: array
              items:
                type: object
                properties:
                  id:
                    type: string
                  name:
                    type: string
                    minLength: 1
                    maxLength: 100
                    pattern: ^[a-zA-Z0-9_\-.]+$
                required:
                  - id
                  - name
                additionalProperties: false
          required:
            - series
            - all
            - projects
          additionalProperties: false
      required:
        - screenshots
        - builds
      additionalProperties: false
    PageInfo:
      type: object
      properties:
        total:
          type: number
          description: Total number of items
        page:
          type: number
          description: Current page number
        perPage:
          type: number
          description: Number of items per page
      required:
        - total
        - page
        - perPage
      additionalProperties: false
      description: Page information
    Project:
      type: object
      properties:
        id:
          type: string
        account:
          $ref: "#/components/schemas/Account"
        name:
          type: string
          minLength: 1
        defaultBaseBranch:
          type: string
        hasRemoteContentAccess:
          type: boolean
        autoApprovedBranchGlob:
          type: string
          description: Glob matching the branches whose builds are approved automatically.
        deploymentProductionBranchGlob:
          type: string
          description: Glob matching the branches whose deployments are treated as
            production.
        private:
          type: boolean
          description: Whether the project is private. Resolved from the linked repository
            unless overridden.
        summaryCheck:
          $ref: "#/components/schemas/SummaryCheck"
        prCommentEnabled:
          type: boolean
          description: Whether the app comments on pull requests.
        githubActionsOidcEnabled:
          type: boolean
          description: Whether builds can authenticate with a GitHub Actions OIDC token
            instead of a project token.
        tokenlessAuthEnabled:
          type: boolean
          description: Whether builds from forked pull requests can be uploaded without a
            token.
        deploymentEnabled:
          type: boolean
          description: Whether deployments are served for this project.
        deploymentAuth:
          $ref: "#/components/schemas/DeploymentAuth"
        defaultUserLevel:
          anyOf:
            - $ref: "#/components/schemas/ProjectUserLevel"
            - type: "null"
        ignoreConfig:
          $ref: "#/components/schemas/IgnoreConfigOutput"
      required:
        - id
        - account
        - name
        - defaultBaseBranch
        - hasRemoteContentAccess
        - autoApprovedBranchGlob
        - deploymentProductionBranchGlob
        - private
        - summaryCheck
        - prCommentEnabled
        - githubActionsOidcEnabled
        - tokenlessAuthEnabled
        - deploymentEnabled
        - deploymentAuth
        - defaultUserLevel
        - ignoreConfig
      additionalProperties: false
      description: Project
    Account:
      type: object
      properties:
        id:
          type: string
        slug:
          type: string
          minLength: 1
      required:
        - id
        - slug
      additionalProperties: false
      description: Account
    TeamMember:
      type: object
      properties:
        id:
          type: string
          description: Identifier of the membership, not of the user.
        user:
          $ref: "#/components/schemas/User"
        level:
          $ref: "#/components/schemas/TeamUserLevel"
      required:
        - id
        - user
        - level
      additionalProperties: false
      description: A member of a team.
    User:
      type: object
      properties:
        id:
          type: string
        slug:
          type: string
        name:
          type:
            - string
            - "null"
      required:
        - id
        - slug
        - name
      additionalProperties: false
      description: A user.
    TeamInvite:
      type: object
      properties:
        id:
          type: string
        email:
          type: string
          format: email
          pattern: ^(?:[A-Za-z0-9_'+\-]+\.)*[A-Za-z0-9_'+\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
        level:
          $ref: "#/components/schemas/TeamUserLevel"
        createdAt:
          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:
          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))$
        expired:
          type: boolean
          description: Whether the invite is past its expiry date. Expired invites stay
            listed until they are cancelled or re-sent.
      required:
        - id
        - email
        - level
        - createdAt
        - expiresAt
        - expired
      additionalProperties: false
      description: A pending invitation to join a team.
    TeamDomain:
      type: object
      properties:
        domain:
          type: string
        createdAt:
          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))$
      required:
        - domain
        - createdAt
      additionalProperties: false
      description: "An email domain the team is open to: anyone signing up with a
        verified address on it joins automatically, at the team's default role."
    InviteLink:
      type: object
      properties:
        inviteLink:
          type: string
          format: uri
          description: The team's new shared invite link. Anyone with it joins at the
            team's default role.
      required:
        - inviteLink
      additionalProperties: false
    Media:
      type: object
      properties:
        id:
          type: string
          description: Unique identifier of the media
        name:
          type: string
          description: The media's name, and its identity within its pull request.
            Uploading the same name again adds a version.
        state:
          anyOf:
            - type: string
              enum:
                - before
                - after
              description: Which half of a before/after pair this media is, so the two can be
                shown side by side and compared. Inferred from a file name
                ending in `-before` or `-after`.
            - type: "null"
        description:
          description: Prose shown under the media in the pull request comment.
          type:
            - string
            - "null"
        stage:
          type: string
          enum:
            - staged
            - published
          description: "`staged` while the media is only attached to a branch, `published`
            once a pull request is attached and the media is listed in that pull
            request's comment. A media attached to neither is `staged`."
        branch:
          description: Branch this media was uploaded for. Kept after publishing, as a
            record of where it came from.
          type:
            - string
            - "null"
        prNumber:
          description: Pull request this media is published to, or `null` while it is
            staged.
          type:
            - number
            - "null"
        url:
          type: string
          format: uri
          description: Share page URL. This is the link to put in a pull request or a chat
            message, and it keeps working across versions — it always shows the
            newest one.
        markdown:
          type: string
          description: "Ready-to-paste Markdown: the picture — the image itself, or a
            video's poster frame — embedded from the CDN and linked to the share
            page. Embed this rather than building your own from `url`: that is
            an HTML page, and an image embed pointing at it renders as a broken
            image."
        version:
          type: number
          description: "Which version this response describes: 1 for a first upload,
            incrementing each time the same name is uploaded again."
        versionCount:
          type: number
          description: How many uploaded versions this media has. Above 1, `GET
            /media/{mediaId}/versions` lists them — which is how a comment's
            `mediaVersionId` resolves to the file it was written against.
        fileUrl:
          type: string
          format: uri
          description: URL of the image or video itself, for an agent that wants to look
            at it.
        posterUrl:
          anyOf:
            - type: string
              format: uri
            - type: "null"
          description: Poster frame of a video, derived by the image CDN. Always `null`
            for images.
        contentType:
          type: string
          description: Content type of the media
        sizeBytes:
          type: number
          description: Size of the media, in bytes
        width:
          description: Width, in pixels
          type:
            - number
            - "null"
        height:
          description: Height, in pixels
          type:
            - number
            - "null"
        visibility:
          type: string
          enum:
            - team
            - public
          description: Who can open the media share page. `team` requires a signed-in
            session with access to the owning account; `public` only requires
            the share URL.
        status:
          type: string
          enum:
            - pending
            - ready
          description: "`pending` until the bytes are uploaded, then `ready`. There is no
            processing step — Snapvisor serves the bytes it was given."
        expiresAt:
          description: When this version is deleted. Set from your plan's retention,
            counted from the upload rather than from the last view.
          type:
            - string
            - "null"
        createdAt:
          type: string
      required:
        - id
        - name
        - state
        - description
        - stage
        - branch
        - prNumber
        - url
        - markdown
        - version
        - versionCount
        - fileUrl
        - posterUrl
        - contentType
        - sizeBytes
        - width
        - height
        - visibility
        - status
        - expiresAt
        - createdAt
      additionalProperties: false
      description: A standalone image or video uploaded to Snapvisor
    MediaUploadTarget:
      type: object
      properties:
        url:
          type: string
          format: uri
          description: URL to POST the file to, as `multipart/form-data`.
        fields:
          type: object
          propertyNames:
            type: string
          additionalProperties:
            type: string
          description: Form fields that must be appended **before** the file part, in
            order, for the upload to be accepted.
        multipart:
          anyOf:
            - type: object
              properties:
                url:
                  type: string
                  format: uri
                  description: "URL to start the multipart upload at: `POST` it the `fields` above
                    plus the file's `size`, as JSON. Then `PUT` each part's raw
                    bytes to `{url}/parts/{partNumber}` with the returned
                    `session` in the `x-upload-session` header, and `POST` the
                    session and every part response, in order, to
                    `{url}/complete` (or the session to `{url}/abort`)."
                partSize:
                  type: number
                  description: "Bytes in every part but the last. A file larger than this must be
                    uploaded in parts: the single `POST` to `url` goes through
                    an edge that refuses request bodies over 100 MB."
              required:
                - url
                - partSize
              additionalProperties: false
            - type: "null"
          description: Where to upload a large file in parts instead, or `null` when `url`
            goes straight to the object store and takes the whole file in one
            request.
      required:
        - url
        - fields
        - multipart
      additionalProperties: false
      description: Signed upload target
    MediaVersion:
      type: object
      properties:
        id:
          type: string
          description: Unique identifier of this version — what a comment's
            `mediaVersionId` points at.
        number:
          type: number
          description: 1-based, and what the UI calls the version. Increments each time
            the same name is uploaded again.
        fileUrl:
          type: string
          format: uri
          description: URL of the image or video as it was at this version.
        posterUrl:
          anyOf:
            - type: string
              format: uri
            - type: "null"
          description: Poster frame of a video. Always `null` for images.
        contentType:
          type: string
        sizeBytes:
          type: number
        width:
          type:
            - number
            - "null"
        height:
          type:
            - number
            - "null"
        expiresAt:
          description: When this version is deleted. Retention applies per version, so an
            old one ages out while the media and its share URL live on.
          type:
            - string
            - "null"
        createdAt:
          type: string
      required:
        - id
        - number
        - fileUrl
        - posterUrl
        - contentType
        - sizeBytes
        - width
        - height
        - expiresAt
        - createdAt
      additionalProperties: false
      description: One uploaded version of a media
    Comment:
      type: object
      properties:
        id:
          type: string
          description: Public ID of the comment (e.g. `comment-xf23d`) — the one the app
            links to, and the one every endpoint taking a comment ID expects.
        buildId:
          description: Build this comment is posted on, null when it is posted on a test.
          type:
            - string
            - "null"
        testId:
          description: Test this comment is posted on, null when it is posted on a build.
          type:
            - string
            - "null"
        mediaId:
          description: Media this comment is posted on, null when it is posted on a build
            or a test.
          type:
            - string
            - "null"
        mediaVersionId:
          description: Version of the media the comment was written against. A pin
            describes a spot on the bytes its author was looking at, so feedback
            on an older upload has to be read against that upload — match this
            id against `GET /media/{mediaId}/versions` to get the right file.
          type:
            - string
            - "null"
        threadId:
          description: Root comment ID when this comment is a reply.
          type:
            - string
            - "null"
        body:
          description: Rich-text JSON content of the comment.
        text:
          type: string
          description: Plain-text rendering of the comment content.
        author:
          anyOf:
            - $ref: "#/components/schemas/User"
            - type: "null"
        agent:
          anyOf:
            - $ref: "#/components/schemas/Agent"
            - type: "null"
          description: The coding agent that posted the comment on the author's behalf.
            Null when the author posted it directly.
        screenshotDiffId:
          description: Screenshot diff this comment is anchored to, if any.
          type:
            - string
            - "null"
        anchor:
          anyOf:
            - oneOf:
                - type: object
                  properties:
                    type:
                      type: string
                      const: point
                    x:
                      type: number
                    y:
                      type: number
                  required:
                    - type
                    - x
                    - y
                  additionalProperties: false
                - type: object
                  properties:
                    type:
                      type: string
                      const: lines
                    from:
                      type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    to:
                      type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                  required:
                    - type
                    - from
                    - to
                  additionalProperties: false
              description: Where on the referenced screenshot diff the comment points. A point
                uses normalized (0–1) coordinates; lines is a 1-based inclusive
                range.
              type: object
            - type: "null"
          description: Where the comment points on its screenshot diff. Null means the
            whole diff.
        pending:
          type: boolean
          description: Whether the comment belongs to a pending (unsubmitted) review and
            is only visible to its author.
        resolvedAt:
          description: Date the thread was resolved, null if not resolved. Only set on a
            root comment.
          type:
            - string
            - "null"
        editedAt:
          description: Date the comment was last edited, null if never edited.
          type:
            - string
            - "null"
        createdAt:
          type: string
          description: Date the comment was posted.
        reactions:
          type: array
          items:
            type: object
            properties:
              emoji:
                type: string
                description: The emoji used for the reaction.
              count:
                type: number
                description: Number of users who reacted with this emoji.
              users:
                type: array
                items:
                  $ref: "#/components/schemas/User"
                description: The users who reacted with this emoji.
            required:
              - emoji
              - count
              - users
            additionalProperties: false
            description: Reactions of a single emoji on a comment.
      required:
        - id
        - buildId
        - testId
        - mediaId
        - mediaVersionId
        - threadId
        - body
        - text
        - author
        - agent
        - screenshotDiffId
        - anchor
        - pending
        - resolvedAt
        - editedAt
        - createdAt
        - reactions
      additionalProperties: false
      description: A comment posted on a build or on a test.
    Agent:
      type: object
      properties:
        id:
          type: string
          description: Stable id of the agent, e.g. `claude-code`. `unknown` when it could
            not be identified.
        name:
          description: Name to display, e.g. `Claude Code`. Null for an agent we cannot
            name.
          type:
            - string
            - "null"
      required:
        - id
        - name
      additionalProperties: false
      description: A coding agent acting on behalf of a user.
    Build:
      type: object
      properties:
        id:
          $ref: "#/components/schemas/BuildId"
        number:
          $ref: "#/components/schemas/BuildNumber"
        head:
          description: The head reference of the build
          $ref: "#/components/schemas/BuildGitReference"
        base:
          anyOf:
            - $ref: "#/components/schemas/BuildGitReference"
            - type: "null"
          description: The base reference of the build
        status:
          anyOf:
            - type: string
              enum:
                - accepted
                - rejected
            - type: string
              enum:
                - no-changes
                - changes-detected
            - type: string
              enum:
                - expired
                - pending
                - progress
                - error
                - aborted
          description: The status of the build
        conclusion:
          anyOf:
            - type: string
              enum:
                - no-changes
                - changes-detected
            - type: "null"
          description: The conclusion of the build
        stats:
          anyOf:
            - type: object
              properties:
                added:
                  type: number
                  description: Added snapshots
                removed:
                  type: number
                  description: Removed snapshots
                unchanged:
                  type: number
                  description: Unchanged snapshots
                changed:
                  type: number
                  description: Changed snapshots
                ignored:
                  type: number
                  description: Ignored snapshots
                failure:
                  type: number
                  description: Failure screenshots
                retryFailure:
                  type: number
                  description: Retry failure screenshots
                total:
                  type: number
                  description: Total number of snapshots
              required:
                - added
                - removed
                - unchanged
                - changed
                - ignored
                - failure
                - retryFailure
                - total
              additionalProperties: false
            - type: "null"
          description: Stats of the diffs present in the build
        metadata:
          anyOf:
            - type: object
              properties:
                testReport:
                  description: Test suite report
                  type: object
                  properties:
                    status:
                      type: string
                      enum:
                        - passed
                        - failed
                        - timedout
                        - interrupted
                      description: Status of the test suite
                    stats:
                      type: object
                      properties:
                        startTime:
                          description: Date when the test suite started
                          type: string
                        duration:
                          description: Duration of the test suite in milliseconds
                          type: number
                      additionalProperties: false
                  required:
                    - status
                  additionalProperties: false
              additionalProperties: false
              description: Metadata associated to the build
            - type: "null"
        url:
          type: string
          format: uri
          description: The URL of the build
        notification:
          anyOf:
            - type: object
              properties:
                description:
                  type: string
                context:
                  type: string
                github:
                  type: object
                  properties:
                    state:
                      type: string
                      enum:
                        - pending
                        - success
                        - error
                        - failure
                  required:
                    - state
                  additionalProperties: false
                gitlab:
                  type: object
                  properties:
                    state:
                      type: string
                      enum:
                        - pending
                        - running
                        - success
                        - failed
                        - canceled
                  required:
                    - state
                  additionalProperties: false
                origin:
                  type: object
                  properties:
                    status:
                      type: string
                      enum:
                        - queued
                        - in_progress
                        - completed
                    conclusion:
                      anyOf:
                        - type: string
                          enum:
                            - success
                            - failure
                        - type: "null"
                  required:
                    - status
                    - conclusion
                  additionalProperties: false
                url:
                  type: string
                  format: uri
              required:
                - description
                - context
                - github
                - gitlab
                - origin
                - url
              additionalProperties: false
            - type: "null"
          description: The notification payload for the build
      required:
        - id
        - number
        - head
        - base
        - status
        - conclusion
        - stats
        - metadata
        - url
        - notification
      additionalProperties: false
      description: Build
    BuildNumber:
      type: integer
      minimum: 1
      maximum: 9007199254740991
      description: The build number
      example: 42
    BuildGitReference:
      type: object
      properties:
        sha:
          description: The commit SHA
          $ref: "#/components/schemas/Sha1Hash"
        branch:
          type: string
          description: The branch name
      required:
        - sha
        - branch
      additionalProperties: false
      description: Git reference
    ImageDiffVerdict:
      type: object
      properties:
        changed:
          type: boolean
          description: True when Snapvisor would flag the pair as a visual change.
        score:
          type: number
          description: Share of the pixels that changed, 0 to 1, after the noise floors (0
            when unchanged).
        percentChanged:
          type: number
          description: "`score` as a percentage, two decimals."
        threshold:
          type: number
          description: The sensitivity used, 0 to 1 (lower finds more).
        width:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: Width of the canvas both images were compared on.
        height:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
        engine:
          type: string
          const: odiff
        docs:
          type: string
      required:
        - changed
        - score
        - percentChanged
        - threshold
        - width
        - height
        - engine
        - docs
      additionalProperties: false
    Problem:
      type: object
      properties:
        type:
          type: string
        title:
          type: string
        status:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
        detail:
          type: string
      required:
        - type
        - title
        - status
        - detail
      additionalProperties: false
      description: RFC 9457 problem details
    StartMultipartUploadResponse:
      type: object
      properties:
        session:
          type: string
          description: Signed token for this upload. Send it as the `x-upload-session`
            header on every part, and in the body of complete or abort.
        partSize:
          type: number
          description: Bytes in every part except the last, which holds the remainder.
        partCount:
          type: number
          description: How many parts the file must be sent in.
        expiresAt:
          type: string
          description: When the session stops accepting parts and completion.
      required:
        - session
        - partSize
        - partCount
        - expiresAt
      additionalProperties: false
      description: A started multipart upload
    Me:
      type: object
      properties:
        user:
          $ref: "#/components/schemas/MeUser"
        accounts:
          type: array
          items:
            $ref: "#/components/schemas/MeAccount"
        github:
          $ref: "#/components/schemas/MeGithub"
      required:
        - user
        - accounts
        - github
      additionalProperties: false
      description: Authenticated user, their accessible accounts, and GitHub linkage
    MeUser:
      type: object
      properties:
        id:
          type: string
        name:
          type:
            - string
            - "null"
        email:
          type:
            - string
            - "null"
      required:
        - id
        - name
        - email
      additionalProperties: false
      description: Authenticated user
    MeAccount:
      type: object
      properties:
        id:
          type: string
        slug:
          type: string
        name:
          type:
            - string
            - "null"
        type:
          type: string
          enum:
            - user
            - team
        mcpAccessIncluded:
          type: boolean
      required:
        - id
        - slug
        - name
        - type
        - mcpAccessIncluded
      additionalProperties: false
      description: Account visible to the authenticated user
    MeGithub:
      type: object
      properties:
        connected:
          type: boolean
        login:
          type:
            - string
            - "null"
      required:
        - connected
        - login
      additionalProperties: false
      description: GitHub linkage status for the authenticated user's account
    AccountDeletionRequest:
      type: object
      properties:
        requested:
          type: boolean
          const: true
          description: "Always `true`: the confirmation email was sent. Nothing is deleted
            until the link in it is opened."
      required:
        - requested
      additionalProperties: false
      description: The account deletion request was accepted
    AppStorePurchase:
      type: object
      properties:
        appUserId:
          type: string
          description: The RevenueCat app user id the purchase must be made under, so the
            store sale lands on this team.
        entitlement:
          type: string
          const: pro
          description: The entitlement the purchase grants.
        publicApiKey:
          type: string
          description: The RevenueCat public SDK key (appl_…) of the App Store app, for
            the app to configure the SDK with. Public by design; delivered here
            so it never ships in the app binary.
      required:
        - appUserId
        - entitlement
        - publicApiKey
      additionalProperties: false
      description: The team may buy Snapvisor Pro through the iOS app
    Device:
      type: object
      properties:
        token:
          type: string
        environment:
          type: string
          enum:
            - sandbox
            - production
      required:
        - token
        - environment
      additionalProperties: false
      description: A push device registered for the authenticated user
    AutomationRule:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        active:
          type: boolean
          description: Whether the rule still fires. Deactivated rules keep their run
            history.
        events:
          type: array
          items:
            $ref: "#/components/schemas/AutomationEvent"
        conditions:
          type: array
          items:
            $ref: "#/components/schemas/AutomationConditionOutput"
        actions:
          type: array
          items:
            type: object
            properties:
              action:
                type: string
              actionPayload:
                type: object
                propertyNames:
                  type: string
                additionalProperties: {}
            required:
              - action
              - actionPayload
            additionalProperties: false
          description: The actions as stored, with their targets already resolved (a Slack
            channel id, a webhook id).
        createdAt:
          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))$
        updatedAt:
          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))$
      required:
        - id
        - name
        - active
        - events
        - conditions
        - actions
        - createdAt
        - updatedAt
      additionalProperties: false
      description: A rule that runs actions when a build event matches its conditions.
    ProjectContributor:
      type: object
      properties:
        id:
          type: string
          description: Identifier of the grant, not of the user.
        user:
          $ref: "#/components/schemas/User"
        level:
          $ref: "#/components/schemas/ProjectUserLevel"
      required:
        - id
        - user
        - level
      additionalProperties: false
      description: A contributor explicitly granted access to a project. Team owners
        and members reach every project without appearing here.
    SnapshotDiff:
      type: object
      properties:
        id:
          type: string
          description: Unique identifier of the snapshot diff
        name:
          type: string
          description: Name of the snapshot diff
        status:
          type: string
          enum:
            - pending
            - removed
            - failure
            - added
            - changed
            - unchanged
            - retryFailure
            - ignored
          description: Status of the snapshot diff
        score:
          description: Similarity score between snapshots
          type:
            - number
            - "null"
        group:
          description: Grouping key for the snapshot diff
          type:
            - string
            - "null"
        parentName:
          description: Parent name of the snapshot (usually the story id)
          type:
            - string
            - "null"
        url:
          anyOf:
            - type: string
              format: uri
            - type: "null"
          description: URL of the diff image
        base:
          anyOf:
            - type: object
              properties:
                id:
                  type: string
                  description: Unique identifier of the snapshot
                name:
                  type: string
                  description: Name of the snapshot
                metadata:
                  anyOf:
                    - type: object
                      properties:
                        $schema:
                          description: Ignored. Can be set to get completions, validations and
                            documentation in some editors.
                          examples:
                            - https://api.snapvisor.io/v2/screenshot-metadata.json
                          type: string
                        url:
                          description: The URL of the page that was screenshotted
                          type:
                            - string
                            - "null"
                        previewUrl:
                          description: An URL to an accessible preview of the screenshot
                          type:
                            - string
                            - "null"
                        viewport:
                          anyOf:
                            - type: object
                              properties:
                                width:
                                  type: integer
                                  minimum: 0
                                  maximum: 9007199254740991
                                  description: The width of the viewport
                                height:
                                  type: integer
                                  minimum: 0
                                  maximum: 9007199254740991
                                  description: The height of the viewport
                              required:
                                - width
                                - height
                              additionalProperties: false
                              description: The viewport dimensions when the screenshot was taken
                            - type: "null"
                        colorScheme:
                          description: The color scheme when the screenshot was taken
                          anyOf:
                            - type: string
                              enum:
                                - light
                                - dark
                            - type: "null"
                        mediaType:
                          description: The media type when the screenshot was taken
                          anyOf:
                            - type: string
                              enum:
                                - screen
                                - print
                            - type: "null"
                        test:
                          anyOf:
                            - type: object
                              properties:
                                id:
                                  description: The unique identifier of the test
                                  type:
                                    - string
                                    - "null"
                                title:
                                  type: string
                                  description: The title of the test
                                titlePath:
                                  type: array
                                  items:
                                    type: string
                                  description: The path of titles leading to the test
                                retries:
                                  description: The number of retries for the test
                                  anyOf:
                                    - type: integer
                                      minimum: 0
                                      maximum: 9007199254740991
                                    - type: "null"
                                retry:
                                  description: The current retry count
                                  anyOf:
                                    - type: integer
                                      minimum: 0
                                      maximum: 9007199254740991
                                    - type: "null"
                                repeat:
                                  description: The repeat count for the test
                                  anyOf:
                                    - type: integer
                                      minimum: 0
                                      maximum: 9007199254740991
                                    - type: "null"
                                location:
                                  description: The location of the test in the source code
                                  type: object
                                  properties:
                                    file:
                                      type: string
                                      description: The located file
                                    line:
                                      type: integer
                                      minimum: 0
                                      maximum: 9007199254740991
                                      description: The line number in the file
                                    column:
                                      type: integer
                                      minimum: 0
                                      maximum: 9007199254740991
                                      description: The column number in the file
                                  required:
                                    - file
                                    - line
                                    - column
                                  additionalProperties: false
                                annotations:
                                  description: Annotations associated to the test
                                  type: array
                                  items:
                                    type: object
                                    properties:
                                      type:
                                        type: string
                                        description: The type of annotation
                                      description:
                                        description: The description of the annotation
                                        type: string
                                      location:
                                        description: The location of the annotation in the source code
                                        type: object
                                        properties:
                                          file:
                                            type: string
                                            description: The located file
                                          line:
                                            type: integer
                                            minimum: 0
                                            maximum: 9007199254740991
                                            description: The line number in the file
                                          column:
                                            type: integer
                                            minimum: 0
                                            maximum: 9007199254740991
                                            description: The column number in the file
                                        required:
                                          - file
                                          - line
                                          - column
                                        additionalProperties: false
                                    required:
                                      - type
                                    additionalProperties: false
                                    description: A test annotation
                                tags:
                                  description: Tags associated to the test
                                  type: array
                                  items:
                                    type: string
                              required:
                                - title
                                - titlePath
                              additionalProperties: false
                              description: The test that generated the screenshot
                            - type: "null"
                        browser:
                          anyOf:
                            - type: object
                              properties:
                                name:
                                  type: string
                                  description: The name of the browser
                                version:
                                  type: string
                                  description: The version of the browser
                              required:
                                - name
                                - version
                              additionalProperties: false
                              description: The browser that generated the screenshot
                            - type: "null"
                        automationLibrary:
                          type: object
                          properties:
                            name:
                              type: string
                              description: The name of the automation library
                            version:
                              type: string
                              description: The version of the automation library
                          required:
                            - name
                            - version
                          additionalProperties: false
                          description: The automation library that generated the screenshot
                        sdk:
                          type: object
                          properties:
                            name:
                              type: string
                              description: The name of the SDK
                            version:
                              type: string
                              description: The version of the SDK
                          required:
                            - name
                            - version
                          additionalProperties: false
                          description: The SDK that generated the screenshot
                        story:
                          description: Storybook story metadata
                          anyOf:
                            - type: object
                              properties:
                                id:
                                  type: string
                                  description: Unique ID of the story
                                tags:
                                  description: Tags attached to the story
                                  type: array
                                  items:
                                    type: string
                                mode:
                                  description: Story mode
                                  type: string
                                play:
                                  description: True if the story has a play function
                                  type: boolean
                              required:
                                - id
                              additionalProperties: false
                              description: Storybook story metadata
                            - type: "null"
                        tags:
                          description: Tags associated to the screenshot
                          type: array
                          items:
                            type: string
                      required:
                        - automationLibrary
                        - sdk
                      additionalProperties: false
                      description: Metadata about a screenshot
                    - type: "null"
                width:
                  description: Width of the screenshot in pixels
                  type:
                    - number
                    - "null"
                height:
                  description: Height of the screenshot in pixels
                  type:
                    - number
                    - "null"
                url:
                  type: string
                  format: uri
                  description: Public URL of the snapshot
                contentType:
                  type: string
                  description: Content type of the snapshot file
              required:
                - id
                - name
                - metadata
                - width
                - height
                - url
                - contentType
              additionalProperties: false
              description: Snapshot associated to a diff
            - type: "null"
        head:
          anyOf:
            - type: object
              properties:
                id:
                  type: string
                  description: Unique identifier of the snapshot
                name:
                  type: string
                  description: Name of the snapshot
                metadata:
                  anyOf:
                    - type: object
                      properties:
                        $schema:
                          description: Ignored. Can be set to get completions, validations and
                            documentation in some editors.
                          examples:
                            - https://api.snapvisor.io/v2/screenshot-metadata.json
                          type: string
                        url:
                          description: The URL of the page that was screenshotted
                          type:
                            - string
                            - "null"
                        previewUrl:
                          description: An URL to an accessible preview of the screenshot
                          type:
                            - string
                            - "null"
                        viewport:
                          anyOf:
                            - type: object
                              properties:
                                width:
                                  type: integer
                                  minimum: 0
                                  maximum: 9007199254740991
                                  description: The width of the viewport
                                height:
                                  type: integer
                                  minimum: 0
                                  maximum: 9007199254740991
                                  description: The height of the viewport
                              required:
                                - width
                                - height
                              additionalProperties: false
                              description: The viewport dimensions when the screenshot was taken
                            - type: "null"
                        colorScheme:
                          description: The color scheme when the screenshot was taken
                          anyOf:
                            - type: string
                              enum:
                                - light
                                - dark
                            - type: "null"
                        mediaType:
                          description: The media type when the screenshot was taken
                          anyOf:
                            - type: string
                              enum:
                                - screen
                                - print
                            - type: "null"
                        test:
                          anyOf:
                            - type: object
                              properties:
                                id:
                                  description: The unique identifier of the test
                                  type:
                                    - string
                                    - "null"
                                title:
                                  type: string
                                  description: The title of the test
                                titlePath:
                                  type: array
                                  items:
                                    type: string
                                  description: The path of titles leading to the test
                                retries:
                                  description: The number of retries for the test
                                  anyOf:
                                    - type: integer
                                      minimum: 0
                                      maximum: 9007199254740991
                                    - type: "null"
                                retry:
                                  description: The current retry count
                                  anyOf:
                                    - type: integer
                                      minimum: 0
                                      maximum: 9007199254740991
                                    - type: "null"
                                repeat:
                                  description: The repeat count for the test
                                  anyOf:
                                    - type: integer
                                      minimum: 0
                                      maximum: 9007199254740991
                                    - type: "null"
                                location:
                                  description: The location of the test in the source code
                                  type: object
                                  properties:
                                    file:
                                      type: string
                                      description: The located file
                                    line:
                                      type: integer
                                      minimum: 0
                                      maximum: 9007199254740991
                                      description: The line number in the file
                                    column:
                                      type: integer
                                      minimum: 0
                                      maximum: 9007199254740991
                                      description: The column number in the file
                                  required:
                                    - file
                                    - line
                                    - column
                                  additionalProperties: false
                                annotations:
                                  description: Annotations associated to the test
                                  type: array
                                  items:
                                    type: object
                                    properties:
                                      type:
                                        type: string
                                        description: The type of annotation
                                      description:
                                        description: The description of the annotation
                                        type: string
                                      location:
                                        description: The location of the annotation in the source code
                                        type: object
                                        properties:
                                          file:
                                            type: string
                                            description: The located file
                                          line:
                                            type: integer
                                            minimum: 0
                                            maximum: 9007199254740991
                                            description: The line number in the file
                                          column:
                                            type: integer
                                            minimum: 0
                                            maximum: 9007199254740991
                                            description: The column number in the file
                                        required:
                                          - file
                                          - line
                                          - column
                                        additionalProperties: false
                                    required:
                                      - type
                                    additionalProperties: false
                                    description: A test annotation
                                tags:
                                  description: Tags associated to the test
                                  type: array
                                  items:
                                    type: string
                              required:
                                - title
                                - titlePath
                              additionalProperties: false
                              description: The test that generated the screenshot
                            - type: "null"
                        browser:
                          anyOf:
                            - type: object
                              properties:
                                name:
                                  type: string
                                  description: The name of the browser
                                version:
                                  type: string
                                  description: The version of the browser
                              required:
                                - name
                                - version
                              additionalProperties: false
                              description: The browser that generated the screenshot
                            - type: "null"
                        automationLibrary:
                          type: object
                          properties:
                            name:
                              type: string
                              description: The name of the automation library
                            version:
                              type: string
                              description: The version of the automation library
                          required:
                            - name
                            - version
                          additionalProperties: false
                          description: The automation library that generated the screenshot
                        sdk:
                          type: object
                          properties:
                            name:
                              type: string
                              description: The name of the SDK
                            version:
                              type: string
                              description: The version of the SDK
                          required:
                            - name
                            - version
                          additionalProperties: false
                          description: The SDK that generated the screenshot
                        story:
                          description: Storybook story metadata
                          anyOf:
                            - type: object
                              properties:
                                id:
                                  type: string
                                  description: Unique ID of the story
                                tags:
                                  description: Tags attached to the story
                                  type: array
                                  items:
                                    type: string
                                mode:
                                  description: Story mode
                                  type: string
                                play:
                                  description: True if the story has a play function
                                  type: boolean
                              required:
                                - id
                              additionalProperties: false
                              description: Storybook story metadata
                            - type: "null"
                        tags:
                          description: Tags associated to the screenshot
                          type: array
                          items:
                            type: string
                      required:
                        - automationLibrary
                        - sdk
                      additionalProperties: false
                      description: Metadata about a screenshot
                    - type: "null"
                width:
                  description: Width of the screenshot in pixels
                  type:
                    - number
                    - "null"
                height:
                  description: Height of the screenshot in pixels
                  type:
                    - number
                    - "null"
                url:
                  type: string
                  format: uri
                  description: Public URL of the snapshot
                contentType:
                  type: string
                  description: Content type of the snapshot file
              required:
                - id
                - name
                - metadata
                - width
                - height
                - url
                - contentType
              additionalProperties: false
              description: Snapshot associated to a diff
            - type: "null"
        test:
          anyOf:
            - $ref: "#/components/schemas/Test"
            - type: "null"
        change:
          anyOf:
            - type: object
              properties:
                id:
                  type: string
                  description: Unique identifier of the change (a test + fingerprint pair). Use it
                    with the ignore/unignore endpoints.
                ignored:
                  type: boolean
                  description: Whether this change is currently ignored. Ignored changes no longer
                    require review and are automatically approved.
                occurrences:
                  type: number
                  description: Number of times this change has been seen over the metrics period.
                    A high count for a recurring change is a strong flakiness
                    signal.
              required:
                - id
                - ignored
                - occurrences
              additionalProperties: false
            - type: "null"
      required:
        - id
        - name
        - status
        - score
        - group
        - parentName
        - url
        - base
        - head
        - test
        - change
      additionalProperties: false
      description: Snapshot diff
    Test:
      type: object
      properties:
        id:
          type: string
          description: Unique identifier of the test
        name:
          type: string
          description: Name of the test
        buildName:
          type: string
          description: Name of the build the test belongs to
        metrics:
          $ref: "#/components/schemas/TestMetrics"
      required:
        - id
        - name
        - buildName
        - metrics
      additionalProperties: false
      description: Test associated to a diff, with flakiness metrics to help decide
        whether a change is worth reviewing.
    TestMetrics:
      type: object
      properties:
        total:
          type: number
          description: Number of builds in which this test ran over the metrics period.
        changes:
          type: number
          description: Number of times the test changed (produced a diff) over the metrics
            period.
        uniqueChanges:
          type: number
          description: Number of changes that were seen only once over the metrics period.
            A high ratio of unique changes is a strong flakiness signal.
        stability:
          type: number
          description: Ratio of builds without a change, between 0 and 1. `1` means the
            test never changed.
        consistency:
          type: number
          description: How consistent the changes are, between 0 and 1. `1` means changes
            repeat the same way; a low value means changes are erratic.
        flakiness:
          type: number
          description: Overall flakiness score between 0 and 1, derived from stability and
            consistency. `0` means stable, `1` means highly flaky.
      required:
        - total
        - changes
        - uniqueChanges
        - stability
        - consistency
        - flakiness
      additionalProperties: false
      description: Flakiness metrics of a test over the requested period.
    Change:
      type: object
      properties:
        id:
          type: string
          description: Unique identifier of the change (a test + fingerprint pair). Use it
            with the ignore/unignore endpoints.
        ignored:
          type: boolean
          description: Whether this change is currently ignored. Ignored changes no longer
            require review and are automatically approved.
        occurrences:
          type: number
          description: Number of times this change has been seen over the metrics period.
            A high count for a recurring change is a strong flakiness signal.
      required:
        - id
        - ignored
        - occurrences
      additionalProperties: false
      description: "A test change: a specific visual difference (fingerprint) of a
        test that can be ignored to silence flaky changes."
    BuildReview:
      type: object
      properties:
        id:
          type: string
        buildId:
          type: string
        state:
          type: string
          enum:
            - approved
            - rejected
            - commented
            - pending
        user:
          anyOf:
            - $ref: "#/components/schemas/BuildReviewUser"
            - type: "null"
          description: The user who submitted the review.
        dismissedAt:
          description: Date the review was dismissed, null if not dismissed.
          type:
            - string
            - "null"
        dismissedBy:
          anyOf:
            - $ref: "#/components/schemas/BuildReviewUser"
            - type: "null"
          description: The user who dismissed the review, if any.
        agent:
          anyOf:
            - $ref: "#/components/schemas/Agent"
            - type: "null"
          description: The coding agent that submitted the review on the reviewer's
            behalf. Null when they submitted it themselves.
        date:
          type: string
          description: Date the review was created.
      required:
        - id
        - buildId
        - state
        - user
        - dismissedAt
        - dismissedBy
        - agent
        - date
      additionalProperties: false
      description: Build review
    BuildReviewUser:
      type: object
      properties:
        id:
          type: string
        slug:
          type: string
        name:
          type:
            - string
            - "null"
      required:
        - id
        - slug
        - name
      additionalProperties: false
      description: A user
    PrContext:
      anyOf:
        - type: object
          properties:
            number:
              type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            title:
              type: string
            body:
              type:
                - string
                - "null"
            state:
              type: string
            url:
              type: string
            changedFiles:
              type: array
              items:
                $ref: "#/components/schemas/PrContextChangedFile"
          required:
            - number
            - title
            - body
            - state
            - url
            - changedFiles
          additionalProperties: false
        - type: "null"
      description: GitHub PR associated with the commit, or null if the commit isn't
        part of any PR.
    PrContextChangedFile:
      type: object
      properties:
        filename:
          type: string
        status:
          type: string
        additions:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
        deletions:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
      required:
        - filename
        - status
        - additions
        - deletions
      additionalProperties: false
    BuildReviewers:
      type: object
      properties:
        reviewers:
          type: array
          items:
            $ref: "#/components/schemas/User"
          description: The users currently requested to review the build.
      required:
        - reviewers
      additionalProperties: false
      description: The review requests standing on a build.
    NotificationSubscription:
      type: object
      properties:
        subscribed:
          type: boolean
          description: Whether the authenticated user now receives notifications for this
            resource.
      required:
        - subscribed
      additionalProperties: false
      description: A notification subscription.
    TestSummary:
      description: A test with its flakiness metrics over the requested period. Fetch
        the test itself for its history and the changes behind the score.
      $ref: "#/components/schemas/Test"
    ProjectDomain:
      type: object
      properties:
        domain:
          description: The project's production deployment domain, `null` when deployments
            are disabled or no domain is set.
          type:
            - string
            - "null"
      required:
        - domain
      additionalProperties: false
      description: A project's production deployment domain.
    IgnoredChange:
      type: object
      properties:
        id:
          type: string
          description: Identifier of the ignored change, accepted by the unignore endpoint.
        test:
          type: object
          properties:
            id:
              type: string
            name:
              type: string
            buildName:
              type: string
          required:
            - id
            - name
            - buildName
          additionalProperties: false
          description: The test the ignored change belongs to.
      required:
        - id
        - test
      additionalProperties: false
      description: "A change currently ignored in a project: it no longer requires
        review and is approved automatically."
    TestDetails:
      type: object
      properties:
        id:
          type: string
          description: Unique identifier of the test
        name:
          type: string
          description: Name of the test
        buildName:
          type: string
          description: Name of the build the test belongs to
        metrics:
          $ref: "#/components/schemas/TestMetrics"
        status:
          $ref: "#/components/schemas/TestStatus"
        createdAt:
          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))$
          description: When Snapvisor first saw this test.
        url:
          type: string
          format: uri
          description: URL of the test in Snapvisor.
        series:
          type: array
          items:
            $ref: "#/components/schemas/TestMetricsDataPoint"
          description: The test's metrics bucketed over the requested period, oldest
            first. Use it to tell a test that has always been flaky from one
            that only started recently.
        firstSeenChange:
          anyOf:
            - $ref: "#/components/schemas/TestChangeOccurrence"
            - type: "null"
          description: The first time this test ever changed, whatever the period. Null
            when it never changed.
        lastSeenChange:
          anyOf:
            - $ref: "#/components/schemas/TestChangeOccurrence"
            - type: "null"
          description: The last time this test changed, whatever the period. Null when it
            never changed.
      required:
        - id
        - name
        - buildName
        - metrics
        - status
        - createdAt
        - url
        - series
        - firstSeenChange
        - lastSeenChange
      additionalProperties: false
      description: A test with its flakiness metrics, both aggregated and over time,
        and when it first and last changed.
    TestStatus:
      type: string
      enum:
        - ongoing
        - removed
      description: "`ongoing` when the test still runs — it showed up in the latest
        build of its build name. `removed` when it did not, so it was deleted,
        renamed or skipped."
    TestMetricsDataPoint:
      type: object
      properties:
        date:
          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))$
          description: Start of the time bucket.
        total:
          type: number
          description: Number of builds in which the test ran in this bucket.
        changes:
          type: number
          description: Number of times the test changed in this bucket.
        uniqueChanges:
          type: number
          description: Number of those changes that were seen only once.
      required:
        - date
        - total
        - changes
        - uniqueChanges
      additionalProperties: false
      description: One bucket of a test's metrics over time. The bucket size is
        derived from the requested period.
    TestChangeOccurrence:
      type: object
      properties:
        date:
          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))$
          description: When the diff was captured.
        url:
          anyOf:
            - type: string
              format: uri
            - type: "null"
          description: Public URL of the diff image. Null when the image is no longer
            available.
        buildNumber:
          type: integer
          minimum: 1
          maximum: 9007199254740991
          description: Number of the build that captured the diff.
          example: 42
        buildUrl:
          type: string
          format: uri
          description: URL of that build in Snapvisor.
      required:
        - date
        - url
        - buildNumber
        - buildUrl
      additionalProperties: false
      description: A single appearance of a change, in the build that saw it.
    TestChange:
      type: object
      properties:
        id:
          type: string
          description: Unique identifier of the change (a test + fingerprint pair). Use it
            with the ignore/unignore endpoints.
        ignored:
          type: boolean
          description: Whether this change is currently ignored. Ignored changes no longer
            require review and are automatically approved.
        occurrences:
          type: number
          description: Number of times this change has been seen over the metrics period.
            A high count for a recurring change is a strong flakiness signal.
        firstSeen:
          description: The first time this change was seen over the period.
          $ref: "#/components/schemas/TestChangeOccurrence"
        lastSeen:
          description: The last time this change was seen over the period.
          $ref: "#/components/schemas/TestChangeOccurrence"
        diff:
          description: The diff captured the last time the change was seen, with the
            baseline and the captured snapshot, so you can look at what moved.
          $ref: "#/components/schemas/SnapshotDiff"
      required:
        - id
        - ignored
        - occurrences
        - firstSeen
        - lastSeen
        - diff
      additionalProperties: false
      description: "One distinct change of a test: an exact visual difference, with
        how often it came back over the period. A change that keeps reappearing
        while nothing in the UI changed is a flaky one."
    IgnoreConfigOutput:
      type: object
      properties:
        enabled:
          type: boolean
          description: Whether changes can be ignored on this project.
        autoIgnore:
          anyOf:
            - type: object
              properties:
                changes:
                  type: integer
                  minimum: 1
                  maximum: 9007199254740991
                  description: Number of times a change must reappear before it is ignored
                    automatically.
              required:
                - changes
              additionalProperties: false
            - type: "null"
          description: Auto-ignore settings, `null` when auto-ignore is off.
      required:
        - enabled
        - autoIgnore
      additionalProperties: false
      description: How flaky changes are ignored on a project.
    UploadedMultipartPartOutput:
      type: object
      properties:
        partNumber:
          type: integer
          minimum: 1
          maximum: 9007199254740991
          description: 1-based number of the part.
        etag:
          type: string
          minLength: 1
          maxLength: 1024
          description: The part's ETag, as returned when it was uploaded.
        checksumCRC32:
          anyOf:
            - type: string
              maxLength: 1024
            - type: "null"
          description: The part's checksum, as returned when it was uploaded (`null` when
            the store computed none).
      required:
        - partNumber
        - etag
        - checksumCRC32
      additionalProperties: false
      description: One stored part. Send it back unchanged when completing the upload.
    AutomationConditionOutput:
      anyOf:
        - anyOf:
            - oneOf:
                - type: object
                  properties:
                    type:
                      type: string
                      const: build-branch
                    value:
                      type: string
                      minLength: 1
                  required:
                    - type
                    - value
                  additionalProperties: false
                - type: object
                  properties:
                    type:
                      type: string
                      const: build-conclusion
                    value:
                      anyOf:
                        - type: string
                          enum:
                            - no-changes
                            - changes-detected
                        - type: "null"
                  required:
                    - type
                    - value
                  additionalProperties: false
                - type: object
                  properties:
                    type:
                      type: string
                      const: build-mode
                    value:
                      anyOf:
                        - type: string
                          enum:
                            - ci
                            - monitoring
                        - type: "null"
                  required:
                    - type
                    - value
                  additionalProperties: false
                - type: object
                  properties:
                    type:
                      type: string
                      const: build-name
                    value:
                      type: string
                      minLength: 1
                  required:
                    - type
                    - value
                  additionalProperties: false
                - type: object
                  properties:
                    type:
                      type: string
                      const: build-type
                    value:
                      anyOf:
                        - type: string
                          enum:
                            - reference
                            - check
                            - orphan
                            - skipped
                        - type: "null"
                  required:
                    - type
                    - value
                  additionalProperties: false
              type: object
            - type: object
              properties:
                glob:
                  type: object
                  properties:
                    type:
                      type: string
                      const: build-branch
                    value:
                      type: string
                      minLength: 1
                  required:
                    - type
                    - value
                  additionalProperties: false
              required:
                - glob
              additionalProperties: false
        - type: object
          properties:
            not:
              anyOf:
                - oneOf:
                    - type: object
                      properties:
                        type:
                          type: string
                          const: build-branch
                        value:
                          type: string
                          minLength: 1
                      required:
                        - type
                        - value
                      additionalProperties: false
                    - type: object
                      properties:
                        type:
                          type: string
                          const: build-conclusion
                        value:
                          anyOf:
                            - type: string
                              enum:
                                - no-changes
                                - changes-detected
                            - type: "null"
                      required:
                        - type
                        - value
                      additionalProperties: false
                    - type: object
                      properties:
                        type:
                          type: string
                          const: build-mode
                        value:
                          anyOf:
                            - type: string
                              enum:
                                - ci
                                - monitoring
                            - type: "null"
                      required:
                        - type
                        - value
                      additionalProperties: false
                    - type: object
                      properties:
                        type:
                          type: string
                          const: build-name
                        value:
                          type: string
                          minLength: 1
                      required:
                        - type
                        - value
                      additionalProperties: false
                    - type: object
                      properties:
                        type:
                          type: string
                          const: build-type
                        value:
                          anyOf:
                            - type: string
                              enum:
                                - reference
                                - check
                                - orphan
                                - skipped
                            - type: "null"
                      required:
                        - type
                        - value
                      additionalProperties: false
                  type: object
                - type: object
                  properties:
                    glob:
                      type: object
                      properties:
                        type:
                          type: string
                          const: build-branch
                        value:
                          type: string
                          minLength: 1
                      required:
                        - type
                        - value
                      additionalProperties: false
                  required:
                    - glob
                  additionalProperties: false
          required:
            - not
          additionalProperties: false
      description: "A condition narrowing when a rule fires. Conditions are combined
        with AND; wrap one in `{ not: … }` to negate it, or `{ glob: … }` to
        match a branch by pattern."
  securitySchemes:
    projectToken:
      type: http
      scheme: bearer
      bearerFormat: Project Token
      description: |-
        Authenticate as a **project** with a project token.

        Send it as a bearer token in the `Authorization` header:

        ```http
        Authorization: Bearer <project-token>
        ```

        You can find your project token in your Snapvisor project settings.
        Project tokens are used by CI and the SDK to create builds and
        deployments.
    personalAccessToken:
      type: http
      scheme: bearer
      bearerFormat: Personal Access Token
      description: |-
        Authenticate as a **user** with a personal access token.

        Send it as a bearer token in the `Authorization` header:

        ```http
        Authorization: Bearer <personal-access-token>
        ```

        Personal access tokens act on behalf of the user that created them
        and are required by endpoints that perform user actions, such as
        reviewing builds and posting comments.
    oauth2:
      type: oauth2
      description: |-
        Authenticate as a **user** via an OAuth 2.1 access token obtained
        through the authorization-code (+ PKCE) flow. Used by the CLI and by
        MCP clients/agents. The token acts on behalf of the authorizing user,
        limited to the granted scopes and organizations.
      flows:
        authorizationCode:
          authorizationUrl: https://app.snapvisor.io/oauth/authorize
          tokenUrl: https://app.snapvisor.io/oauth/token
          refreshUrl: https://app.snapvisor.io/oauth/token
          scopes:
            profile: Read your Snapvisor profile and the list of teams you belong to.
            projects:read: Read your projects, builds, screenshots, diffs, tests, and
              analytics.
            projects:write: Create and configure projects and their settings.
            builds:write: Create and upload builds and screenshots.
            reviews:write: Approve, reject, or dismiss build reviews and ignore changes.
            comments:read: Read build comments and threads.
            comments:write: Post, edit, and delete comments, add reactions, and manage
              subscriptions.
            media:read: Read the images and videos uploaded to your teams.
            media:write: Upload images and videos, and delete the ones already uploaded.
            account:admin: Manage organization settings and members.
