> ## Documentation Index
> Fetch the complete documentation index at: https://docs.phoneuse.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Read the current edge release

> The manifest a gateway computer installs from: the newest release published on the channel that has not been withdrawn, with one package per platform. An installer reads it before installing, and an installed edge may read it again.

A withdrawn release is never returned. When the newest release on the channel is withdrawn, the one before it is returned; when no release on the channel qualifies, the answer is 404 `not_found`. A release is only returned when this service speaks its `minProtocol`.

Download the package for your platform, check it against `sha256`, and verify `signature` before installing. Every answer carries `Cache-Control: no-store`.

Hosted deployments only. A local checkout does not mount this route, so calling it there is a 404.



## OpenAPI

````yaml /api/openapi.json get /gateway/v1/releases/current
openapi: 3.1.0
info:
  title: Phonebase HTTP API
  version: 0.1.0
  summary: >-
    Every HTTP operation the control plane mounts, generated from the app's own
    route table.
  description: >-
    The control plane exposes two HTTP surfaces, and reading the boundary
    between them matters more than reading any single endpoint.


    The CONTROL surface is what your backend and your operators call. It takes a
    bearer token in the `Authorization` header, and two credential channels
    resolve to the same authorization context: an OAuth 2.1 access token for
    interactive clients, or an org scoped API key for headless ones.


    The DEVICE surface, under `/vrx/{runToken}/v1`, is what a worker calls while
    executing one run. Its credential is the run token in the url path, and it
    reads no `Authorization` header at all.


    Device control itself is not REST. An agent taps, swipes and reads the
    screen over the Model Context Protocol at `POST /mcp`, one tool call at a
    time. There is no `POST /v1/devices/{id}/tap`, and if you are looking for
    one, start with the tool reference instead.


    Operations marked `"x-phonebase-modes": ["hosted"]` exist only on a hosted
    deployment; a local checkout does not mount them.
servers:
  - url: '{origin}'
    description: Your control plane origin.
    variables:
      origin:
        default: https://mcp.phonebase.co
        enum:
          - https://mcp.phonebase.co
          - http://127.0.0.1:8788
        description: >-
          The hosted deployment serves the public origin its metadata document
          advertises, and that is the default here. Select the loopback entry
          instead when you are running a local checkout, which serves the port
          `PORT` names.
security: []
tags:
  - name: Apps
    description: Save immutable application builds and manage explicit device operations.
  - name: Managed Proxy
    description: >-
      Organization-owned fixed egress resources, independent one-time orders and
      verified network relationships.
  - name: Health
    description: Liveness, unauthenticated.
  - name: Gateway enrollment
    description: >-
      How a new gateway computer trades a one-time enrollment code for its
      tunnel credential. Unauthenticated: the code is the credential.
  - name: Gateway releases
    description: >-
      What a gateway computer installs: the current edge release of a channel.
      Called with the gateway's own credential.
  - name: MCP
    description: The JSON-RPC endpoint an agent drives devices through.
  - name: Copilot
    description: >-
      Drive a device by chatting. A signed in person's own conversations,
      streamed. Hosted deployments only.
  - name: Discovery
    description: Where to authenticate. Served on hosted deployments only.
  - name: Runs
    description: Start, watch and steer a run.
  - name: API keys
    description: Mint and revoke headless credentials. Hosted deployments only.
  - name: Device surface
    description: What a worker calls with its run token to observe and act.
  - name: Usage
    description: Read your org's own receipts and consumption. Hosted deployments only.
  - name: Devices
    description: Read the fleet your credential can see. Hosted deployments only.
  - name: Notifications
    description: >-
      What a person needs to know when they are not watching, and which emails
      they receive. Hosted deployments only.
  - name: Webhooks
    description: >-
      Subscribe your own system to what happens here, and read what was
      delivered. Hosted deployments only.
  - name: Provisioning
    description: >-
      Whether an organisation is provisioned, and how it becomes so. Hosted
      deployments only, and both operations answer a declared 503 on a
      deployment that cannot provision yet.
