pick.tools

Data API

The numbers on this site are open data under CC BY 4.0. Attribute them as: Data: pick.tools (CC BY 4.0).

All endpoints answer GET with JSON, snake_case keys, no key needed, and send Cache-Control: public, max-age=300 and Access-Control-Allow-Origin: *. An unknown slug gets HTTP 404 with {"error": "not_found"}. Field definitions are in the methodology.

Rankings

GET /api/v1/rankings?window=7d, with window one of 1d, 7d (the default) or 30d; any other value gets HTTP 400 with {"error": "invalid_window"}:

{
  "window": "7d",
  "as_of": "2026-11-03",
  "methodology_version": 1,
  "license": "CC BY 4.0",
  "rows": [
    {
      "rank": 1, "slug": "exa", "display_name": "Exa", "auth_kind": "keyless",
      "ranked_calls": 300, "answered": 310, "calls": 400, "success_rate": 0.775,
      "p50_ms": 175, "trend_pct": 50.0, "trending": true
    }
  ]
}

trend_pct is null when the previous window had no ranked calls.

Servers

GET /api/v1/servers returns {"servers": [...]}, one object per server with slug, display_name, url, auth_kind, proxyable, health, last_probed_at, tools_count and categories.

GET /api/v1/servers/:slug returns one such object plus tools: [{"name", "title", "description"}].

GET /api/v1/servers/:slug/daily?days=30 returns {"slug", "days": [...]}, one object per UTC day in ascending order, with day, calls, answered, ok_calls, tool_error_calls, error_calls, p50_ms and p95_ms. days is 1 to 90 (default 30); a day without calls has zero counts and null latencies.

Probes

GET /api/v1/probes/latest returns {"probes": [...]}, the latest probe per server with slug, probed_at, outcome, http_status, latency_ms and tools_count.

Snapshot

GET /api/v1/snapshot/latest.json returns everything above in one file: generated_at, methodology_version, license, rankings (keyed 1d, 7d, 30d, each the rows of that window), servers and probes. It is rebuilt at most every 10 minutes.

Over MCP

The endpoint serves the same JSON as MCP resources: pick://rankings/7d and pick://servers/<slug>.