# Let your AI agent call a website that has no public API (/docs/no-api)


Most of the sites your agent needs (gas prices, store stock, flight fares, job boards, restaurant
bookings) never published an API. Bowmark has already turned about 780 of them into functions your
agent can call. You skip writing and maintaining a script for each site, and your agent gets
structured fields back instead of a page to read.

## The usual answer, and what it costs

The common advice is to write your own automation for each site and hand it to your agent as a
tool. That works until the site changes its layout, adds a login step or starts turning you away.
Then you maintain it, for every site. Bowmark keeps each function working and tests it on a
schedule.

## An example

GasBuddy has no public API. With Bowmark, your agent calls a function:

```js
const { stations } = await bowmark.gas_prices.search("78701", { limit: 3 });
// [{ brand: "7-Eleven", price: 3.59, address: "408 W 15th St, Austin, TX", reportedAgo: "2 Hours Ago" }, ...]
```

## How it works

1. **Read the library.** Your agent asks what exists for a site and gets back function
   signatures and result types.
2. **Run a script.** Your agent writes a few lines of JavaScript against those functions, and
   Bowmark runs it on the live site.

More on [How it works](/docs/how-it-works).

## Sites behind a login

Some functions act on your own account, like LinkedIn or your Amazon orders. You sign in once
through a saved connection, and your agent never sees the password.

## Connect it

MCP URL: `https://api.bowmark.ai/mcp`. Make a key at
[dashboard/keys](https://bowmark.ai/dashboard/keys); your first $10 of usage is free, no card
needed. Every other client, plus the Python and Node libraries, is on
[Installation](/docs/installation).

  **Claude Code**
    ```sh
    claude mcp add bowmark --transport http https://api.bowmark.ai/mcp \
      --header "Authorization: Bearer $BOWMARK_API_KEY"
    ```

  **Codex**
    In `~/.codex/config.toml`, with `BOWMARK_API_KEY` exported in your shell:

    ```toml
    [mcp_servers.bowmark]
    url = "https://api.bowmark.ai/mcp"
    bearer_token_env_var = "BOWMARK_API_KEY"
    ```

  **Cursor**
    Settings → MCP → **Add new MCP server**, then paste the JSON from
    [Installation](/docs/installation).

## FAQ

**How can an agent call a website that has no public API?** Use a service that has already turned
the site into functions. Bowmark covers about 780 sites: your agent calls a function and gets
structured results.

**Can my AI agent use websites without running a browser?** Yes. Your agent does not need to
drive a browser: it calls a Bowmark function for the site and gets structured results back. That
works for about 780 sites today.

**Do I have to write a script for each site?** No. Check the library first with
`GET https://api.bowmark.ai/v1/library?query=<hostname>`. If the site is covered, call the
function.

**What if my site is not covered?** The library says so plainly. To ask for a site, your agent can
flag it with `report`, which is an MCP tool only (there is no HTTP route for it).

**What does it cost?** Free $10 of usage to start, then pay as you go for what each call uses. See
[Pricing](/docs/pricing).
