# Unhosted AI Developer Portal

Build on Unhosted AI: the Intelligence API (derived token, trader, wallet and market intelligence behind an API key), the copy-trading SDK for wallets and terminals, the OpenAPI specification, and the docs. Self-serve API keys, sandbox included.

The Intelligence API serves derived intelligence — scores, gates, verdicts and one-sentence rationales computed by our own engine over live on-chain data — never raw provider rows. Base URL `https://api.unhosted.ai/v1` (canonical) or `https://www.unhosted.ai/api/v1` (legacy, same deployment). Every endpoint is described in the [OpenAPI spec](https://www.unhosted.ai/openapi.json) and the [JSON catalog](https://www.unhosted.ai/api/v1), and every error is JSON.

- [OpenAPI 3.0 spec](https://www.unhosted.ai/openapi.json): all operations with unique operationIds, typed parameters and response schemas — import it into Swagger UI, Postman or an LLM tool-calling runtime
- [Endpoint catalog (JSON)](https://www.unhosted.ai/api/v1): public, no key: every endpoint with inputs, outputs and unit cost
- [API catalog (RFC 9727)](https://www.unhosted.ai/.well-known/api-catalog): machine-readable index of our APIs (application/linkset+json)
- [Get a key](https://www.unhosted.ai/partners): self-serve partner console: sandbox org, API keys, usage, webhooks
- [Documentation](https://docs.unhosted.com/): product, wallet SDK and copy-trading docs (Markdown versions at docs.unhosted.com/llm/…)
- [llms.txt](https://www.unhosted.ai/llms.txt): site overview for AI agents, including when to use Unhosted

## Get an API key

1. Sign in at the [partner console](https://www.unhosted.ai/partners) with a wallet or Google/email — no invite, no approval step.
2. Create your sandbox org, open **Keys** and mint a key. Sandbox keys start with `key_test_` and run against real leader data in paper mode: real gates, real direction and notional, executions recorded as skipped/paper, structurally unable to reach mainnet.
3. Go live when your flows are proven: the org owner opens **Settings → Go live**, reads the pricing and terms and accepts. Every `key_test_` key is revoked at that moment — mint `key_live_` keys from the Keys panel and redeploy with those.

Keys are hashed at rest and shown exactly once. Revocation takes effect within the key cache TTL (seconds, not a deploy). For white-glove onboarding or questions, [book an integration call](https://calendly.com/unhosted/intro-call) or email [hi@unhosted.ai](mailto:hi@unhosted.ai).

## Authentication, plans and rate limits

Send the key as `Authorization: Bearer <key>` or `x-api-key: <key>`. Execution routes (`/v1/copy/agent/*`) additionally carry the end user's wallet authorization — `X-Wallet-Address`, `X-Wallet-Signature` (EIP-191 personal_sign of the canonical agent-API message) and `X-Auth-Timestamp` (valid for 300 s) — because two parties are involved: the partner who is billed and the user whose funds move. The `copytrading` SDK builds those headers for you (`createWalletAuthHeaders`).

| Plan | Requests per minute | Notes |
| --- | --- | --- |
| sandbox | 60 | paper mode, `key_test_` keys |
| free | 30 | evaluation |
| pro | 300 | production |
| enterprise | 2000 | custom contracts |

Limits are enforced per key and reported on every response as `X-RateLimit-Limit` / `X-RateLimit-Remaining`; exceeding them returns `429 {"error":"rate_limited"}`. A global daily data budget protects the shared provider quota: when it is exhausted the API returns `503 {"error":"capacity"}` with `Retry-After`.

## Metering and usage

Calls are billed in weighted units, not requests: a market-regime read costs 1 unit, a smart-money radar crawl 8, the whole token dossier (`/v1/token-overview`) 19. The cost of every endpoint is in the [catalog](https://www.unhosted.ai/api/v1) (`cost`) and in the OpenAPI spec (`x-cost-units`); each response carries `X-Usage-Units`. Only successful calls are billed. `GET /v1/usage` returns your own units billed today and the service's remaining data budget — it is never rate limited, so you can always read the meter.

## Quickstart

Market regime (GET, 1 unit) and a full token profile (POST, 1 unit):

```bash
export UNHOSTED_API_KEY=key_test_...

curl -s "https://api.unhosted.ai/v1/market-regime?chain=eth" \
  -H "Authorization: Bearer $UNHOSTED_API_KEY"

curl -s -X POST "https://api.unhosted.ai/v1/token-intel" \
  -H "Authorization: Bearer $UNHOSTED_API_KEY" \
  -H "content-type: application/json" \
  -d '{"chain":"eth","token":"0x6982508145454ce325ddbe47a25d4ec3d2311933"}'
```

Responses are derived objects — bands, scores, verdicts — e.g. `{ "verdict": "...", "risk": { ... }, "momentum": { ... }, "entry": { ... } }`. The verdict vocabulary is fixed and load-bearing across the API: `mirror-worthy`, `watch`, `avoid`, `unrated` — and `unrated` means unknown, never bad.

- **Token**: `/v1/token-intel`, `/v1/token-risk`, `/v1/token-signal`, `/v1/token-holders-insight`, `/v1/token-narrative`, `/v1/token-price-action`, `/v1/smart-money-flow`, `/v1/exit-risk`, `/v1/token-overview` (the whole dossier in one call).
- **Market**: `/v1/market-regime`, `/v1/market-movers`, `/v1/robinhood-movers`, `/v1/smart-money-radar`, `/v1/conviction-board`, `/v1/trader-board`.
- **Trader and wallet**: `/v1/trader-score`, `/v1/trader-style`, `/v1/trader-edge`, `/v1/trader-leaderboard`, `/v1/wallet-health`, `/v1/wallet-analyze`, `/v1/wallet-pnl-quality`, `/v1/wallet-trades`, `/v1/portfolio-risk`, `/v1/wallet-overview` (the whole trader page in one call).
- **Copy trading**: `/v1/copy-decision`, `/v1/copy-plan`, `/v1/copy-simulate`, `/v1/copy-overlap`, `/v1/perp-wallet`, `/v1/prediction-wallet`, `/v1/copy/top-traders`, `/v1/copy/spot-leaders`, `/v1/copy/perp-leaders`, `/v1/copy/prediction-leaders`, `/v1/copy/strategies`, execution relay `/v1/copy/agent/*`.
- **Track records**: `/v1/signals/track-record`, `/v1/traders/track-record`, `/v1/perp-track-record`, `/v1/prediction-track-record` — did the grades carry signal? Misses included.

## Errors

Every error is JSON with a stable machine-readable code and a human sentence: `{ "error": "invalid_api_key", "detail": "Provide a valid key via Authorization: Bearer or x-api-key." }`. Codes: `invalid_api_key` (401), `wallet_auth_required` / `wallet_auth_expired` (401), `invalid_address`, `invalid_chain`, `unknown_param` (400), `venue_not_entitled` (403), `not_found` / `not_a_token` (404), `rate_limited` (429), `capacity`, `gateway_unconfigured`, `execution_unavailable` (503), `internal` (500). Unknown API paths return `404 {"error":"not_found", "hint": ..., "docs": ...}` rather than an HTML page. The full `Error` schema is in the OpenAPI spec.

## Copy-trading SDK

Embeddable, non-custodial copy trading for wallets, dapps and exchanges: your users pick a graded leader, set risk limits, sign once (perps) or send one transaction (spot), and the backend mirrors the leader's trades within those limits. Venues: EVM spot via ERC-7579 smart sessions (spend cap, hard expiry), Hyperliquid perps via revocable agent keys, Polymarket predictions (validating). The backend can submit trades and can never withdraw.

```bash
npm install copytrading
```

- [Complete integration instructions (one Markdown file)](https://www.unhosted.ai/integrate.md): self-contained; written to be pasted into an AI coding agent
- [Copy-trading docs](https://docs.unhosted.com/copy-trading): quickstart, venues and custody, recipes
- [Webhooks](https://docs.unhosted.com/webhooks): execution and agent lifecycle events
- [Audits](https://docs.unhosted.com/wallet-sdk/audits): public security reports
- [Why partners add it](https://www.unhosted.ai/copy-trading): revenue share, custody model, what you skip building

## For AI agents

- [llms.txt](https://www.unhosted.ai/llms.txt) describes the site, says when Unhosted is the right tool, and links the Markdown version of every key page.
- Key pages negotiate content: request them with `Accept: text/markdown` (RFC 9110) and you get `text/markdown; charset=utf-8` with `Vary: Accept`; or fetch the `.md` sibling directly (`/developers.md`, `/index.md`). Unknown URLs return a Markdown 404 that lists where to look next.
- Unknown API paths return JSON errors; every Intelligence endpoint has a unique OpenAPI `operationId`, typed inputs and a response schema, so the spec can be loaded as a tool definition as-is.
- [/.well-known/api-catalog](https://www.unhosted.ai/.well-known/api-catalog) (RFC 9727) points at the spec and the docs.

## Support

- [hi@unhosted.ai](mailto:hi@unhosted.ai): developer and partner support
- [Discord](https://discord.gg/M5HvAj7veS)
- [Telegram](https://t.me/unhostedwalletchat)
- [X (Twitter)](https://x.com/unhostedai): @UnhostedAI
- [Contact](https://www.unhosted.ai/contact): all channels and the postal address
- [Changelog](https://www.unhosted.ai/changelog): what shipped

---

Canonical URL: https://www.unhosted.ai/developers · Updated: 2026-08-23
