Search the catalog
Ranked full-text search over the catalog. A query also matches by capability, and a long natural-language query falls back to stemmed tokens, so it never comes back empty.
The same search core answers MCP search (10 title rows by default) and MCP search_catalog (50 full rows by default, like this route). A title row is a subset of this route’s row: endpointId, provider, name, capability, category, estimatedPrice, priceBasis, access, executionMode, costPerSuccessUsd (facts.costPerSuccessUsd), async (facts.async), works, sourceCapability and credential, in the same order for the same q, limit and offset for a customer token. A platform operator token differs: this route always includes unavailable rows, while MCP honors an explicit filters.includeUnavailable false.
/v1/catalog/searchAuthorizationBearer token · headerrequiredqstringrequiredlimitintegeroffsetintegerWhere the page starts in the ranked list; pass the previous page's nextOffset (null on the last page).
categorystringplatformstringproviderstringcapabilitystringkeylessbooleanverifiedbooleanmockbooleantrue/false excludes the other kind; omitted keeps both but real providers still rank above mocks
maxPriceMicrosintegerhiddenbooleanpreferstringHow providers are ordered inside a job: balanced (default), cheapest, reliable or fastest. Any other value is a 400 validation_error. Every item's facts carry it and the body echoes it; it changes the order only once the gateway serves the shared ranking.
cheapestreliablefastestbalancedRanked catalog items (each carrying mock, verified, keyless, runnableNow, stats, access, matchedBy, facts, works, credential and sourceCapability; capability is the resolved job id), same shape as the listing, plus the prefer value used. An empty page may carry warnings (no_supply_for_job) or priceHint (price_above_max: maxPriceMicros removed every endpoint that does the named job; it names the cheapest)
q is required
catalog:read scope required