Lightpanda Cloud

Managed, hosted CDP browser endpoints reached over secure WebSocket (e.g. `wss://euwest.cloud.lightpanda.io/ws`, `wss://uswest.cloud.lightpanda.io/ws`). Authentication is a `token` query-string parameter; query parameters such as `browser=lightpanda|chrome` and `proxy` select the browser engine and egress. Clients connect with the same Puppeteer/Playwright/chromedp CDP tooling. Cloud access is request-based; usage pricing is not publicly reconciled.

AsyncAPI Specification

lightpanda-asyncapi.yml Raw ↑
asyncapi: '2.6.0'
id: 'urn:io:lightpanda:cdp:websocket'
info:
  title: Lightpanda CDP over WebSocket
  version: '1.0.0'
  description: |
    AsyncAPI 2.6 description of Lightpanda's programmable interface.

    Lightpanda is a headless browser; it does **not** expose a REST API. Its
    interface is the **Chrome DevTools Protocol (CDP)**, a bidirectional
    JSON-RPC 2.0-style wire protocol carried over a single **WebSocket**
    connection. This is the same protocol Chrome/Chromium expose for remote
    automation, which is why existing **Puppeteer**, **Playwright**, and
    **chromedp** clients work against Lightpanda unchanged - they simply connect
    to Lightpanda's WebSocket endpoint instead of Chrome's.

    Two deployment surfaces share this protocol:

      - **Local / self-hosted** (open source, AGPL-3.0): start the server with
        `lightpanda serve --host 127.0.0.1 --port 9222`. The CDP endpoint is
        `ws://127.0.0.1:9222`. Connect Puppeteer with
        `puppeteer.connect({ browserWSEndpoint: "ws://127.0.0.1:9222" })`, or
        Playwright/chromedp via `connectOverCDP`.

      - **Lightpanda Cloud** (managed): regional secure-WebSocket endpoints such
        as `wss://euwest.cloud.lightpanda.io/ws` and
        `wss://uswest.cloud.lightpanda.io/ws`. Authentication is a `token`
        query-string parameter (`?token=YOUR_TOKEN`). Optional query parameters
        include `browser=lightpanda|chrome` to choose the engine and `proxy` to
        configure egress.

    On the wire, the client sends CDP **command** messages (each an object with
    a numeric `id`, a `method` such as `Page.navigate` or `Runtime.evaluate`,
    and a `params` object) and the server returns matching command **results**
    (keyed by the same `id`) plus asynchronous **events** (objects with a
    `method` such as `Page.loadEventFired` and a `params` object, and no `id`).
    Lightpanda implements a subset of CDP sufficient for Puppeteer/Playwright
    automation.
  contact:
    name: API Evangelist
    email: kin@apievangelist.com
    url: https://apievangelist.com
  license:
    name: Lightpanda Browser - AGPL-3.0
    url: https://github.com/lightpanda-io/browser/blob/main/LICENSE
  x-transport-notes:
    transport: Chrome DevTools Protocol (CDP) over WebSocket
    protocol: ws / wss
    direction: bidirectional (commands client-to-server, results and events server-to-client)
    messageEncoding: JSON (JSON-RPC style with numeric command ids)
    localEndpoint: 'ws://127.0.0.1:9222 (lightpanda serve)'
    cloudEndpoints:
      - 'wss://euwest.cloud.lightpanda.io/ws?token=YOUR_TOKEN'
      - 'wss://uswest.cloud.lightpanda.io/ws?token=YOUR_TOKEN'
    cloudQueryParams:
      - 'token (required, auth)'
      - 'browser=lightpanda|chrome (engine selection)'
      - 'proxy (egress configuration)'
    notRest: true
    clients:
      - Puppeteer (browserWSEndpoint)
      - Playwright (connectOverCDP)
      - chromedp
    source: https://lightpanda.io/docs
defaultContentType: application/json
servers:
  local:
    url: 127.0.0.1:9222
    protocol: ws
    description: |
      Local Lightpanda CDP server started with
      `lightpanda serve --host 127.0.0.1 --port 9222`. Clients open a single
      WebSocket and speak CDP over it.
  cloud:
    url: cloud.lightpanda.io/ws
    protocol: wss
    description: |
      Lightpanda Cloud managed CDP endpoint. Use a regional host
      (e.g. euwest / uswest) and append `?token=YOUR_TOKEN`. Optional
      `browser` and `proxy` query parameters select engine and egress.
    security:
      - tokenAuth: []