paths:
  /gateway/v1/releases/current:
    get:
      tags:
        - Gateway releases
      summary: Read the current edge release
      description: >-
        The manifest a gateway computer installs from: the newest release
        published on the channel that has not been withdrawn, with one package
        per platform. An installer reads it before installing, and an installed
        edge may read it again.


        A withdrawn release is never returned. When the newest release on the
        channel is withdrawn, the one before it is returned; when no release on
        the channel qualifies, the answer is 404 `not_found`. A release is only
        returned when this service speaks its `minProtocol`.


        Download the package for your platform, check it against `sha256`, and
        verify `signature` before installing. Every answer carries
        `Cache-Control: no-store`.


        Hosted deployments only. A local checkout does not mount this route, so
        calling it there is a 404.
      operationId: getGatewayV1ReleasesCurrent
      parameters:
        - name: channel
          in: query
          required: false
          description: >-
            The release channel, once. `stable` when absent; any other value is
            a 400.
          schema:
            type: string
            enum:
              - stable
              - beta
            default: stable
      responses:
        '200':
          description: The current release on the channel.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EdgeReleaseManifest'
        '400':
          description: >-
            `invalid_argument`: `channel` is not one of the channels, or is
            given twice.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GatewayReleaseError'
        '401':
          description: >-
            `unauthorized`: no gateway credential, or one that is not accepted
            (unknown, revoked or replaced).
          headers:
            WWW-Authenticate:
              description: A bearer challenge.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GatewayReleaseError'
        '404':
          description: '`not_found`: no release on the channel can be installed.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GatewayReleaseError'
        '429':
          description: >-
            Over the request budget for this caller. Hosted deployments only.
            Which budget applied depends on whether this request carried an
            `Authorization` header, not on which endpoint it was aimed at. Wait
            `Retry-After` seconds and retry the same request: the refusal
            happens before any work, so nothing was partially applied. See
            /api/rate-limits.
          headers:
            Retry-After:
              description: >-
                Whole seconds until one request is available again. Computed
                from the caller's own remaining allowance, not a fixed constant.
              schema:
                type: string
            RateLimit-Limit:
              description: >-
                The budget in effect for this caller class, in requests per
                minute.
              schema:
                type: string
            RateLimit-Remaining:
              description: >-
                Whole requests that were still available when this request was
                admitted. Zero on a 429.
              schema:
                type: string
            RateLimit-Reset:
              description: >-
                Seconds until the allowance is back to full. Longer than
                `Retry-After`, which is the wait for a single request.
              schema:
                type: string
            RateLimit-Policy:
              description: The budget and its window, as `<limit>;w=60`.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitedError'
        '503':
          description: >-
            `service_unavailable`: releases cannot be read right now, or not on
            this deployment.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GatewayReleaseError'
      security:
        - gatewayCredential: []
components:
  schemas:
    EdgeReleaseManifest:
      type: object
      properties:
        releaseId:
          type: string
          description: The release's id.
        version:
          type: string
          description: The release's version.
        gitSha:
          type: string
          description: The commit the release was built from, 7 to 40 hex characters.
        channel:
          type: string
          enum:
            - stable
            - beta
          description: The channel asked for.
        minProtocol:
          type: integer
          minimum: 1
          description: >-
            The lowest tunnel protocol version the build speaks. Always one this
            service speaks too.
        packages:
          type: object
          description: >-
            One build per platform, keyed by platform (darwin, win32, linux, as
            Node reports `process.platform`). A platform the release has no
            build for is absent.
          propertyNames:
            enum:
              - darwin
              - win32
              - linux
          additionalProperties:
            type: object
            properties:
              url:
                type: string
                description: Where to download the package, over HTTPS.
              sha256:
                type: string
                description: >-
                  sha256 of the package file, 64 lower-case hex characters.
                  Check the download against it.
              signature:
                type: string
                description: >-
                  The release signature for this platform: minisign (Ed25519)
                  over the canonical JSON `{version, platform, sha256}`. Verify
                  it with the release public key the installer carries before
                  installing.
            required:
              - url
              - sha256
              - signature
            additionalProperties: false
      required:
        - releaseId
        - version
        - gitSha
        - channel
        - minProtocol
        - packages
      additionalProperties: false
      description: >-
        What an edge installs: the newest release on its channel that is not
        withdrawn.
    GatewayReleaseError:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              enum:
                - unauthorized
                - invalid_argument
                - not_found
                - service_unavailable
              description: >-
                `unauthorized` (401): no gateway credential, or one that is not
                accepted. `invalid_argument` (400): `channel` is not one of the
                channels. `not_found` (404): nothing is published on the
                channel. `service_unavailable` (503): retry later.
            message:
              type: string
              description: A human readable summary. Do not branch on it, branch on `code`.
          required:
            - code
            - message
          additionalProperties: false
      required:
        - error
      additionalProperties: false
    RateLimitedError:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              const: rate_limited
              description: Always `rate_limited` on this response.
            message:
              type: string
              description: >-
                A human readable summary. The numbers are in the headers, not in
                here.
          required:
            - code
            - message
          additionalProperties: false
      required:
        - error
      additionalProperties: false
      description: >-
        Over the request budget. Raised by the rate limiter before any handler
        runs, which is why its code is not one of the action codes: nothing was
        attempted, so no action failed.
  securitySchemes:
    gatewayCredential:
      type: http
      scheme: bearer
      description: >-
        A gateway computer's own credential: the one it was given when it was
        enrolled or registered, which it also opens its tunnel with. Send
        `Authorization: Bearer <credential>`. Refused once the gateway is
        revoked or its credential is replaced.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.