Bowmark AI Sites API
The Sites API from Bowmark AI — 3 operation(s) for sites.
The Sites API from Bowmark AI — 3 operation(s) for sites.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
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.curl "https://apis.io/api/v1/apis/bowmark-ai:bowmark-ai-sites-api"
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.
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: 3.2.0
info:
title: Bowmark Sites API
version: 1.0.0
description: 'Run real tasks on live websites over plain HTTP. Two calls: read the typed function library for your task with `GET /v1/library`, then send a short async JavaScript script written against it to `POST /v1/run`. Or call one site''s functions directly: every site in `GET /v1/sites` has its own spec at `/v1/sites/{site}/openapi.json`. Guide: https://bowmark.ai/docs/api. Get a key at https://bowmark.ai/dashboard/keys.'
contact:
email: support@bowmark.ai
url: https://bowmark.ai/docs/api
termsOfService: https://bowmark.ai/terms
servers:
- url: https://api.bowmark.ai
security:
- bearer: []
- apiKeyHeader: []
tags:
- name: Sites
paths:
/v1/sites:
get:
operationId: listSites
summary: List the sites you can call directly
description: Every site with its own functions. Each row carries `openapiUrl`, that site's own spec.
security: []
responses:
'200':
description: The sites.
content:
application/json:
schema:
type: object
properties:
count:
type: integer
sites:
type: array
items:
type: object
properties:
id:
type: string
title:
type: string
site:
type: string
mcpUrl:
type: string
format: uri
openapiUrl:
type: string
format: uri
tags:
- Sites
/v1/sites/{site}/openapi.json:
parameters:
- name: site
in: path
required: true
description: A site id from `GET /v1/sites` (`kayak`) or the site's host (`kayak.com`).
schema:
type: string
get:
operationId: getSiteSpec
summary: One site's OpenAPI spec
description: An OpenAPI 3.1 document with one operation per function of that site, each a `POST /v1/sites/{site}/{fn}`. Feed it to an SDK generator for a typed client.
security: []
responses:
'200':
description: The spec.
content:
application/json:
schema:
type: object
'404':
description: No site by that id or host.
content:
application/json:
schema:
$ref: '#/components/schemas/RunEnvelope'
tags:
- Sites
/v1/sites/{site}/{fn}:
parameters:
- name: site
in: path
required: true
schema:
type: string
- name: fn
in: path
required: true
schema:
type: string
post:
operationId: callSiteFunction
summary: Call one function of one site
description: The body is the function's arguments as an object keyed by parameter name. The site's own spec has the exact shape for each function. Same envelope, billing and status codes as `POST /v1/run`.
requestBody:
required: true
content:
application/json:
schema:
type: object
additionalProperties: true
responses:
'200':
description: 'The run was accepted. That includes a script that threw (`status: error`) or paused for a sign-in (`status: needs_user`).'
content:
application/json:
schema:
$ref: '#/components/schemas/RunEnvelope'
'400':
description: The body was malformed. `error` says what to send.
content:
application/json:
schema:
$ref: '#/components/schemas/RunEnvelope'
'401':
description: No API key, or a key that was refused.
content:
application/json:
schema:
$ref: '#/components/schemas/RunEnvelope'
'402':
description: The account is out of free usage, at its spend cap, or its card was declined. Fix billing at https://bowmark.ai/dashboard/billing.
content:
application/json:
schema:
$ref: '#/components/schemas/RunEnvelope'
'404':
description: No such site or function.
content:
application/json:
schema:
$ref: '#/components/schemas/RunEnvelope'
'429':
description: Too many runs in flight on this account. Nothing was started or charged.
content:
application/json:
schema:
$ref: '#/components/schemas/RunEnvelope'
headers:
Retry-After:
schema:
type: integer
description: Seconds to wait.
'503':
description: A failure on Bowmark's side. Retry.
content:
application/json:
schema:
$ref: '#/components/schemas/RunEnvelope'
tags:
- Sites
components:
schemas:
RunEnvelope:
type: object
description: What a run returns. `status` says whether the SCRIPT succeeded. A script that threw or paused for a login is still HTTP 200. Branch on `status`, not on the HTTP code.
required:
- ok
- status
- result
- logs
- error
- ms
properties:
runId:
type: string
description: Stable id for this run. Quote it in a support or `report` message.
ok:
type: boolean
description: False only when the run produced nothing usable.
status:
type: string
enum:
- ok
- error
- partial
- needs_user
description: '`partial`: the result is real but some calls failed (see `incomplete`); `ok` stays true. `needs_user`: a person must sign in to a site first. Relay `meta.handoff.url` to them, then run again.'
egress:
type: string
enum:
- default
- link
description: 'The egress the run was given, present only when the request asked for one. `link`: every request went through the caller''s own Chrome (Bowmark Link).'
result:
description: Whatever the script `return`ed. Any JSON value.
logs:
type: array
items:
type: string
description: Lines the script wrote with `log(...)`.
error:
type:
- string
- 'null'
description: Why the run failed, in plain words. Null on success.
ms:
type: integer
description: How long the script itself ran, in milliseconds.
queuedMs:
type: integer
description: How long the run waited for a worker before starting. Present only when it was a second or more.
needs:
type: array
description: The sign-ins this script is waiting on. Present when `status` is `needs_user`.
items:
type: object
required:
- capability
- provider
- providerTitle
- kind
properties:
capability:
type: string
provider:
type: string
providerTitle:
type: string
description: The site's name, to show a person.
kind:
type: string
incomplete:
type: object
description: 'Present only when `status` is `partial`: which calls did not answer.'
properties:
summary:
type: string
totalCalls:
type: integer
additionalProperties: true
emptyHanded:
type: object
description: Present when the script returned nothing while its calls returned rows, usually a filter that matched none of the site's own labels. Lists the label values the calls actually returned.
additionalProperties: true
notes:
type: array
description: Caveats a call attached to a complete answer. Never changes `status`.
items:
type: object
properties:
path:
type: string
notes:
type: array
items:
type: string
meta:
type: object
properties:
handoff:
type: object
description: A single-use sign-in link for a person to open. Expires at `expiresAt`.
properties:
ref:
type: string
url:
type: string
format: uri
expiresAt:
type: string
format: date-time
concurrency:
type: object
description: 'On a 429: how many runs are in flight and when to retry.'
properties:
limit:
type: integer
inFlight:
type: integer
retryAfterSeconds:
type: integer
additionalProperties: true
notice:
type: object
description: Set when the account owner has not accepted the current Terms. Relay it to them.
additionalProperties: true
securitySchemes:
bearer:
type: http
scheme: bearer
description: Your Bowmark API key (`bmk_…`), from https://bowmark.ai/dashboard/keys.
apiKeyHeader:
type: apiKey
in: header
name: X-Bowmark-Key
description: The same key, for a client that cannot set `Authorization`.
externalDocs:
description: HTTP API guide
url: https://bowmark.ai/docs/api