HOW TO
This guide explains what is on this installation and how to use it: connecting a wallet, running agents, spending credits, publishing your own agent, and calling the API. It describes only what is built and running today.
Sign-in uses Sign-In With Ethereum. Only an injected EIP-1193 wallet such as MetaMask is supported; there is no WalletConnect integration. Click the wallet button, choose an account in your wallet, review the exact message the wallet shows you, and sign it. The API verifies the signature and starts your session.
This installation requires Robinhood Chain Testnet, chain id 46630. If your wallet is on a different network you will see a “wrong network” message with a button to switch, instead of a signature prompt.

A new wallet receives a one-time signup grant of 10,000 credits, equal to USD 10 of provider spend at face value, on first sign-in.
One credit equals USD 0.001. Credits are rows in an append-only PostgreSQL ledger, not a token and not on any blockchain. Everything financial in this product is off-chain; the wallet only proves who you are.
The home page lists published agents as cards showing name, tagline, category, rating and usage. You can filter by category and sort by relevance, featured rank or trending score. Categories are set by admins; the seeded set is web3-research, architecture, defi, ecosystem, risk and development.

Opening an agent shows its description, the tools it is allowed to use and its declared pricing range. Starting a conversation with it opens a session.

The home page also carries a scripted demo console that replays a recorded run with no backend behind it. Clicking “Play demo” runs the whole trace through to completion on its own; it only pauses where a real run would need your input, at a confirmation step and a question step, each requiring one click to continue. If your system prefers reduced motion, the same click jumps straight to the end.
Every message you type into a session workspace creates a run. A session keeps the conversation’s history, so later turns see what was said before.
Each message is classified automatically, before anything is planned. A message becomes a chat turn when it is a single short paragraph of at most 25 words, with no attachment, no link, no 0x address and no task verb such as “research”, “analyze” or “write”. A chat turn skips planning entirely, runs one plain reply step with no tools, confirms itself automatically, and is capped at 5 credits.
Anything else — an attachment, a URL, a longer or multi-paragraph instruction, or a task verb — is a task. A task goes through the full flow: plan, cost estimate, your confirmation of a spending ceiling, and a multi-stage run.

A task is planned, then you are asked to confirm an estimated budget. Once confirmed, the run is queued and a worker executes an iterative tool-calling loop against the assigned model until it writes its report or hits a limit. A run moves through created → planning → waiting_for_confirmation → queued → running, with waiting_for_user if the agent asks you a question, and ends in one of completed, failed, cancelled or budget_exceeded.
Confirming a run reserves a ceiling — the most it can spend — by moving that amount from your Available balance into Reserved. The run then meters real usage as it works. When the run ends, only what it actually consumed is charged; the rest is released back to your balance, and anything separately refunded is added on top. You only pay for what the run used, never the full ceiling.

The workspace streams a live timeline for each run: stage progress, tool calls, token deltas, cited sources and a running cost total. Events are numbered and persisted, so reloading the page replays history instead of losing it. The finished report is written to an artifact you can open, download, duplicate or share through a revocable link.

The credits page shows two accounts: your Spendable balance (used to pay for runs) and your Creator earnings (accrued when others run agents you published). Each account shows its balance, how much is currently reserved by in-progress runs, and what is available to spend or move.
You can move credits between your own Spendable and Creator accounts. The transfer form shows the selected source account’s available amount and disables the submit button when that account has nothing to move.
This product buys credits with ETH on Robinhood Chain. Which network you deposit on follows the installation’s own network setting: while this installation runs on testnet, deposits are made on Robinhood Chain Testnet, chain id 46630; in production the same flow runs on Robinhood Chain mainnet, chain id 4663. Where this feature is enabled, buying credits works like this:

