Virix Labs Session API

Run a browser session against a goal

Operations 1

POST /a2a A2A JSON-RPC 2.0: message/send, message/stream, tasks/get, tasks/cancel… #

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/humanbrowser-cloud:humanbrowser-cloud-session-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

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

humanbrowser-cloud-session-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Human Browser Session API
  version: 1.1.0
  description: 'Human Browser: a cloud browser agent for AI agents. Send a natural-language goal; a real Chromium on a residential IP runs it and returns the answer plus a live viewer URL. This spec covers the public account endpoints on humanbrowser.cloud and the A2A JSON-RPC endpoint on agent.humanbrowser.cloud (per-operation servers). Agent-oriented guide: https://humanbrowser.cloud/llms-full.txt. Agent card: https://agent.humanbrowser.cloud/.well-known/agent-card.json.'
  contact:
    name: Virix Labs
    url: https://humanbrowser.cloud
    email: general@virixlabs.com
  license:
    name: Apache-2.0
    url: https://github.com/VirixLabs/humanbrowser
servers:
- url: https://humanbrowser.cloud
  description: Account API
- url: https://agent.humanbrowser.cloud
  description: A2A + MCP + sessions (Bearer token)
security:
- bearerAuth: []
tags:
- name: Session
  description: Run a browser session against a goal
paths:
  /a2a:
    post:
      tags:
      - Session
      operationId: a2aJsonRpc
      servers:
      - url: https://agent.humanbrowser.cloud
      summary: 'A2A JSON-RPC 2.0: message/send, message/stream, tasks/get, tasks/cancel…'
      description: 'A2A v0.3 wire format. message/send returns a Task within seconds (state "working", metadata.viewerUrl); poll tasks/get {id} every 3-5 s until completed | failed | canceled | input-required; the answer is metadata.outcome.result. Credentials: a data part {"kind":"data","metadata":{"sensitive":true},"data":{"password":"..."}} referenced as in the goal. JSON-RPC errors come back with HTTP 200 except auth (401) and balance (402). Full guide: https://humanbrowser.cloud/llms-full.txt'
      security:
      - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - jsonrpc
              - id
              - method
              - params
              properties:
                jsonrpc:
                  type: string
                  const: '2.0'
                id:
                  oneOf:
                  - type: string
                  - type: integer
                method:
                  type: string
                  examples:
                  - message/send
                  - message/stream
                  - tasks/get
                  - tasks/cancel
                  - actions/list_countries
                params:
                  type: object
                  description: 'message/send: {message:{role:"user",messageId,parts:[{kind:"text",text}|{kind:"data",data,metadata?}|{kind:"file",file:{name,mimeType,uri|bytes}}],referenceTaskIds?,taskId?,contextId?,metadata?},metadata?}. tasks/get and tasks/cancel: {id}.'
            examples:
              send:
                value:
                  jsonrpc: '2.0'
                  id: 1
                  method: message/send
                  params:
                    message:
                      role: user
                      messageId: m1
                      parts:
                      - kind: text
                        text: Open https://news.ycombinator.com and return the top 3 story titles as JSON.
              poll:
                value:
                  jsonrpc: '2.0'
                  id: 2
                  method: tasks/get
                  params:
                    id: t_27b88f806e7c28e6
              login:
                value:
                  jsonrpc: '2.0'
                  id: 3
                  method: message/send
                  params:
                    message:
                      role: user
                      messageId: m3
                      parts:
                      - kind: text
                        text: Log into https://app.example.com as <email> with <password> and list my last 5 invoices.
                      - kind: data
                        metadata:
                          sensitive: true
                        data:
                          email: me@example.com
                          password: S3cret!
              answer_input_required:
                value:
                  jsonrpc: '2.0'
                  id: 4
                  method: message/send
                  params:
                    message:
                      role: user
                      messageId: m4
                      referenceTaskIds:
                      - t_27b88f806e7c28e6
                      metadata:
                        in_reply_to: req_bb12e169e2a88d66
                      parts:
                      - kind: text
                        text: '493817'
      responses:
        '200':
          description: JSON-RPC result (a Task) or JSON-RPC error. message/stream answers with text/event-stream.
          content:
            application/json:
              example:
                jsonrpc: '2.0'
                id: 1
                result:
                  id: t_27b88f806e7c28e6
                  contextId: ctx_e6595bd310be
                  kind: task
                  status:
                    state: working
                  artifacts: []
                  metadata:
                    sessionId: s_a276fa71b1
                    viewerUrl: https://humanbrowser.cloud/a/s_a276fa71b1?k=...
                    profile: ycombinator
                    profile_inferred: true
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          $ref: '#/components/responses/PaymentRequired'
components:
  responses:
    PaymentRequired:
      description: Insufficient prepaid balance — top up to continue
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Unauthorized:
      description: Missing or invalid credentials
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  schemas:
    Error:
      type: object
      description: Uniform typed error model returned by every 4xx/5xx response.
      required:
      - error
      properties:
        error:
          type: string
          description: Stable machine-readable error code, e.g. invalid-email, not-signed-in, rate-limited, insufficient-balance, server-error.
        message:
          type: string
          description: Human-readable explanation.
        hint:
          type: string
          description: Optional remediation hint for agents.
        retry_after_seconds:
          type: integer
          description: Present on 429; how long to wait before retrying.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: 'API token hb_live_<owner>_<32 hex> from https://humanbrowser.cloud/account. Send as Authorization: Bearer <token>; never in a URL.'
    sessionCookie:
      type: apiKey
      in: cookie
      name: hb_session
      description: Login session cookie for account endpoints.
    oauth2:
      type: oauth2
      description: OAuth 2.1 for the MCP endpoint (https://agent.humanbrowser.cloud/mcp). The issued access token is the account's hb_live token, so it also works as bearerAuth.
      flows:
        authorizationCode:
          authorizationUrl: https://agent.humanbrowser.cloud/authorize
          tokenUrl: https://agent.humanbrowser.cloud/token
          refreshUrl: https://agent.humanbrowser.cloud/token
          scopes:
            mcp:run: Start and drive browser tasks
            mcp:read: Read task status
externalDocs:
  description: LLM-friendly reference
  url: https://humanbrowser.cloud/llms-full.txt
x-provenance:
  method: harvested
  publisher: Virix Labs
  source: https://humanbrowser.cloud/openapi.json
  note: split by refine-openapis from the provider's own published document, verified by fetch (openapi/_original/*.fetch.json);
    stamped by stamp-openapi-provenance.py (roadmap#793)