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.
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.
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:
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:
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)
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:
export OPENAI_BASE_URL="https://api.saylek.com/v1"
export OPENAI_API_KEY="YOUR_API_KEY"
4. Confirm it works
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 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.
Next steps
- Claude Code and the Anthropic SDK: the same Circle, Anthropic's dialect.
- Connect your app: the local, keyless daemon surface.
- Troubleshooting: 401s, 404s, and rejected model ids.
Last checked 2026-07-24 · read as markdown at /docs/connect-openai.md