Bowmark AI Recipes API
The Recipes API from Bowmark AI — 2 operation(s) for recipes.
The Recipes API from Bowmark AI — 2 operation(s) for recipes.
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-recipes-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 Recipes 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: Recipes
paths:
/v1/recipes:
get:
operationId: listRecipes
summary: List ready-made scripts
security: []
responses:
'200':
description: Every recipe and the inputs it takes.
content:
application/json:
schema:
type: object
properties:
recipes:
type: array
items:
$ref: '#/components/schemas/Recipe'
tags:
- Recipes
/v1/recipes/{id}:
parameters:
- name: id
in: path
required: true
schema:
type: string
get:
operationId: getRecipe
summary: Read one recipe, including its script
security: []
responses:
'200':
description: The recipe.
content:
application/json:
schema:
allOf:
- $ref: '#/components/schemas/Recipe'
- type: object
properties:
script:
type: string
'404':
description: No recipe by that id.
content:
application/json:
schema:
$ref: '#/components/schemas/RunEnvelope'
tags:
- Recipes
post:
operationId: runRecipe
summary: Run a recipe with your inputs
description: The body is the recipe's inputs as a JSON object. 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 recipe by that id.
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:
- Recipes
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
Recipe:
type: object
required:
- id
- title
- description
- inputs
- example
- run
properties:
id:
type: string
title:
type: string
description:
type: string
inputs:
type: array
items:
type: object
required:
- name
- type
- required
- description
properties:
name:
type: string
type:
type: string
enum:
- string
- string[]
- boolean
required:
type: boolean
description:
type: string
example:
type: object
additionalProperties: true
run:
type: string
description: The call that runs it.
source:
type: string
format: uri
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