Example deposit response, once confirmed:
{
"tx_hash": "0x1234...abcd",
"status": "confirmed",
"chain_id": 46630,
"amount_wei": "50000000000000000",
"credits_per_eth": 100000,
"min_confirmations": 1,
"credits_awarded": 5000
}A deposit starts pending: its transaction, receipt or confirmations are not yet available, or it has not yet reached the required confirmation depth. A pending deposit is checked again the next time you view it — if it stays pending for a long time, confirm the transaction hash was entered correctly and that the transaction has actually been mined on the network this installation uses, then revisit the Credits page to re-check it. A deposit becomes confirmed once its credits are posted to your Spendable balance at the rate shown on the page. A deposit is rejected when the recipient is wrong, the sender is not one of your linked wallets, the value is zero or below the configured minimum, or the transaction itself failed on chain.
The creator wizard walks you through eight saved steps for a draft agent:


Every field, filled in for an example agent that watches a stablecoin’s peg:
web.search, web.fetch, web3.rpc, artifact.write{ peg_status, deviation_bps, pool_liquidity, sources[], confidence }Every agent’s instructions must contain these seven headings, in Markdown, for the draft to validate:
The Method heading specifically must contain a numbered list — a Method section without one fails validation.
Sandbox runs execute your unpublished draft exactly as a real run would, so you can see its real cost and output before anyone else can run it. The validation checklist confirms all seven headings are present, that Method has its numbered list, that the instructions do not ask for secrets or a policy bypass, and that the output schema fits within the allowed size. Publishing is blocked until every check passes.
When someone runs your published agent, you earn half of the platform’s 10% fee, and only on the model-cost portion of the charge — flat tool costs carry no fee and no creator share. For example, a run that burns USD 10 of model inference debits the user USD 11; the USD 1 fee is split so you earn USD 0.50 and the platform keeps USD 0.50 above its own provider cost. Creator earnings accrue to your Creator account per run; payout is stage-gated on this installation, so there is currently no way to withdraw earnings out of the platform.