channels:
  /cdp:
    description: |
      The single CDP WebSocket channel. After the connection is established the
      client publishes CDP command messages and subscribes to CDP result and
      event messages over the same socket.
    bindings:
      ws:
        bindingVersion: '0.1.0'
        query:
          type: object
          properties:
            token:
              type: string
              description: Lightpanda Cloud access token (cloud endpoints only).
            browser:
              type: string
              enum:
                - lightpanda
                - chrome
              description: Selects the browser engine on Lightpanda Cloud. Defaults to lightpanda.
            proxy:
              type: string
              description: Optional egress/proxy selector on Lightpanda Cloud.
    publish:
      operationId: sendCdpCommand
      summary: Send a CDP command to the browser.
      description: |
        The automation client (Puppeteer/Playwright/chromedp or a raw CDP
        client) sends a CDP command - a JSON object with a numeric `id`, a
        `method` (e.g. `Page.navigate`, `Runtime.evaluate`,
        `Target.createTarget`), and a `params` object.
      message:
        $ref: '#/components/messages/CdpCommand'
    subscribe:
      operationId: receiveCdpMessages
      summary: Receive CDP command results and asynchronous events.
      description: |
        The browser returns command results (objects carrying the same `id` as
        the originating command) and asynchronous events (objects with a
        `method` and `params`, and no `id`).
      message:
        oneOf:
          - $ref: '#/components/messages/CdpResult'
          - $ref: '#/components/messages/CdpEvent'
components:
  securitySchemes:
    tokenAuth:
      type: httpApiKey
      in: query
      name: token
      description: |
        Lightpanda Cloud token passed as the `token` query-string parameter on
        the WebSocket URL (`wss://<region>.cloud.lightpanda.io/ws?token=...`).
        Not used for local self-hosted `lightpanda serve` endpoints.
  messages:
    CdpCommand:
      name: CdpCommand
      title: CDP command
      summary: A Chrome DevTools Protocol command sent from client to browser.
      contentType: application/json
      payload:
        $ref: '#/components/schemas/CdpCommand'
      examples:
        - name: pageNavigate
          summary: Navigate to a URL
          payload:
            id: 1
            method: Page.navigate
            params:
              url: https://example.com
        - name: runtimeEvaluate
          summary: Evaluate JavaScript in the page
          payload:
            id: 2
            method: Runtime.evaluate
            params:
              expression: document.title
              returnByValue: true
    CdpResult:
      name: CdpResult
      title: CDP command result
      summary: A response to a previously sent CDP command, keyed by its id.
      contentType: application/json
      payload:
        $ref: '#/components/schemas/CdpResult'
      examples:
        - name: navigateResult
          summary: Result of Page.navigate
          payload:
            id: 1
            result:
              frameId: 'FRAME-ABC123'
              loaderId: 'LOADER-XYZ789'
    CdpEvent:
      name: CdpEvent
      title: CDP event
      summary: An asynchronous event emitted by the browser (no id).
      contentType: application/json
      payload:
        $ref: '#/components/schemas/CdpEvent'
      examples:
        - name: loadEvent
          summary: Page load fired
          payload:
            method: Page.loadEventFired
            params:
              timestamp: 123456.789
  schemas:
    CdpCommand:
      type: object
      description: A CDP command message (JSON-RPC style).
      required:
        - id
        - method
      properties:
        id:
          type: integer
          description: Client-assigned monotonically increasing command id; the matching result echoes it.
        method:
          type: string
          description: CDP method name, e.g. `Page.navigate`, `Runtime.evaluate`, `Target.createTarget`.
        params:
          type: object
          description: Method-specific parameters.
        sessionId:
          type: string
          description: Optional CDP session id when targeting a specific attached target/session.
    CdpResult:
      type: object
      description: A CDP command result keyed by the originating command id.
      required:
        - id
      properties:
        id:
          type: integer
          description: Echoes the id of the command this result responds to.
        result:
          type: object
          description: Method-specific result payload (present on success).
        error:
          type: object
          description: Error object (present on failure).
          properties:
            code:
              type: integer
            message:
              type: string
        sessionId:
          type: string
          description: Optional CDP session id the result belongs to.
    CdpEvent:
      type: object
      description: An asynchronous CDP event emitted by the browser.
      required:
        - method
      properties:
        method:
          type: string
          description: CDP event name, e.g. `Page.loadEventFired`, `Network.responseReceived`.
        params:
          type: object
          description: Event-specific parameters.
        sessionId:
          type: string
          description: Optional CDP session id the event belongs to.