/api/v1/developer/*.
The short version: every endpoint in this API is a server-to-server call. Your backend calls
Persona’s backend. Your browser/mobile app never does.
1. Your Project credential is a server-side secret
When you mint a credential (POST /api/v1/projects/{projectId}/credentials, from your own
Clerk-authenticated admin session — see the separate admin/control-plane docs), you get back a
keyId and a secret. Every call to /api/v1/developer/* authenticates with
2. The same endpoint serves two different purposes, and you choose which
Most Developer endpoints (Agents, Skills, Knowledge, MCP, Threads) don’t have separate “admin” and “end-user” URLs. The same route behaves differently depending on one thing: whether your request also carries- Omit the header → the call acts on behalf of your Project itself — use this for actions your own team or admin tooling initiates: provisioning an Agent when your product launches a new feature, wiring up a Knowledge base, configuring a Provider. This is “control-plane” usage.
- Include the header → the call acts on behalf of one of your own end users — use this when your backend is handling a request that a specific logged-in person of yours triggered: Sabik opening a chat, Rahul uploading a document to a Knowledge base. This is “runtime-plane” usage.
3. AG-UI chat/streaming is a server-to-server call too
POST /api/v1/developer/agui streams an agent’s response as Server-Sent Events. If you want live,
streaming chat UX in your own product’s frontend, the pattern is: your backend opens the SSE
connection to Persona, reads the stream, and relays it onward to your own browser client over
whatever channel you already use to talk to your frontend (your own SSE endpoint, a WebSocket, a
GraphQL subscription — your choice), authenticated however you already authenticate your users. A
browser never connects to /api/v1/developer/agui directly — doing so would require shipping your
Project credential to that browser, which point 1 above rules out.
4. Per-resource quick reference
5. Where the SDK fits
A Node.js/TypeScript SDK is planned as an ergonomic wrapper around exactly the rules above — typed resource clients plus a streaming chat client. It changes nothing about where code runs: the SDK itself is a server-side package, meant to be installed in your backend’snode_modules, never
bundled into a frontend build. Its own README states this directly rather than assuming it’s
obvious.