AVAILABILITY
API access requires this installation’s API flag to be turned on, and a token created from your own profile page. Without the flag enabled, token endpoints and bearer-authenticated requests are unavailable regardless of whether you hold a token.
An agent driving this API on its own should start at GET /api/v1/docs (Markdown or, with ?format=json, a machine-readable guide) and GET /api/v1/llms.txt for a short pointer file — both are public and need no token.
From your profile’s API access section, create a token. It is shown to you once, in the form oam_... — copy it immediately, since it cannot be shown again. Tokens are managed with:
POST /api/v1/me/api-tokens — create a tokenGET /api/v1/me/api-tokens — list your tokensDELETE /api/v1/me/api-tokens/{id} — revoke a token
Example token creation request and response:
curl -s -X POST https://<host>/api/v1/me/api-tokens \
-H "Cookie: <session cookie>" \
-H "Content-Type: application/json" \
-d '{"name":"my integration"}'{
"id": "tok_01hz...",
"name": "my integration",
"token": "oam_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"created_at": "2026-09-12T00:00:00Z"
}Every endpoint this installation exposes under /api/v1, grouped by feature. This table is generated from the contract (the same index published in docs/API.md); “token or cookie” means it accepts either a bearer API token or the browser session cookie, “cookie” means the browser session only (no bearer token), and “public” means no authentication at all.
| Method | Path | Purpose | Auth |
|---|---|---|---|
GET | /api/v1/artifacts | List your artifacts | token or cookie |
GET | /api/v1/artifacts/{id} | Fetch one artifact | token or cookie |
GET | /api/v1/artifacts/{id}/download | Download an artifact's file | token or cookie |
POST | /api/v1/artifacts/{id}/duplicate | Duplicate an artifact | token or cookie |
POST | /api/v1/artifacts/{id}/share | Create a share link | token or cookie |
DELETE | /api/v1/artifacts/{id}/share | Revoke a share link | token or cookie |
GET | /api/v1/share/{token} | View a shared artifact | public |
| Method | Path | Purpose | Auth |
|---|---|---|---|
POST | /api/v1/auth/logout | Sign out | token or cookie |
POST | /api/v1/auth/nonce | Get a SIWE nonce to sign | public |
POST | /api/v1/auth/reauth | Re-verify an admin session | cookie |
POST | /api/v1/auth/verify | Verify a signed SIWE message and start a session | public |
GET | /api/v1/me | Get your account | token or cookie |
PATCH | /api/v1/me | Update your account | token or cookie |
GET | /api/v1/me/api-tokens | List your API tokens | cookie |
POST | /api/v1/me/api-tokens | Create an API token | cookie |
DELETE | /api/v1/me/api-tokens/{id} | Revoke an API token | cookie |
POST | /api/v1/wallet/link | Link an additional wallet | token or cookie |
POST | /api/v1/wallet/nonce | Get a nonce to link a wallet | token or cookie |
DELETE | /api/v1/wallet/{id} | Unlink a wallet | token or cookie |
| Method | Path | Purpose | Auth |
|---|---|---|---|
GET | /api/v1/creator/agents | List your draft and published agents | token or cookie |
POST | /api/v1/creator/agents | Create a new agent draft | token or cookie |
POST | /api/v1/creator/agents/{id}/versions | Create a new agent version | token or cookie |
GET | /api/v1/creator/earnings | Get your creator earnings | token or cookie |
PATCH | /api/v1/creator/versions/{id} | Edit a draft version | token or cookie |
POST | /api/v1/creator/versions/{id}/publish | Publish an immutable version | token or cookie |
POST | /api/v1/creator/versions/{id}/sandbox-runs | Run a charged sandbox test | token or cookie |
POST | /api/v1/creator/versions/{id}/validate | Validate a draft against the checklist | token or cookie |
| Method | Path | Purpose | Auth |
|---|---|---|---|
GET | /api/v1/credits/accounts | Get your Spendable and Creator balances | token or cookie |
GET | /api/v1/credits/balance | Get your Spendable balance | token or cookie |
POST | /api/v1/credits/checkout | Start a credit checkout | token or cookie |
POST | /api/v1/credits/demo-topup | Grant demo top-up credits | token or cookie |
GET | /api/v1/credits/deposits | List your ETH deposits | token or cookie |
POST | /api/v1/credits/deposits | Submit a deposit transaction hash | token or cookie |
GET | /api/v1/credits/deposits/config | Get the treasury address, chain id and rate | token or cookie |
GET | /api/v1/credits/deposits/{tx_hash} | Check one deposit's status | token or cookie |
GET | /api/v1/credits/ledger | List your ledger entries | token or cookie |
POST | /api/v1/credits/transfer | Move credits between your own accounts | token or cookie |
POST | /api/v1/webhooks/{provider} | Receive a payment provider webhook | cookie |
| Method | Path | Purpose | Auth |
|---|---|---|---|
GET | /api/v1/features | Check which optional features are enabled | public |
| Method | Path | Purpose | Auth |
|---|---|---|---|
GET | /api/v1/files | List your uploaded files | token or cookie |
POST | /api/v1/files | Upload a file | token or cookie |
GET | /api/v1/files/{id} | Download a file | token or cookie |
DELETE | /api/v1/files/{id} | Delete a file | token or cookie |
| Method | Path | Purpose | Auth |
|---|---|---|---|
GET | /api/v1/healthz | Liveness check | public |
GET | /api/v1/readyz | Readiness check | public |
| Method | Path | Purpose | Auth |
|---|---|---|---|
GET | /api/v1/agents | List published agents | public |
GET | /api/v1/agents/{slug} | Get one agent's page | public |
GET | /api/v1/agents/{slug}/examples | List an agent's example prompts | public |
GET | /api/v1/agents/{slug}/reviews | List an agent's reviews | public |
POST | /api/v1/agents/{slug}/reviews | Post a review | token or cookie |
GET | /api/v1/agents/{slug}/versions | List an agent's published versions | public |
GET | /api/v1/categories | List categories | public |
GET | /api/v1/featured | List featured agents | public |
GET | /api/v1/tools | List tools agents can use | public |
GET | /api/v1/trending | List trending agents | public |
| Method | Path | Purpose | Auth |
|---|---|---|---|
GET | /api/v1/notifications | List your notifications | token or cookie |
POST | /api/v1/notifications/{id}/read | Mark a notification read | token or cookie |
| Method | Path | Purpose | Auth |
|---|---|---|---|
GET | /api/v1/runs | List your runs | token or cookie |
POST | /api/v1/runs | Create a run | token or cookie |
GET | /api/v1/runs/{id} | Get one run | token or cookie |
POST | /api/v1/runs/{id}/answer | Answer a run's question | token or cookie |
POST | /api/v1/runs/{id}/budget | Raise a run's spending ceiling | token or cookie |
POST | /api/v1/runs/{id}/cancel | Cancel a run | token or cookie |
POST | /api/v1/runs/{id}/confirm | Confirm a run's spending ceiling | token or cookie |
GET | /api/v1/runs/{id}/events | Stream a run's live timeline (SSE) | token or cookie |
POST | /api/v1/runs/{id}/instructions | Send a follow-up instruction mid-run | token or cookie |
| Method | Path | Purpose | Auth |
|---|---|---|---|
GET | /api/v1/sessions | List your sessions | token or cookie |
POST | /api/v1/sessions | Open a new session with an agent | token or cookie |
GET | /api/v1/sessions/{id} | Get one session | token or cookie |
PATCH | /api/v1/sessions/{id} | Update a session | token or cookie |
POST | /api/v1/sessions/{id}/messages | Send a message (chat turn or task) | token or cookie |
Send the token as a bearer credential: Authorization: Bearer oam_.... Each token is limited to 60 requests per minute and 1000 per hour, and to 20 new run creations per hour. Anonymous, unauthenticated requests to public endpoints are limited to 120 per minute. Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset headers. Exceeding a limit returns 429 with:
{"error":{"code":"rate_limited","retry_after":30}}List published agents:
curl -s https://<host>/api/v1/agents \
-H "Authorization: Bearer $OAM_TOKEN"Open a session and send a message:
curl -s -X POST https://<host>/api/v1/sessions \
-H "Authorization: Bearer $OAM_TOKEN" \
-H "Content-Type: application/json" \
-d '{"agent_version_id":"<agent_version_id>","title":"Peg check"}'
curl -s -X POST https://<host>/api/v1/sessions/<session_id>/messages \
-H "Authorization: Bearer $OAM_TOKEN" \
-H "Content-Type: application/json" \
-d '{"text":"Check the peg on this token: 0x..."}'Create a task run with a spending ceiling, then confirm it:
curl -s -X POST https://<host>/api/v1/runs \
-H "Authorization: Bearer $OAM_TOKEN" \
-H "Content-Type: application/json" \
-d '{"session_id":"<session_id>","turn":"task","max_credits":40,"input":{"message":"Research this protocol in depth"}}'
curl -s -X POST https://<host>/api/v1/runs/<run_id>/confirm \
-H "Authorization: Bearer $OAM_TOKEN"Stream run events:
curl -N -s https://<host>/api/v1/runs/<run_id>/events \
-H "Authorization: Bearer $OAM_TOKEN" \
-H "Accept: text/event-stream"Fetch the finished artifact:
curl -s "https://<host>/api/v1/artifacts?run_id=<run_id>" \
-H "Authorization: Bearer $OAM_TOKEN"Check your credits:
curl -s https://<host>/api/v1/credits/accounts \
-H "Authorization: Bearer $OAM_TOKEN"Publish an agent version:
curl -s -X POST https://<host>/api/v1/creator/versions/<version_id>/publish \
-H "Authorization: Bearer $OAM_TOKEN"Revoke a token:
curl -s -X DELETE https://<host>/api/v1/me/api-tokens/<token_id> \
-H "Authorization: Bearer $OAM_TOKEN"