Skip to main content
Glama

Bowmark web data: LinkedIn, Amazon, YouTube, Reddit, Airbnb, Instagram

Do the task on the live websites and return the result

run
Destructive

Executes the task on live websites and returns the result. Call get_library FIRST, then run({ script }). The same script can run from your app: POST https://api.bowmark.ai/v1/run with your API key; see bowmark.ai/docs/http-api.

THE SCRIPT is a plain async JavaScript body, not a wrapping function. bowmark is a ready global: await bowmark.<capability>.<fn>(...), or one site via await bowmark.providers.<provider>.<fn>(...). return what you want back; log(...) for progress. Built-ins plus URL/URLSearchParams exist; fetch, import, setTimeout and a filesystem do not — bowmark is the only I/O.

MIND THE CLOCK. Your client times out around 55 seconds; calls may take 30-55 seconds; default to ONE per script. Several? Use Promise.allSettled together (a dropped leg still returns partial), never one after another or inside a for loop. Keep under ~25,000 chars.

CHECK status BEFORE ok — ok | error | partial | needs_user | running: • running: it is still going. Call run({ runId }) to wait for the SAME run; never resend the script. • partial: result is real but narrower than asked, usually the site's doing; incomplete names what did not answer. Tell your user — never call it complete. incomplete.failures[].fixable: true means your argument was wrong: fix it and rerun. • needs_user: a site needs your user signed in; not a failure. Give them meta.handoff.url, name the sites, then call wait_for_sign_in with meta.handoff.ref. On done, send the SAME script unchanged. • error: there is no result; error says why.

Saving files, one exit IP, saved secrets, warnings, emptyHanded, and the billed browser_agent/delegate fallbacks: get_library({ query: "run guide" }).

Input Schema

NameRequiredDescriptionDefault
runIdNoSend EXACTLY ONE of `script` or `runId`, never both and never neither. `runId` is only to collect a run an earlier call answered `status: "running"` for: pass its `runId` alone, with no `script`, and this call waits for that same run's result. Leave it out when starting a run.
egressNoOptional. `"link"` sends every request of this run through the user's own Chrome (Bowmark Link) and fails with "Link not connected" when it is not open; `"link-first"` tries the user's Chrome first and falls back to Bowmark's own route (use it when the answer must come from the user's own address, e.g. a YouTube stream URL that will play in their browser); `"default"` or leaving it out uses Bowmark's own route. The result echoes what was applied as `egress` (`"default"` when a `"link-first"` run found no Chrome).
scriptNoSend EXACTLY ONE of `script` or `runId`, never both and never neither; `script` starts a new run. The JavaScript script body to execute (async, against the `bowmark` global). e.g. `const { flights, warnings } = await bowmark.flights.search({from:'SFO',to:'JFK',depart:'2026-09-01'}); return { best: flights.sort((a,b)=>a.price-b.price)[0], warnings };`

Output Schema

