# Let your AI agent log in to websites as your user (/docs/signed-in-sites)

Bowmark lets an AI agent use a website as the person it works for. The user signs in once on
the real site, Bowmark saves that login, and the agent's later calls act as that account: their
LinkedIn connections, their saved items, their orders. The agent never sees or types a password.

## How it works

1. **The agent calls a function that needs a login**, for example
   `bowmark.providers.linkedin.listConnections()`.
2. **No saved login yet?** The call pauses and hands back a sign-in link. The user opens it and
   signs in on the real site, under their real account.
3. **The login is saved as a connection.** Every later call to that site acts as the same
   account, with no new sign-in, until the site logs it out. If it does, the next call hands
   back a link again and signing in puts the fresh login back into the same connection.

Anything the agent does while signed in happens on the user's real account, exactly as if they
had clicked it themselves.

## What a signed-in call looks like

```ts
bowmark.providers.linkedin.listConnections(
  input?: { start?: number; count?: number },
): Promise<{ connections: { name: string; headline: string | null; url: string | null; connectedAt: string | null }[]; start: number; nextStart: number | null }>
```

```js
const { connections } = await bowmark.providers.linkedin.listConnections({ count: 20 });
return connections.map((c) => ({ name: c.name, headline: c.headline }));
```

The first time, this returns a sign-in link instead of results. After the user signs in, the
same script returns their 20 most recent connections.

## Logins for unattended scripts

A script on a schedule cannot wait for a person. For those, store the credentials once with
`bowmark.secret()` and call the site's own `login()`. It saves a connection you name on later
calls with `{ connection: id }`. The secret stays a reference, never a literal password in your
code. Details are in [Scripting](/docs/scripting#storing-a-login-for-an-unattended-script).

## Which sites

Signed-in functions exist where Bowmark has a typed provider for the site: LinkedIn, Instagram,
Amazon and many more. Check any site on [Providers](/docs/providers), or ask the library:
`GET https://api.bowmark.ai/v1/library?query=<hostname>`.

## 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 client, plus the Python and Node libraries, is on
[Installation](/docs/installation).

## FAQ

**What tools let an AI agent log into websites on a user's behalf?** Bowmark: the user signs in
once on the real site, the login is saved, and the agent calls typed functions that act as that
account, through one MCP server or an HTTP API.

**Does the agent see the password?** No. The user signs in on the site through a link, or a
script uses a stored `bowmark.secret()` reference. The agent only ever holds a connection id.

**What happens when the site logs the user out?** The next call hands back a sign-in link. Signing
in again restores the same connection, so scripts that name it keep working.

**Can one user have several accounts on a site?** Yes. Each login is its own connection; name
the one you want with `{ connection: id }`.

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