$ uprouter.online --developers
Public API & open data
Everything that powers the Uprouter directory is available keylessly: normalized per-1M pricing, free-tier values, live status and uptime for 100+ AI API providers — as JSON, CSV, RSS and embeddable badges. No account, no key, no tracking for read endpoints. Data is CC BY 4.0 — attribute UPROUTER.ONLINE and link the source entry.
https://uprouter.onlineAll endpoints below are relative to this origin. HTTPS only.
Errors return a stable machine code: { "error": "rate_limited" } with an appropriate HTTP status. Successful responses are plain JSON unless stated.
Dataset and badge endpoints send long public cache headers (s-maxage + stale-while-revalidate). Query APIs are per-request — send a short client cache if you poll.
Sort keys are neutral data signals (price, free credits, status, votes, freshness). Affiliate status, listing fees and Connect participation are never sort inputs — in the API or on the site.
/api/providersauth: noneThe same engine that powers the public directory — full filter/sort parity, server-side, never client-filtered. Ordering is computed from neutral signals only; affiliate or commercial participation is not a sort input.
| param | type | description |
|---|---|---|
| q | string | Free-text search over name, domain and description. |
| category | csv | e.g. multi_router, inference, gpu — comma-separated list. |
| type | csv | Router types (freemium, paid_api, open_source, …). |
| risk | csv | low, medium, high — editorial risk tier. |
| status | csv | up, degraded, down, unknown — last probe result. |
| free_tier | 1|0 | Only providers with a free tier (1) or without (0). |
| payg | 1|0 | Pay-as-you-go availability. |
| sub | 1|0 | Subscription plan availability. |
| connect | 1|0 | Callable through Uprouter Connect. |
| credit_min / credit_max | number | Free-credit value range (USD). |
| in_min / in_max | number | Min per-1M input price (USD) range. |
| out_min / out_max | number | Min per-1M output price (USD) range. |
| conf | number | Minimum editorial confidence (0–100). |
| fresh_days | number | Max days since the last status verification. |
| min_votes | number | Minimum community vote score. |
| model | csv | Providers offering any of these model slugs. |
| sort | enum | name, category, router_type, risk, confidence, live_status, credit_value, price_in, price_out, last_verified, last_updated, model_count, vote_score, review_count, date_added, multiplier, min_spend. |
| dir | asc|desc | Sort direction (default desc). |
| page / per_page | number | Pagination — per_page clamps to 6–100 (default 24). |
curl "https://uprouter.online/api/providers?free_tier=1&connect=1&sort=credit_value&dir=desc&per_page=5"{
"rows": [
{
"slug": "openrouter",
"name": "OpenRouter",
"domain": "openrouter.ai",
"category": "multi_router",
"routerType": "freemium",
"riskTier": "low",
"confidence": 86,
"liveStatus": "up",
"creditValueUsd": 5,
"hasFreeTier": true,
"connectCompatible": true,
"minInput": 0.0001,
"minOutput": 0.0003,
"votesUp": 44, "votesDown": 1,
"models": [ { "slug": "gpt-4o-mini", "per1MInputUsd": 0.15, "per1MOutputUsd": 0.6 } ],
"entryUrl": "https://uprouter.online/s/openrouter"
}
],
"total": 74, "page": 1, "perPage": 5, "totalPages": 15
}- Rows are a projection per sort key — use per_page=100 to page through everything.
- Internal and unpublished entries are always excluded.
/api/datasetauth: noneOne-shot export of the complete filtered directory, including per-model pricing arrays. Same query params as the directory, so any filtered view on the site has an exact API mirror.
# JSON — full structured rows with per-model pricing
curl "https://uprouter.online/api/dataset?free_tier=1"
# CSV — spreadsheet-friendly download (attachment)
curl -OJ "https://uprouter.online/api/dataset?format=csv"{
"license": "CC BY 4.0 — attribute UPROUTER.ONLINE and link to the source entry. …",
"generated_at": "2026-08-28T08:30:00.000Z",
"count": 74,
"export_cap": 1000,
"providers": [
{
"slug": "openrouter",
"name": "OpenRouter",
"free_credit_value_usd": 5,
"free_credit_value_is_estimate": false,
"connect_compatible": true,
"min_input_usd": 0.0001,
"min_output_usd": 0.0003,
"votes": { "up": 44, "down": 1 },
"models": [
{ "slug": "gpt-4o-mini", "name": "GPT-4o mini",
"per_1m_input_usd": 0.15, "per_1m_output_usd": 0.6 }
],
"entry_url": "https://uprouter.online/s/openrouter"
}
]
}- License: CC BY 4.0 — attribute "UPROUTER.ONLINE" and link the source entry.
- CORS: Access-Control-Allow-Origin: * — call it from the browser.
- Capped at 1,000 rows per response; cached up to 1h at the edge (stale-while-revalidate 24h).
/api/modelsauth: noneThe OpenRouter-parity model index behind /models — canonical per-1M pricing, context windows, tokenizers, knowledge cutoffs, licenses, documented capabilities, sourced benchmark results with provenance, and per-endpoint provider counts. Same filter/sort contract as the /models page, so any filtered catalog view has an exact API mirror.
| param | type | description |
|---|---|---|
| q | string | Free-text search over model name, slug and creator. |
| in_modal / out_modal | csv | Input / output modalities — text, image, audio, video, embedding. |
| family | csv | gpt, claude, gemini, llama, mistral, deepseek, qwen, glm, … |
| creator | csv | Publishing organization (exact value). |
| license | csv | open-weights, commercial, proprietary, research. |
| streaming / tools / structured / image_input / audio_input / reasoning / image_output | 1 | Capability filters — match documented-true only; undocumented models never match. |
| free / priced | 1 | free = operator documents a 0 rate for both prompt and completion; priced = any canonical per-1M price on record. |
| in_min / in_max / out_min / out_max | number | Canonical prompt / completion price range (USD per 1M tokens). |
| ctx_min / ctx_max | number | Context-window range (tokens). |
| has_bench / bench / bench_min | 1 / string / number | Has any sourced benchmark; named benchmark (e.g. "SWE-bench Verified"); minimum score — bench_min only applies together with bench (units differ across benchmarks). |
| sort | enum | name (default), newest, price_in, price_out, context, bench. Price/context sorts keep unpriced/unknown models last in both directions. |
| dir | asc|desc | Sort direction (default asc). |
| page / per_page | number | Pagination — per_page clamps to 12–100 (default 24). |
curl "https://uprouter.online/api/models?tools=1&sort=bench&dir=desc&per_page=3"{
"models": [
{
"slug": "openai-gpt-4o",
"name": "GPT-4o",
"creator": "OpenAI",
"family": "gpt",
"modality": "text",
"inputModalities": ["text", "image"],
"outputModalities": ["text"],
"canonicalInputUsd": 2.5,
"canonicalOutputUsd": 10,
"contextWindow": 128000,
"maxOutputTokens": 16384,
"knowledgeCutoff": "2023-10",
"licenseType": "commercial",
"licenseName": null,
"specUrl": "https://example.com/docs/gpt-4o",
"capabilities": { "streaming": true, "toolCalling": true, "structuredOutputs": true,
"imageInput": true, "audioInput": false, "reasoning": false, "imageOutput": false },
"samplingParams": ["temperature", "top_p"],
"createdAt": "2026-08-01T00:00:00.000Z",
"providerCount": 12,
"benchmarkBest": { "name": "HumanEval", "score": 90.2, "unit": "%" },
"benchmarks": [
{ "name": "HumanEval", "version": "v1", "score": 90.2, "unit": "%",
"provenance": "independent", "conditions": "zero-shot, single-shot",
"sourceUrl": "https://example.com/eval", "evaluatedAt": "2026-08-20T00:00:00.000Z",
"verifiedAt": "2026-08-21T00:00:00.000Z", "confidence": "verified" }
]
}
],
"total": 413, "page": 1, "perPage": 3, "totalPages": 138
}- Capability booleans are true, false or null — null means undocumented; the index never infers or guesses (absent is a value, not a gap).
- Only models served by at least one published, non-internal provider are listed — internal sandbox endpoints never leak into the API.
- Each benchmark row carries provenance (independent | vendor | community), evaluation conditions, source URL, evaluated/verified dates and a confidence grade; scores are comparable only within matching conditions.
/api/search/suggestauth: noneLightweight typeahead over published providers and models — the same endpoint the header search box uses.
| param | type | description |
|---|---|---|
| q | string | Minimum 2 characters, truncated at 80. |
curl "https://uprouter.online/api/search/suggest?q=open"{
"providers": [
{ "slug": "openrouter", "name": "OpenRouter", "category": "multi_router",
"liveStatus": "up", "riskTier": "low", "hasFreeTier": true,
"creditValueUsd": 5, "connectCompatible": true }
],
"models": [ { "slug": "openai-gpt-4o", "name": "GPT-4o" } ]
}- Rate limit: 60 requests/min/IP. Exceeding it returns 429 with a Retry-After header.
/api/statsauth: noneThe numbers behind the homepage tiles — entry counts by category/type/risk, free-tier and Connect coverage, live-up count, total free-credit value.
curl "https://uprouter.online/api/stats"{
"total": 106,
"byCategory": { "multi_router": 34, "inference": 22, "...": 0 },
"byRouterType": { "freemium": 61, "paid_api": 38, "...": 0 },
"byRisk": { "low": 71, "medium": 30, "high": 5 },
"withFreeTier": 74,
"connectCompatible": 40,
"up": 105,
"modelsTracked": 54,
"totalFreeCreditValue": 849.1,
"lastUpdated": "2026-08-28T06:12:00.000Z"
}/feed.xmlauth: noneRSS 2.0 feed of the Uprouter journal — real pipeline events: new entries, price changes, status flips, methodology notes.
curl "https://uprouter.online/feed.xml"<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title>UPROUTER Journal</title>
<link>https://uprouter.online/journal</link>
<item>
<title>Price change — Deepgram: output $0.0043 → $0.0040 /1M</title>
<link>https://uprouter.online/journal#evt_…</link>
<pubDate>Thu, 27 Aug 2026 09:00:00 GMT</pubDate>
</item>
</channel>
</rss>/badge/{slug}.svgauth: noneShields-style terminal SVG with the provider’s name, live status and 7-day uptime. Paste it anywhere — no scripts, no tracking, cacheable.
<!-- HTML -->
<img alt="UPROUTER status badge for OpenRouter"
src="https://uprouter.online/badge/openrouter.svg">
<!-- Markdown -->
[](https://uprouter.online/s/openrouter)>_ uprouter | ● openrouter · up 99% uprouter.online
# 393×28 SVG · Cache-Control: public, max-age=300, s-maxage=600
# unknown providers render a neutral badge; bad slugs return a 404 badge- Per-provider live preview + copy on every entry page → the embed_badge panel.
/api/statusauth: noneMachine-readable companion to the live status board and the embeddable badges: per-provider live status, 7-day uptime, latency and probe counts — plus an aggregate summary. Same probe pipeline and uptime math as the /status board.
| param | type | description |
|---|---|---|
| slug | string | Optional comma-separated provider slugs (max 50), e.g. slug=openrouter,together-ai. |
| status | enum | Optional row filter: up, degraded, down or unknown. Filters rows only — the summary always describes the whole board. |
| format | enum | json (default) or csv for a spreadsheet-friendly download. |
# everything, JSON
curl "https://uprouter.online/api/status"
# two providers only
curl "https://uprouter.online/api/status?slug=openrouter,together-ai"
# currently-degraded providers, CSV
curl -OJ "https://uprouter.online/api/status?status=degraded&format=csv"{
"license": "CC BY 4.0 — attribute UPROUTER.ONLINE. …",
"generated_at": "2026-08-28T09:20:00.000Z",
"summary": {
"providers_total": 106,
"up": 105, "degraded": 0, "down": 1, "unknown": 0,
"overall_uptime_7d": 98.4
},
"count": 106,
"providers": [
{
"slug": "openrouter",
"name": "OpenRouter",
"live_status": "up",
"uptime_7d": 99.1,
"checks_7d": 42,
"avg_latency_ms_7d": 187,
"last_latency_ms": 176,
"last_check_at": "2026-08-28T09:18:00.000Z",
"entry_url": "https://uprouter.online/s/openrouter",
"badge_url": "https://uprouter.online/badge/openrouter.svg"
}
]
}- uptime_7d is the share of successful probes over the last 7 days (0.1% precision) — identical math to the /status board and badges.
- Best-effort probes from our network location; not a guarantee. Cache: s-maxage=300, stale-while-revalidate 24h; CORS: *.
- Poll it to wire Uprouter status into your own dashboards or alerting — pair each row with its badge_url for embeds.
/api/connect/v1/chat/completionsauth: upr_live_… keyOne OpenAI- & Claude-compatible API across every Connect-compatible provider in the directory. Address any upstream as provider-alias/model, get automatic ordered failover, and see exactly which upstream served each request and what it cost — billed in Uprouter compute, only on success. Create keys and sandbox aliases in the Connect console.
curl "https://uprouter.online/api/connect/v1/chat/completions" \
-H "Authorization: Bearer upr_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "openrouter/anthropic/claude-3.5-sonnet",
"messages": [{ "role": "user", "content": "Hello" }]
}'{
"id": "chatcmpl-…",
"choices": [{ "message": { "role": "assistant", "content": "Hi!" } }],
"usage": { "prompt_tokens": 12, "completion_tokens": 9, "total_tokens": 21 },
"uprouter": {
"provider_used": "openrouter",
"credits_charged": 0.0042,
"request_id": "req_…",
"failover_chain": ["openrouter", "direct"]
}
}- Model resolution: a plain alias (
my-claude) uses your configured failover chain; a fully-qualified path (openrouter/anthropic/claude-3.5-sonnet) pins one upstream. - Insufficient balance returns
400 insufficient_creditsand never routes — earn more at /earn. - Keys, per-provider credentials (envelope-encrypted), daily spend caps and the request log live in the Connect console.