NameRequiredDescriptionDefault
msNo
okYes
logsNo
metaNo
errorNo
needsNo
notesNo
runIdNo
egressNo
noticeNo
resultNo
statusNo
queuedMsNo
incompleteNo
savedFilesNo
emptyHandedNo
secretNeedsNo
savedSecretsNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • changedInput schema / properties / egress / description
      Previous value: -"Optional. `\"link\"` sends every request of this run through the user's own Chrome (Bowmark Link) and fails with \"Link not connected\" when it is not open; `\"default\"` or leaving it out uses Bowmark's own route. The result echoes it as `egress`."New value: +"Optional. `\"link\"` sends every request of this run through the user's own Chrome (Bowmark Link) and fails with \"Link not connected\" when it is not open; `\"link-first\"` tries the user's Chrome first and falls back to Bowmark's own route (use it when the answer must come from the user's own address, e.g. a YouTube stream URL that will play in their browser); `\"default\"` or leaving it out uses Bowmark's own route. The result echoes what was applied as `egress` (`\"default\"` when a `\"link-first\"` run found no Chrome)."
    • changedInput schema / properties / egress / enum
      Previous value: -[
      -  "default",
      -  "link"
      -]New value: +[
      +  "default",
      +  "link",
      +  "link-first"
      +]
    • changedOutput schema / properties / egress / enum
      Previous value: -[
      -  "default",
      -  "link"
      -]New value: +[
      +  "default",
      +  "link",
      +  "link-first"
      +]
  2. Changed3 schema fields changed
    • addedInput schema / additionalProperties
      Added value: +false
    • removedInput schema / oneOf
      Removed value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "egress": {
      -        "description": "Optional. `\"link\"` sends every request of this run through the user's own Chrome (Bowmark Link) and fails with \"Link not connected\" when it is not open; `\"default\"` or leaving it out uses Bowmark's own route. The result echoes it as `egress`.",
      -        "enum": [
      -          "default",
      -          "link"
      -        ],
      -        "type": "string"
      -      },
      -      "script": {
      -        "description": "The JavaScript script body to execute (async, against the `bowmark` global). e.g. `const { flights, warnings } = await bowmark.flights.search({from:'SFO',to:'JFK',depart:'2026-09-01'}); return { best: flights.sort((a,b)=>a.price-b.price)[0], warnings };`",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "script"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "runId": {
      -        "description": "Only to collect a run an earlier call answered `status: \"running\"` for: pass its `runId` and no `script`, and this call waits for that same run's result.",
      -        "format": "uuid",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "runId"
      -    ],
      -    "type": "object"
      -  }
      -]
    • addedInput schema / properties
      Added value: +{
      +  "egress": {
      +    "description": "Optional. `\"link\"` sends every request of this run through the user's own Chrome (Bowmark Link) and fails with \"Link not connected\" when it is not open; `\"default\"` or leaving it out uses Bowmark's own route. The result echoes it as `egress`.",
      +    "enum": [
      +      "default",
      +      "link"
      +    ],
      +    "type": "string"
      +  },
      +  "runId": {
      +    "description": "Send EXACTLY ONE of `script` or `runId`, never both and never neither. `runId` is only to collect a run an earlier call answered `status: \"running\"` for: pass its `runId` alone, with no `script`, and this call waits for that same run's result. Leave it out when starting a run.",
      +    "format": "uuid",
      +    "type": "string"
      +  },
      +  "script": {
      +    "description": "Send EXACTLY ONE of `script` or `runId`, never both and never neither; `script` starts a new run. The JavaScript script body to execute (async, against the `bowmark` global). e.g. `const { flights, warnings } = await bowmark.flights.search({from:'SFO',to:'JFK',depart:'2026-09-01'}); return { best: flights.sort((a,b)=>a.price-b.price)[0], warnings };`",
      +    "type": "string"
      +  }
      +}
  3. Changed3 schema fields changed
    • removedInput schema / additionalProperties
      Removed value: -false
    • addedInput schema / oneOf
      Added value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "egress": {
      +        "description": "Optional. `\"link\"` sends every request of this run through the user's own Chrome (Bowmark Link) and fails with \"Link not connected\" when it is not open; `\"default\"` or leaving it out uses Bowmark's own route. The result echoes it as `egress`.",
      +        "enum": [
      +          "default",
      +          "link"
      +        ],
      +        "type": "string"
      +      },
      +      "script": {
      +        "description": "The JavaScript script body to execute (async, against the `bowmark` global). e.g. `const { flights, warnings } = await bowmark.flights.search({from:'SFO',to:'JFK',depart:'2026-09-01'}); return { best: flights.sort((a,b)=>a.price-b.price)[0], warnings };`",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "script"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "runId": {
      +        "description": "Only to collect a run an earlier call answered `status: \"running\"` for: pass its `runId` and no `script`, and this call waits for that same run's result.",
      +        "format": "uuid",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "runId"
      +    ],
      +    "type": "object"
      +  }
      +]
    • removedInput schema / properties
      Removed value: -{
      -  "egress": {
      -    "description": "Optional. `\"link\"` sends every request of this run through the user's own Chrome (Bowmark Link) and fails with \"Link not connected\" when it is not open; `\"default\"` or leaving it out uses Bowmark's own route. The result echoes it as `egress`.",
      -    "enum": [
      -      "default",
      -      "link"
      -    ],
      -    "type": "string"
      -  },
      -  "runId": {
      -    "description": "Only to collect a run an earlier call answered `status: \"running\"` for: pass its `runId` and no `script`, and this call waits for that same run's result.",
      -    "format": "uuid",
      -    "type": "string"
      -  },
      -  "script": {
      -    "description": "The JavaScript script body to execute (async, against the `bowmark` global). e.g. `const { flights, warnings } = await bowmark.flights.search({from:'SFO',to:'JFK',depart:'2026-09-01'}); return { best: flights.sort((a,b)=>a.price-b.price)[0], warnings };`",
      -    "type": "string"
      -  }
      -}
  4. Changed2 schema fields changed
    • addedInput schema / properties / egress
      Added value: +{
      +  "description": "Optional. `\"link\"` sends every request of this run through the user's own Chrome (Bowmark Link) and fails with \"Link not connected\" when it is not open; `\"default\"` or leaving it out uses Bowmark's own route. The result echoes it as `egress`.",
      +  "enum": [
      +    "default",
      +    "link"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / egress
      Added value: +{
      +  "enum": [
      +    "default",
      +    "link"
      +  ],
      +  "type": "string"
      +}
  5. Changed1 schema field changed
    • addedOutput schema / properties / notes
      Added value: +{}
  6. Changed1 schema field changed
    • addedOutput schema / properties / queuedMs
      Added value: +{
      +  "type": "number"
      +}
  7. Changed3 schema fields changed
    • addedInput schema / properties / runId
      Added value: +{
      +  "description": "Only to collect a run an earlier call answered `status: \"running\"` for: pass its `runId` and no `script`, and this call waits for that same run's result.",
      +  "format": "uuid",
      +  "type": "string"
      +}
    • removedInput schema / required
      Removed value: -[
      -  "script"
      -]
    • changedOutput schema / properties / status / enum
      Previous value: -[
      -  "ok",
      -  "error",
      -  "partial",
      -  "needs_user"
      -]New value: +[
      +  "ok",
      +  "error",
      +  "partial",
      +  "needs_user",
      +  "running"
      +]
  8. Changed1 schema field changed
    • addedOutput schema / properties / savedFiles
      Added value: +{
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "bytes": {
      +        "type": "number"
      +      },
      +      "contentType": {
      +        "type": "string"
      +      },
      +      "expiresAt": {
      +        "type": "string"
      +      },
      +      "id": {
      +        "type": "string"
      +      },
      +      "name": {
      +        "type": "string"
      +      },
      +      "url": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "id",
      +      "name",
      +      "contentType",
      +      "bytes",
      +      "url",
      +      "expiresAt"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  9. Changed1 schema field changed
    • removedOutput schema / properties / cost
      Removed value: -{
      -  "additionalProperties": false,
      -  "properties": {
      -    "lines": {
      -      "items": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "quantity": {
      -            "type": "number"
      -          },
      -          "sku": {
      -            "type": "string"
      -          },
      -          "unit": {
      -            "enum": [
      -              "bytes",
      -              "ms",
      -              "count"
      -            ],
      -            "type": "string"
      -          },
      -          "usd": {
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "sku",
      -          "quantity",
      -          "unit",
      -          "usd"
      -        ],
      -        "type": "object"
      -      },
      -      "type": "array"
      -    },
      -    "usd": {
      -      "type": "number"
      -    }
      -  },
      -  "required": [
      -    "usd",
      -    "lines"
      -  ],
      -  "type": "object"
      -}
  10. Changed2 schema fields changed
    • addedOutput schema / properties / savedSecrets
      Added value: +{
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "name": {
      +        "type": "string"
      +      },
      +      "type": {
      +        "type": "string"
      +      },
      +      "viewUrl": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "name",
      +      "type",
      +      "viewUrl"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / secretNeeds
      Added value: +{
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "expiredAt": {
      +        "type": "string"
      +      },
      +      "reason": {
      +        "enum": [
      +          "expired",
      +          "pending",
      +          "unavailable"
      +        ],
      +        "type": "string"
      +      },
      +      "secret": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "secret",
      +      "reason"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  11. Changed1 schema field changed
    • addedOutput schema / properties / cost
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "lines": {
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "quantity": {
      +            "type": "number"
      +          },
      +          "sku": {
      +            "type": "string"
      +          },
      +          "unit": {
      +            "enum": [
      +              "bytes",
      +              "ms",
      +              "count"
      +            ],
      +            "type": "string"
      +          },
      +          "usd": {
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "sku",
      +          "quantity",
      +          "unit",
      +          "usd"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "usd": {
      +      "type": "number"
      +    }
      +  },
      +  "required": [
      +    "usd",
      +    "lines"
      +  ],
      +  "type": "object"
      +}
  12. Changed1 schema field changed
    • addedOutput schema / properties / notice
      Added value: +{}
  13. Changed1 schema field changed
    • addedOutput schema / properties / emptyHanded
      Added value: +{}
  14. Changed1 schema field changed
    • addedOutput schema / properties / runId
      Added value: +{
      +  "format": "uuid",
      +  "type": "string"
      +}
  15. Changed2 schema fields changed
    • removedInput schema / $schema
      Removed value: -"http://json-schema.org/draft-07/schema#"
    • removedOutput schema / $schema
      Removed value: -"http://json-schema.org/draft-07/schema#"
  16. Changed2 schema fields changed
    • addedOutput schema / properties / incomplete
      Added value: +{}
    • changedOutput schema / properties / status / enum
      Previous value: -[
      -  "ok",
      -  "error",
      -  "needs_user"
      -]New value: +[
      +  "ok",
      +  "error",
      +  "partial",
      +  "needs_user"
      +]
  17. Changed1 schema field changed
    • changedInput schema / properties / script / description
      Previous value: -"The JavaScript script body to execute (async, against the `bowmark` global). e.g. `const f = await bowmark.flights.search({from:'SFO',to:'JFK',depart:'2026-09-01'}); return f.sort((a,b)=>a.price-b.price)[0];`"New value: +"The JavaScript script body to execute (async, against the `bowmark` global). e.g. `const { flights, warnings } = await bowmark.flights.search({from:'SFO',to:'JFK',depart:'2026-09-01'}); return { best: flights.sort((a,b)=>a.price-b.price)[0], warnings };`"
  18. Added

TDQS

Score is being calculated.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.