# Use your Circle from anywhere

The hosted endpoint speaks the OpenAI API, so an existing OpenAI-compatible client can
reach your Circle from any machine with your API key. Nothing needs to run locally.

This is the **hosted** surface. For pointing a client at a daemon on your own machine, with
no key and no network hop, see [Connect your app](/docs/connect-your-app).

## Which one do I want

| | Local daemon | Hosted endpoint |
|---|---|---|
| Base URL | `http://127.0.0.1:8443/v1` | `https://api.saylek.com/v1` |
| Auth | None (any non-empty string) | Your member API key |
| Serves from | This machine first, then your Circle | Hosts across your Circles |
| Can requests leave your machine | Yes, unless local-only is set | Yes, always |
| Works when your machine is off | No | Yes |

Note the second row, because it surprises people: the local daemon is **not** a local-only
path. When your own machine cannot serve a request, the daemon falls back to a Host in your
Circle by default, exactly as the hosted endpoint does. Local-only mode is what makes the
daemon stay local. See [Privacy and egress](/docs/privacy-and-egress).

Use the hosted endpoint when you want your Circle's capacity from a machine that is not
running a daemon at all.

## 1. Create an API key

Create one from your account's keys page at `/account/keys`.

A key's secret is shown **once, at creation**. Save it then. If you lose it, create a new
key rather than trying to recover the old one.

## 2. Find a model your Circle serves

Model ids are carried verbatim, exactly as the Pool advertises them. There are no aliases,
so a name from another provider will not resolve. List what is actually available:

```bash
curl https://api.saylek.com/v1/models \
  -H "Authorization: Bearer YOUR_API_KEY"
```

Pick an id from that response and use it as `MODEL_ID` below.

## 3. Point your client at it

Most OpenAI SDKs take a base URL and a key:

```python
from openai import OpenAI

client = OpenAI(
    base_url="https://api.saylek.com/v1",
    api_key="YOUR_API_KEY",
)

resp = client.chat.completions.create(
    model="MODEL_ID",
    messages=[{"role": "user", "content": "hello"}],
)
print(resp.choices[0].message.content)
```

```typescript
import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://api.saylek.com/v1",
  apiKey: "YOUR_API_KEY",
});

const resp = await client.chat.completions.create({
  model: "MODEL_ID",
  messages: [{ role: "user", content: "hello" }],
});
console.log(resp.choices[0].message.content);
```

Most tools that accept an OpenAI base URL take the same two values. Set
`OPENAI_BASE_URL` and `OPENAI_API_KEY` when a tool reads them from the environment:

```bash
export OPENAI_BASE_URL="https://api.saylek.com/v1"
export OPENAI_API_KEY="YOUR_API_KEY"
```

## 4. Confirm it works

```bash
curl https://api.saylek.com/v1/chat/completions \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "MODEL_ID",
    "messages": [{"role": "user", "content": "hello"}]
  }'
```

## When it can answer

Calls work while a Host in one of your Circles is online and serving the model you asked
for. When none is, requests fail until one comes back. That is the honest shape of a pool
of people's machines rather than a datacentre.

**Requests through this endpoint run on a Circle-mate's GPU**, which means your prompt is
handled by their machine. Read [Privacy and egress](/docs/privacy-and-egress) before
sending anything sensitive through it. The local-only controls described there apply to the
daemon, not to this hosted path: if you need a request to stay on your own machine, use the
local daemon.

**Provider-run tools have nothing behind them here.** A Host serves a model, not a search
engine or a sandbox, so a built-in web search returns an empty result set rather than an
error. Give your client a tool it runs itself instead:
[Web search](/docs/connect-anthropic#web-search).

## Next steps

- [Claude Code and the Anthropic SDK](/docs/connect-anthropic): the same Circle, Anthropic's dialect.
- [Connect your app](/docs/connect-your-app): the local, keyless daemon surface.
- [Troubleshooting](/docs/troubleshooting): 401s, 404s, and rejected model ids.
