REST API v1
The endpoints that answer “what am I spending, and on what”. The tools themselves live on the MCP endpoint — this is the meter beside it.
Prowl’s product surface is the MCP endpoint at https://prowl.chat/mcp, where an agent gains 448 market-intelligence tools and every call is metered against a prepaid USD wallet. This REST API is the other half of that arrangement: read the balance, read what each call cost, and manage the keys that authorise them.
For an agent
The machine-readable description is an OpenAPI 3.1 document at /openapi.json. It is generated from the running application, so it cannot describe an endpoint that does not exist. Discovery also works from /.well-known/api-catalog (RFC 9727) and from the Link header on every page.
Authentication
Send Authorization: Bearer <token>. The token is either a prowl_ API key generated in MCP Home or a session JWT from sign-in. A missing or expired credential returns 401.
Two endpoints take no credential at all — the price list and the tool catalog — because a price you cannot read before signing up is a price you cannot compare.
Endpoints
GET /api/v1/keys
List API keys — Every key on the account with its scope, limits and last use. Secrets are never returned — only the prefix, which is enough to tell two keys apart.
Requires a credential: auth. Operation id: getKeys.
POST /api/v1/keys
Create an API key — Mints a `prowl_...` key, optionally scoped to categories, spend limits and an IP allowlist. **The secret is returned once and is never retrievable again** — store it when you receive it.
Requires a credential: auth. Operation id: createKeys.
DELETE /api/v1/keys/{key_id}
Revoke an API key — Takes effect immediately: the next call presenting this key fails authentication. Revoking the key behind an OAuth connector kills that connector too, without touching the OAuth grant.
Requires a credential: auth. Operation id: revokeKeys.
GET /api/v1/tools/catalog
Browse the full tool catalog — Every registered tool with what it does, who runs it, what it costs and where its documentation lives. No credential required. This is the endpoint to read when choosing which tool answers a question.
Requires a credential: public. Operation id: getToolsCatalog.
GET /api/v1/tools/health
Read per-tool health — Success rate and latest outcome per tool over a recent window, aggregated across all callers — no per-user data. A tool missing from the reply had no calls in the window, which reads as idle rather than broken.
Requires a credential: auth. Operation id: getToolsHealth.
GET /api/v1/tools/pricing
Read the public price list — What each tool costs to call, with no credential required — a price you cannot read before signing up is a price you cannot compare. Returns what a call debits from your wallet, and nothing about how that figure is arrived at.
Requires a credential: public. Operation id: getToolsPricing.
GET /api/v1/usage/summary
Summarise spend over a window — Spend rolled up over the last `days` days — totals, the twenty tools that cost the most, and the current balances alongside them so a budget decision needs one request rather than two.
Requires a credential: auth. Operation id: getUsageSummary.
GET /api/v1/usage/tools
List recent metered calls (alias) — Identical to `GET /api/v1/wallet/invocations`; kept because usage and wallet are two words for the same question and clients reach for both.
Requires a credential: auth. Operation id: getUsageTools.
GET /api/v1/wallet
Read wallet balances — Returns the two pools a call is paid from: plan credit, which burns at the end of the billing period and is spent first, and top-up credit, which never expires. Figures are rounded to whole cents at this boundary.
Requires a credential: auth. Operation id: getWallet.
GET /api/v1/wallet/invocations
List recent metered calls — Every tool call this account has been billed for, newest first, with what the provider charged and what the wallet was debited. Use it to reconcile a balance against the work that produced it.
Requires a credential: auth. Operation id: getWalletInvocations.