Brix Web Recorder API

The web-recorder API from Brix — 6 operation(s) for web-recorder.

Operations 6

GET /v1/web-recorder/{sid} Get a recording session #
POST /v1/web-recorder/{sid}/abort Cancel a recording #
POST /v1/web-recorder/{sid}/action Record a sign-in step #
POST /v1/web-recorder/{sid}/finalize Save a recorded sign-in #
POST /v1/web-recorder/start Start recording a sign-in #

Work with this as data

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

MCP server

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

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/brixsignage-com:brixsignage-com-web-recorder-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

brixsignage-com-web-recorder-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Brix Web Recorder API
  version: '1'
  summary: 'Control plane for Brix digital signage: screens, content, playlists, schedules, casts and emergencies.'
  description: 'Generated from the route table the API actually mounts

    (`apps/api/routes.snapshot.json`), the description each route is required to

    carry (`tests/contracts/route-registry.json`), and request/response schemas

    (`apps/api/src/openapi/`). CI enforces all three, so this document cannot list a

    route that does not exist or omit one that does.


    **Schemas.** 447 operations carry request and response schemas

    (`x-brix-schema: verified`). Each is checked in CI against the response the

    real handler returns — a missing, mistyped or undeclared field fails the build.

    The remaining operations are route-level only (`x-brix-schema: none`): their

    path, method, permission and purpose are exact, but the shape of `data` is not

    yet modelled, and we would rather say so than publish a schema that validates

    against nothing. Objects are open: a new field is not a breaking change.


    **Envelope.** Success bodies are `{ "data": … }`. Failures are

    `{ "error": "", "message": "…" }`, plus `requestId` on a 5xx.

    Many list routes page opt-in (see each operation): pass `?limit=` and

    follow `nextCursor` via `?cursor=` until it is null.


    **Authentication.** `Authorization: Bearer ` with an API key

    (`ak_…`, created in the console under Settings → API & MCP) or a user session. An

    API key carries a creator-chosen set of `resource.verb` permissions and may be

    pinned to one location''s subtree; a key can never be granted a permission its

    creator does not hold. The permission an operation needs is in

    `x-brix-permission` and in its security requirement.


    **Tenancy.** Every request resolves to one workspace. A resource belonging to

    another tenant returns 404, never 403, so a response never confirms that an

    account exists.


    **Rate limits.** A 429 carries `Retry-After`; a 503 `database_busy` means retry

    after the `Retry-After` interval.'
servers:
- url: https://api.brixsignage.com
  description: Production
