/

latester/api reference

what it's for

a read-only JSON API exposing the latest stable versions tracked by latester. designed to be passed to an AI assistant at the start of a session — it can then suggest up-to-date versions for Dockerfiles, CI configs, and similar.

endpoints

  • GET /api/v1/schema — machine-readable route index (methods, params, error codes, tracked IDs) in a single JSON call, meant for AI agents/scripts that don't want to parse this page
  • GET /api/v1/versions — full list of tracked versions
  • GET /api/v1/versions/{id} — single entry by ID
  • GET /api/v1/dockerhub/{name} — on-demand lookup for any Docker Hub image, not limited to the tracked list. Query params: owner, filter (glob), name_filter (Docker Hub-side substring), even_minor (true/false)
  • GET /api/v1/dockerhub/popular — most-searched images via the endpoint above

data is sourced from GitHub Releases, Docker Hub, go.dev, nodejs.org, npm, Maven Central and services.gradle.org. may be up to 24h old.

any request under /api/ that doesn't match a known route also returns JSON — 404 with {"error":"unknown endpoint"} — instead of the HTML 404 page, so a wrong URL form is distinguishable from a valid route with a nonexistent ID ({"error":"not found"}).

some images (nginx being the canonical example) mark unstable "mainline" releases with an odd minor version instead of a prerelease suffix (e.g. 1.31.x is mainline, 1.30.x is stable) — plain version sorting alone can't tell the two apart. Pass ?even_minor=true for those images to only match even-minor tags.

/api/v1/dockerhub/{name} returns 404 (not 502) when the image doesn't exist on Docker Hub or no tag matches your filter/name_filter — a 502 means latester itself failed to reach Docker Hub.

MCP server

the same lookups are also exposed as typed MCP tools over Streamable HTTP — for AI agents that would otherwise reach for a generic fetch-and-summarize tool, which can silently drop a field along the way. read-only, same public/no-auth posture as the JSON API above.

claude mcp add --transport http latester https://latester.euflow.fr/mcp
  • list_tracked_versions — equivalent to GET /api/v1/versions
  • get_version(id) — equivalent to GET /api/v1/versions/{id}
  • lookup_dockerhub(name, owner?, filter?, name_filter?, even_minor?) — equivalent to GET /api/v1/dockerhub/{name}

GET /api/v1/versions

{
  "generated_at": "2026-05-21T10:30:00Z",
  "note": "Stable release versions sourced from official upstreams (GitHub, Docker Hub, go.dev). May be up to 24h old.",
  "versions": [
    {
      "id":             "php",
      "owner":          "library",
      "name":           "php-fpm",
      "version":        "8.4.7-fpm",
      "arch":           "",
      "source":         "dockerhub",
      "updatedAgo":     "2d ago",
      "freshnessClass": "age-stale",
      "url":            "https://hub.docker.com/_/php/tags"
    },
    {
      "id":             "golang",
      "owner":          "golang",
      "name":           "go",
      "version":        "go1.24.3",
      "arch":           "linux/amd64",
      "source":         "godev",
      "updatedAgo":     "5d ago",
      "freshnessClass": "age-stale",
      "url":            "https://go.dev/dl/go1.24.3.linux-amd64.tar.gz"
    },
    {
      "id":             "node-alpine",
      "owner":          "library",
      "name":           "node-alpine (lts)",
      "version":        "24-alpine3.24",
      "pinnedVersion":  "24.18.0-alpine3.24",
      "arch":           "",
      "source":         "dockerhub",
      "updatedAgo":     "2d ago",
      "freshnessClass": "age-stale",
      "url":            "https://hub.docker.com/_/node/tags?name=24-alpine"
    }
  ]
}

pinnedVersion is present only when version is itself a floating "line" tag (e.g. Docker Hub's 24-alpine3.24, re-pointed to a new patch on every release) — it's the fully pinned tag sharing the same image, e.g. 24.18.0-alpine3.24. Use pinnedVersion over version when writing a Dockerfile FROM line.

GET /api/v1/versions/{id}

returns a single entry. id matches the id field in the list above.

{
  "id":             "traefik",
  "owner":          "traefik",
  "name":           "traefik",
  "version":        "v3.4.1",
  "arch":           "linux/amd64",
  "source":         "github",
  "updatedAgo":     "3d ago",
  "freshnessClass": "age-stale",
  "url":            "https://github.com/traefik/traefik/releases/download/v3.4.1/traefik_v3.4.1_linux_amd64.tar.gz"
}

returns 404 with {"error":"not found"} if the ID doesn't exist.

available IDs

  • woodpecker-agent — Woodpecker CI agent
  • woodpecker-server — Woodpecker CI server
  • opentofu — OpenTofu
  • gitea — Gitea
  • traefik — Traefik
  • golang — Go (go.dev official release)
  • golang-alpine — Go Docker image (Alpine)
  • alpine — Alpine Linux Docker image
  • php — PHP-FPM Docker image
  • node-lts — Node.js latest LTS (nodejs.org)
  • node-alpine — Node.js LTS Docker image (Alpine)
  • postgres-alpine — PostgreSQL Docker image (Alpine)
  • nginx-alpine — nginx Docker image (Alpine, stable line only — even-minor filter excludes mainline)
  • maven — Apache Maven (Maven Central)
  • gradle — Gradle (services.gradle.org)
  • spring-boot — Spring Boot (Maven Central)
  • junit — JUnit 5 / Jupiter (Maven Central)
  • angular — Angular (npm)
  • jest — Jest (npm)
  • playwright — Playwright (npm)
  • cypress — Cypress (npm)
  • sonarqube — SonarQube Community Docker image
← back to tracker