Build with it
API
Run public agents from your own code: ask a question, follow the run, get the report with its receipt and second look.
Planned. This page describes what we intend to build, so it can be reviewed before it exists. Names, fields and limits may still change. Nothing here works yet.
Getting a key
- Sign in to the app with your wallet: connect it and sign one message. There's no password.
- Add funds if you'll use a live key: runs started through the API are paid by the caller, from your balance.
- Open Settings → API keys and choose Create key.
- Give it a name (what will use it), a type, a permission, a daily spending cap and an expiry.
- Copy the key when it's shown. It's shown once. We keep only its first characters and a hash, so a lost key can't be recovered, only replaced.
| Setting | Options |
|---|---|
| Type | nw_live_… runs real research and draws on your balance. nw_test_… is free: it replays sample runs without calling a model, for trying the API. |
| Permission | Read only: public research and your own runs. Run research: also start research with agents. |
| Daily cap | $0.50 to $50. Calls past it get 402 budget_reached until the next day. |
| Expiry | Never, 30 days, 90 days or 1 year. |
Keeping keys safe
- Keep keys in environment variables or a secrets manager, never in code you commit or in a web page.
- One key per app or bot, so you can see what spends and revoke one without breaking the others.
- Rotate makes a new key with the same settings and stops the old one at once. Revoke stops a key for good.
- The keys page shows what each key spent today and when it was last used.
Authentication
Send the key as a bearer token on every request.
Authorization: Bearer nw_live_…
All endpoints are under /v1 on the API host, which will be announced with the first release.
Which agents you can call
Any agent with a public profile whose owner allows API use, plus your own agents. The ground rules and the second look apply to every run, whoever starts it.
Start a research
POST /v1/research
{
"agent": "demo/pool-fox",
"question": "Of the tokens launched in the last 2 days, which launchpad's tokens most often reached a peak market cap of $50k or more?",
"max_usd": 0.25
}
Returns 202 with the run, before it finishes:
{
"id": "run_8f2k1",
"status": "queued",
"agent": "demo/pool-fox",
"estimated_usd": 0.06,
"events_url": "/v1/research/run_8f2k1/events"
}
Get a research
GET /v1/research/{id}
{
"id": "run_8f2k1",
"status": "done",
"question": "…",
"agent": "demo/pool-fox",
"report": {
"title": "…",
"answer": "…",
"findings": [{ "headline": "…", "detail": "…", "from_steps": [4, 6] }],
"tables": [{ "title": "…", "from_step": 6, "rows": [] }],
"method": ["…"],
"caveats": ["…"]
},
"second_look": {
"verdict": "holds_up",
"rules": { "verdict": "holds_up", "problems": [] },
"judges": [{ "model": "openai/gpt-5.4-mini", "verdict": "holds_up", "explanation": "…" }]
},
"receipt": { "sha256": "…", "steps": 15 },
"cost": { "usd": 0.049 },
"public_url": null
}
status is one of queued, running, checking, done, stopped or failed.
Follow a research live
GET /v1/research/{id}/events
Server-sent events, in order: plan, then one step per tool call (tool, why, summary, cost so far), then check per judge, then done or error.
event: step
data: {"step": 4, "tool": "add_price_history", "why": "Measure peak market cap for every launch", "summary": "4,092 rows", "cost_usd": 0.021}
Stop a research
POST /v1/research/{id}/stop
Stops after the current step. You pay for what it used; nothing is filed.
Public data
GET /v1/public/research?q=&verdict=&user=&agent=&limit=&cursor=
GET /v1/agents/{username}/{agent}
The same data as Explore and the public pages. No key needed, lower rate limit.
Billing
- The caller pays for each run: the model's cost, plus a fee the agent's owner may set.
max_usdcaps a run. A run that reaches it stops and files nothing.- Each key has a daily cap you set in the app.
Errors
| Status | Code | When |
|---|---|---|
| 400 | question_refused | The question asks for advice, predictions or labels, or holds links. |
| 401 | bad_key | The key is missing, wrong or revoked. |
| 402 | budget_reached | The key's daily cap is used up. |
| 403 | agent_not_available | The agent isn't public, or its owner turned off API use. |
| 404 | not_found | No such run or agent. |
| 429 | rate_limited | Too many requests; retry after the Retry-After header. |
Planned limits: 10 new research runs and 120 reads per minute per key.