security:
- bearerAuth: []
tags:
- name: web-recorder
paths:
  /v1/web-recorder/{sid}:
    get:
      operationId: getWebRecorder
      tags:
      - web-recorder
      summary: Get a recording session
      description: Return the steps recorded so far in an in-progress sign-in recording session.
      x-brix-permission: media.edit
      x-brix-schema: verified
      parameters:
      - name: sid
        in: path
        required: true
        schema:
          type: string
        description: Recording session id, from `start`.
        example: rec_3f2a1b4c-5d6e-4f70-8a9b-0c1d2e3f4a5b
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      url:
                        type: string
                        description: The page the recording is on now.
                      steps:
                        type: array
                        items:
                          $ref: '#/components/schemas/RecordedStep'
                      startedAt:
                        type: integer
                        description: Milliseconds since the Unix epoch (not an ISO timestamp).
                      spaceId:
                        type: string
                    required:
                    - url
                    - steps
                    - startedAt
                    - spaceId
                required:
                - data
        '401':
          description: Missing, expired or revoked bearer token.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: The token lacks the permission this operation needs (see `x-brix-permission`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: No active session with this id in this workspace (it expired, was finished, or never started).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '503':
          description: Recording is not available in this environment.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        5XX:
          description: Server error. The body carries a `requestId` to quote to support.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
      - bearerAuth:
        - media.edit
  /v1/web-recorder/{sid}/abort:
    post:
      operationId: abortWebRecorder
      tags:
      - web-recorder
      summary: Cancel a recording
      description: 'Discard an in-progress sign-in recording session without changing the associated media asset.


        **Notes.**

        - Always answers `{ ok: true }`, for an unknown session too.'
      x-brix-permission: media.edit
      x-brix-schema: verified
      x-brix-notes:
      - 'Always answers `{ ok: true }`, for an unknown session too.'
      parameters:
      - name: sid
        in: path
        required: true
        schema:
          type: string
        description: Recording session id, from `start`.
        example: rec_3f2a1b4c-5d6e-4f70-8a9b-0c1d2e3f4a5b
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      ok:
                        type: boolean
                        const: true
                    required:
                    - ok
                required:
                - data
        '401':
          description: Missing, expired or revoked bearer token.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: The token lacks the permission this operation needs (see `x-brix-permission`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        5XX:
          description: Server error. The body carries a `requestId` to quote to support.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
      - bearerAuth:
        - media.edit
  /v1/web-recorder/{sid}/action:
    post:
      operationId: createWebRecorderAction
      tags:
      - web-recorder
      summary: Record a sign-in step
      description: Append one recorded interaction, such as a click, typed text, or a wait, to an open sign-in recording session.
      x-brix-permission: media.edit
      x-brix-schema: verified
      parameters:
      - name: sid
        in: path
        required: true
        schema:
          type: string
        description: Recording session id, from `start`.
        example: rec_3f2a1b4c-5d6e-4f70-8a9b-0c1d2e3f4a5b
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                kind:
                  type: string
                  enum:
                  - click
                  - type
                  - scroll
                  - navigate
                  - accept-cookies
                  - wait
                  - pick
                selector:
                  type: string
                label:
                  type: string
                text:
                  description: 'For `type`: the typed text (not stored when `isSecret`).'
                  type: string
                isSecret:
                  description: 'For `type`: store a reference instead of the text.'
                  type: boolean
                url:
                  type: string
                dy:
                  type: number
                ms:
                  type: number
                mode:
                  type: string
                x:
                  type: number
                y:
                  type: number
              required:
              - kind
              additionalProperties: {}
              description: One browser action.
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      url:
                        type: string
                        description: The page the recording is on now.
                      steps:
                        type: array
                        items:
                          $ref: '#/components/schemas/RecordedStep'
                      startedAt:
                        type: integer
                        description: Milliseconds since the Unix epoch (not an ISO timestamp).
                      spaceId:
                        type: string
                    required:
                    - url
                    - steps
                    - startedAt
                    - spaceId
                required:
                - data
        '400':
          description: The body is not JSON.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Missing, expired or revoked bearer token.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: The token lacks the permission this operation needs (see `x-brix-permission`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: No active session with this id in this workspace (it expired, was finished, or never started).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '503':
          description: Recording is not available in this environment.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        5XX:
          description: Server error. The body carries a `requestId` to quote to support.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
      - bearerAuth:
        - media.edit
  /v1/web-recorder/{sid}/finalize:
    post:
      operationId: createWebRecorderFinalize
      tags:
      - web-recorder
      summary: Save a recorded sign-in
      description: 'Save a completed recording to a web asset, using mediaId and optional secrets. The recorded steps are stored on the asset''s web configuration, secrets are encrypted and referenced by name, and the session ends.


        **Notes.**

        - The asset''s sign-in is replayed later to refresh its cookies; call `links/:mediaId/verify` to test it now.'
      x-brix-permission: media.edit
      x-brix-schema: verified
      x-brix-notes:
      - The asset's sign-in is replayed later to refresh its cookies; call `links/:mediaId/verify` to test it now.
      parameters:
      - name: sid
        in: path
        required: true
        schema:
          type: string
        description: Recording session id, from `start`.
        example: rec_3f2a1b4c-5d6e-4f70-8a9b-0c1d2e3f4a5b
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                mediaId:
                  type: string
                  description: The web page asset to save the steps to.
                secrets:
                  description: '`valueRef` → secret value. Encrypted; never returned. Null or empty removes one.'
                  type: object
                  propertyNames:
                    type: string
                  additionalProperties:
                    anyOf:
                    - type: string
                    - type: 'null'
                expect:
                  description: The asset's `url` and `webConfig` as you last read them. The save is refused (409) if the address or sign-in steps changed since, so secrets are never stored for a link you did not see.
                  type: object
                  properties:
                    url:
                      type: string
                    webConfig: {}
                  required:
                  - url
                  - webConfig
                removeSteps:
                  description: Indices into the session's steps to leave out of the saved recording.
                  type: array
                  items:
                    type: integer
                    minimum: 0
              required:
              - mediaId
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      ok:
                        type: boolean
                        const: true
                      stepCount:
                        type: integer
                      steps:
                        type: array
                        items:
                          $ref: '#/components/schemas/RecordedStep'
                        description: The steps saved on the asset (the session's, minus `removeSteps`).
                      secretRefs:
                        type: array
                        items:
                          type: object
                          properties:
                            ref:
                              type: string
                            label:
                              type: string
                          required:
                          - ref
                          - label
                        description: Every secret step, so you can send values you have not sent yet.
                    required:
                    - ok
                    - stepCount
                    - steps
                    - secretRefs
                required:
                - data
        '400':
          description: '`mediaId` is missing.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Missing, expired or revoked bearer token.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: You do not hold `media.edit` where the asset lives.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: The session expired or never started, or no such asset.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '409':
          description: The asset's address or sign-in steps changed (or are not what `expect` says). Nothing was saved.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '503':
          description: Recording is not available in this environment.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        5XX:
          description: Server error. The body carries a `requestId` to quote to support.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
      - bearerAuth:
        - media.edit
  /v1/web-recorder/links/{mediaId}/verify:
    post:
      operationId: verifyWebRecorderLink
      tags:
      - web-recorder
      summary: Test a recorded sign-in
      description: 'Run the finalized sign-in recording for a web asset and report whether the resulting session looks successfully logged in. This lets a caller confirm the recording works right after capturing it, rather than waiting until the content plays on a screen.


        **Notes.**

        - Runs the sign-in in a headless browser now (this can take 30 seconds or more). Answers 200 with `ok: false` when it fails.'
      x-brix-permission: media.edit
      x-brix-schema: verified
      x-brix-notes:
      - 'Runs the sign-in in a headless browser now (this can take 30 seconds or more). Answers 200 with `ok: false` when it fails.'
      parameters:
      - name: mediaId
        in: path
        required: true
        schema:
          type: string
        description: Web page asset id.
        example: med_4d5e6f7a8b9c0d1e
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    anyOf:
                    - type: object
                      properties:
                        ok:
                          type: boolean
                          const: false
                        failedStep:
                          type: integer
                          description: The step that failed (0-based).
                        reason:
                          type: string
                        failureScreenshotB64:
                          description: A base64 JPEG of the page where it stopped, when one could be taken.
                          type: string
                      required:
                      - ok
                      - failedStep
                      - reason
                    - type: object
                      properties:
                        ok:
                          type: boolean
                          const: true
                        cookieCount:
                          type: integer
                          description: Cookies captured and stored (encrypted) for rendering.
                      required:
                      - ok
                      - cookieCount
                required:
                - data
        '401':
          description: Missing, expired or revoked bearer token.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: You do not hold `media.edit` where the asset lives.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '503':
          description: The headless browser is not available.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        5XX:
          description: Server error. The body carries a `requestId` to quote to support.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
      - bearerAuth:
        - media.edit
  /v1/web-recorder/start:
    post:
      operationId: startWebRecorder
      tags:
      - web-recorder
      summary: Start recording a sign-in
      description: 'Begin a sign-in recording session for a web asset, given a url. Returns a session id, the url, and the steps recorded so far, which starts empty. Steps are then submitted using the Brix Recorder browser extension.


        **Notes.**

        - The recorder browser extension then sends each step with `action`. Invalid input answers 400, not 422.'
      x-brix-permission: media.edit
      x-brix-schema: verified
      x-brix-notes:
      - The recorder browser extension then sends each step with `action`. Invalid input answers 400, not 422.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                url:
                  type: string
                  description: The sign-in page (http or https, a public host).
              required:
              - url
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      url:
                        type: string
                        description: The page the recording is on now.
                      steps:
                        type: array
                        items:
                          $ref: '#/components/schemas/RecordedStep'
                      startedAt:
                        type: integer
                        description: Milliseconds since the Unix epoch (not an ISO timestamp).
                      spaceId:
                        type: string
                      sid:
                        type: string
                      ok:
                        type: boolean
                        const: true
                    required:
                    - url
                    - steps
                    - startedAt
                    - spaceId
                    - sid
                    - ok
                required:
                - data
        '400':
          description: '`url` is not http(s), or not a public address.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Missing, expired or revoked bearer token.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: The token lacks the permission this operation needs (see `x-brix-permission`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '503':
          description: Recording is not available in this environment.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        5XX:
          description: Server error. The body carries a `requestId` to quote to support.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
      - bearerAuth:
        - media.edit
components:
  schemas:
    Error:
      type: object
      properties:
        error:
          type: string
          description: 'Machine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …'
        message:
          description: Human-readable explanation. Safe to show an operator.
          type: string
        requestId:
          description: 'Present on 5xx: quote it to support.'
          type: string
      required:
      - error
      additionalProperties: {}
      description: Error envelope returned by every failing request.
    RecordedStep:
      type: object
      properties:
        kind:
          type: string
          description: '`navigate`, `click`, `enter-text`, `scroll`, `accept-cookies`, `wait`, or a picker step.'
        url:
          type: string
        selector:
          type: string
        label:
          type: string
        value:
          description: Typed text that is not secret.
          type: string
        valueRef:
          description: 'For secret text: a reference; the value is never recorded. Send it in `finalize`''s `secrets`.'
          type: string
        pixels:
          type: number
        ms:
          type: number
      required:
      - kind
      additionalProperties: {}
      description: One recorded step of a website sign-in.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: An API key (`ak_…`) or a user session token. API keys carry `resource.verb` permissions.