Skip to main content
Catalog reads are public and served from data/footprints_index.json (no backend), except semantic search, which proxies to the backend vector index with a local text fallback. Footprints are browsed by library, not category.

Search / list — GET /api/footprints

q
string
Case-insensitive match over name, description, tags, library.
page
number
default:"1"
limit
number
default:"60"
Capped at 100.
footprints
Footprint[]
total / page / limit / totalPages
number
curl "https://footprints.buildwithtrace.com/api/footprints?q=QFN&limit=20"
/api/footprints is search/list only (q, page, limit). The footprint detail page is a Server Component that reads the index directly via getFootprintById() — it does not call this route.

Browse by library

There is no library-list API route — libraries come from the index via the data layer:
import { getAllFootprintLibraries, getTopFootprintLibraries, getFootprintsByLibrary } from "@/lib/footprints";

getTopFootprintLibraries(12);                 // homepage "Browse by Library" grid
getFootprintsByLibrary("Package_DFN_QFN", 1, 120);   // /browse/[library] page
Each returns { id, name, footprintCount } (libraries) or a paginated FootprintSearchResult (footprints in a library).

Semantic search — GET /api/search/semantic

q
string
required
Minimum 2 characters.
limit
number
default:"20"
Capped at 50.
Proxies to GET /api/v3/components/search?q=&limit=&type=footprint. Returns source: "vector" on success or source: "text_fallback" when the backend is unreachable. Result items use the backend’s snake_case (pad_count).
{ "results": [ { "name": "…", "library": "…", "description": "…", "pad_count": 16 } ],
  "query": "…", "total": 8, "source": "vector" }