Every Senda peer exposes a standard /v1/chat/completions endpoint. Anything that speaks the OpenAI API — the official SDKs, LangChain, your own scripts — works by changing one base URL. Below is exactly how, and an honest map of what's open today — including the paid API preview on senda.network/v1.
Senda is in early access, so the surfaces aren't all equally open. Local nodes are fully open with no key. The hosted paid preview on senda.network/v1 works today via /buy. The public entry node still gates chat completions for operators.
| Path | Base URL | Auth | Status |
|---|---|---|---|
| Local node run the runtime yourself | http://localhost:9337/v1 | None | Open now |
| Hosted mesh the public entry node | https://entry.senda.network/v1 | Bearer key | Models open · chat gated |
| Paid API (preview) API balance (USDC) + ck_ key | https://senda.network/v1 | Bearer ck_… | Live preview — get a key |
| Web chat zero setup, not the API | senda.network | None | Open now |
For the paid preview, top up an API balance and mint a key at /buy, then call senda.network/v1/chat/completions. That balance is for API spend — not the same as contributor credits on a node. The entry node entry.senda.network stays operator-gated; local nodes remain free to self-host. Homepage chat stays free.
These examples target a local node at http://localhost:9337/v1. Install the desktop app or curl the runtime first — it autostarts and joins the mesh. Swap the base URL for the hosted entry once you have a key.
curl http://localhost:9337/v1/modelscurl http://localhost:9337/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen3-8B",
"messages": [
{ "role": "user", "content": "Summarize peer-to-peer inference in two sentences." }
]
}'from openai import OpenAI
client = OpenAI(
base_url="http://localhost:9337/v1",
api_key="not-needed", # local node is unauthenticated
)
resp = client.chat.completions.create(
model="Qwen3-8B",
messages=[{"role": "user", "content": "Classify: 'battery great, screen dim'."}],
)
print(resp.choices[0].message.content)import OpenAI from "openai";
const client = new OpenAI({
baseURL: "http://localhost:9337/v1",
apiKey: "not-needed",
});
const resp = await client.chat.completions.create({
model: "Qwen3-8B",
messages: [{ role: "user", content: "Extract every date: shipped 2026-01-09." }],
});
console.log(resp.choices[0].message.content);stream = client.chat.completions.create(
model="Qwen3-8B",
messages=[{"role": "user", "content": "Write a haiku about latency."}],
stream=True,
stream_options={"include_usage": True}, # needed for usage stats
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)There's no fixed model list — it's whatever live peers are serving. Two open, no-auth endpoints tell you what's routable right now, so you can pick a model that actually exists.
curl https://entry.senda.network/v1/modelscurl https://senda.network/api/statusChat completions, streaming (SSE), and model listing follow the OpenAI schema. Most SDKs and agent frameworks need only the base URL changed.
The mesh targets summarization, classification, extraction, and background agent work — not shaving a second off a single reply. Set generous client timeouts and prefer batched / async calls.
Pass stream_options.include_usage = true or the final chunk omits token counts — and the per-model throughput catalog on /status can't record a sample.
The endpoint a hosted peer exposes is the same one your local runtime exposes. For anything you don't want to route through someone else, run a node and keep the whole loop on your hardware.
Paid preview keys at /buy hit senda.network/v1. For local-only access with no key, run your own node — full quality, nothing leaves your machine.