rackspecs API
A REST API (and a hosted MCP server for AI agents) over the normalized catalog: discover every queryable field, search across categories by spec (numeric range filters work even where the datasheet printed a string), resolve part numbers in bulk, compare products, export selections, and follow a change cursor or webhook alerts to keep your own systems in sync. JSON over HTTPS.
Base URL: https://api.rackspecs.com · Interactive reference: OpenAPI / Swagger
Authentication
Every request needs an API key. Create one on your account page (requires an active API subscription). The key is shown once, so store it securely. Send it as an Authorization: Bearer header:
curl -H "Authorization: Bearer rsk_live_xxx" https://api.rackspecs.com/api/pdus/schemaX-API-Key: rsk_live_xxx is accepted as an equivalent header. A missing or revoked key returns 401; a valid key without an active API subscription returns 402 (the body carries a subscribe_url). Keys can be revoked anytime from your account, and a key unused for 30 days expires automatically — the 401 body says reason: idle_expired; just create a new key. Any use within the window resets the clock.
Quickstart
Set your key once:
KEY=rsk_live_xxx1. Discover what you can filter on. /api/fields maps the whole catalog in one call; the per-category schema adds full value distributions:
curl -H "Authorization: Bearer $KEY" https://api.rackspecs.com/api/fields
curl -H "Authorization: Bearer $KEY" https://api.rackspecs.com/api/pdus/schema2. Search by spec. Three-phase PDUs with at least 30 outlets, highest current first:
curl -H "Authorization: Bearer $KEY" \
"https://api.rackspecs.com/api/search?category=pdus&filter=phase:3&filter=outlet_count_total:>=:30&sort=input_amps:desc"3. Resolve a part number from a BOM or a device label, then fetch the full record at the address it returns:
curl -H "Authorization: Bearer $KEY" "https://api.rackspecs.com/api/lookup?part=AP7532"
curl -H "Authorization: Bearer $KEY" https://api.rackspecs.com/api/pdus/apc/ap7532Filtering on normalized values
Filters are filter=field:value or filter=field:op:value, repeatable (they AND together). Ops: =, !=, >, <, >=, <=, in (e.g. filter=phase:in:1,3).
On /api/search filters compare against normalized values: a datasheet value captured as "42.9 in (1090 mm)" matches filter=depth:>=:1000, ranges like "100-240V" match on overlap, and numeric comparisons use the field's native unit (depth_mm in mm, weight_lb in lb; the schema endpoint shows each field's unit). Long-tail labels that only exist in additional_specs filter by their slug (e.g. noise_level for "Noise Level"). On /api/{category} filters compare the raw stored values: exact, but unit-blind. Prefer /api/search for numeric range queries.
Endpoints
Discover
/api/categoriesList catalog categories (no auth). The 14 slugs: busway, cabling, cooling, cpus, enclosures, gpus, interconnect, kvm, memory, pdus, servers, storage, switches, transfer-switches.
/api/vendorsEvery vendor with per-category and total product counts (no auth).
/api/fieldsThe whole catalog's queryable surface in one call. Per category: every field's name, label, type, unit, coverage and a copy-paste filter example, plus the top long-tail labels.
/api/{category}/schemaThe deep version for one category: adds full value distributions (enum values + counts, numeric min/max/median) and the ranked long-tail of captured spec labels. Use it to find field names and units before filtering.
/api/{category}/facets{ field: { value: count } } over the faceted fields, useful for building a filter UI.
Search & fetch
/api/searchNormalized search over one category or all of them. Query params:
q=: full-text, all terms must match; typo-tolerant (corrections applied and reported incorrected_terms).category=: one slug or comma-separated several; omit to search everything.filter=: repeatable, normalized semantics (see above).sort=:fieldorfield:descover normalized values;score(default withq) orlast_changed_at.include=: comma-separated fields to inline on each hit asspecs(hits are otherwise compact addresses; fetch full records separately).limit=: 1–200 (default 20).cursor=: opaque token fromnext_cursor.
/api/{category}The exact, raw-value list: same filter/q/sort/vendor_id params, fields= projection, limit= 1–500 with cursor pagination. Returns full stored items (search returns compact hits).
/api/{category}/{vendor_id}/{product_key}Fetch one product by its catalog path, the same path as its page on this site. Full spec set + provenance map (datasheet_url, fetched_at).
/api/lookup?part=Resolve a part number / vendor model / SKU: exact first, then fuzzy; separator- and case-insensitive (ap-7532 = AP7532). Returns catalog addresses with a match kind per hit. limit= 1–25.
/api/lookupBatch lookup reconciles a whole BOM in one call (one metered request, up to 200 parts):
curl -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"parts": ["AP7532", "EMA101-10", "C2W36VE-YQNB2A99"]}' \
https://api.rackspecs.com/api/lookup/api/compare?items=2–10 products side by side: items= comma-separated category/vendor_id/product_key addresses. Returns a normalized spec matrix plus differs, the fields where they don't agree.
/api/alternativesSubstitutes for a discontinued or unavailable part: ?sku= (or category=&vendor_id=&product_key=), ranked by normalized-spec similarity within the category. exclude_same_vendor=true for cross-vendor only.
/api/{category}/top/{spec}Rank a category by any numeric spec, canonical field or long-tail slug (/api/gpus/top/gpu_memory_gb, /api/pdus/top/outlet_count_total). order=asc|desc, limit= 1–100.
Feed & export
/api/changesOne global change cursor across every category. since=<ISO-8601> returns items with last_changed_at > since, each carrying its category, merged in time order with limit + cursor pagination. /api/changes/{category} is the same cursor scoped to one category.
/api/exportDownload a filtered selection as a file: ?category=pdus&format=csv|json plus the same filter/q/sort/fields params as the list endpoint. Capped at 5,000 rows; X-Export-Truncated: true tells you to narrow the filter. CSV columns are coverage-ordered; JSON carries full items.
/api/usageToday's request count against your plan's daily limit (does not count as a call).
Webhook alerts
Instead of polling the change cursor, save a search and get pushed. An alert is a category, filters (normalized semantics), and/or a full-text q, plus an HTTPS webhook URL. Alerts are evaluated daily right after the catalog updates (~06:30 UTC); matching new/updated products are POSTed to your webhook.
curl -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"name": "new 3-phase PDUs", "category": "pdus",
"filters": ["phase:3"],
"webhook_url": "https://example.com/hooks/rackspecs"}' \
https://api.rackspecs.com/api/alertsThe response includes a secret, shown once. Every delivery is signed: X-Rackspecs-Signature: sha256=<hex HMAC-SHA256(secret, body)>, with X-Rackspecs-Alert-Id identifying the alert. Verify the signature before trusting a payload. The body is {"type": "catalog.changes", "events": [...]} with up to 100 events per delivery. Manage with GET /api/alerts, DELETE /api/alerts/{id}, and fire a signed test delivery with POST /api/alerts/{id}/test. Max 20 alerts per account.
MCP: connect an AI agent
rackspecs hosts a remote MCP server at https://api.rackspecs.com/mcp (Streamable HTTP), authenticated with the same API key. Point Claude Desktop, Claude Code, Cursor, or any MCP client at it and the agent can discover the data model, search by spec, reconcile BOMs, compare products, find alternatives, and follow changes: the full query layer as tools.
Claude Code:
claude mcp add --transport http rackspecs https://api.rackspecs.com/mcp \
--header "Authorization: Bearer rsk_live_xxx"Generic MCP client config:
{
"mcpServers": {
"rackspecs": {
"type": "http",
"url": "https://api.rackspecs.com/mcp",
"headers": { "Authorization": "Bearer rsk_live_xxx" }
}
}
}Tools: list_categories, list_vendors, describe_category, describe_all_fields, search_products, lookup_parts, get_product, compare_products, find_alternatives, get_changes. Tool calls meter against the same daily limit as REST requests.
Keeping a feed in sync
Bootstrap once by paging the categories you care about. Follow next_cursor until it is null, recording the latest last_changed_at you see:
curl -H "Authorization: Bearer $KEY" "https://api.rackspecs.com/api/servers?limit=500"Then poll the global change cursor with that watermark; it returns only what changed since, across every category:
curl -H "Authorization: Bearer $KEY" \
"https://api.rackspecs.com/api/changes?since=2026-06-09T00:00:00Z&limit=500"Or skip polling entirely and use a webhook alert.
Rate limits
API Pro includes 100,000 requests per UTC day. Past the limit, requests return 429 with a resets_at timestamp. A batch POST /api/lookup counts as one request regardless of how many parts it resolves; MCP tool calls count like REST requests. Check your count anytime with GET /api/usage. Need more? Contact us about enterprise limits.
There is also a burst guard of 1,000 requests per minute per account, an abuse backstop that normal integrations never hit. A burst-limited response is 429 with rate_limited: true and a Retry-After header; back off and retry within the minute.
Provenance
Every product carries the manufacturer datasheet it was extracted from (provenance.datasheet_url) and when it was fetched. Verify against the source before purchase; values are transcribed from published datasheets.
Need a key or a plan? See API plans · Manage your keys · Contact us