Overview
The marketplace listing accepts aq query and ranks the catalog against it.
The ranker is lexical and deterministic: it folds case and accents, matches
tokens across every searchable field, and turns common merchant intents into the
categories and tags the catalog uses. There is no embedding service behind it.
Search runs on GET /api/v1/apps/marketplace:
app_ token cannot call it.
What a query searches
A query is folded to lowercase, stripped of accents, and split into word tokens. One character tokens are dropped. The full phrase is kept as well when the query contains a space. Each term is matched against:
Synonyms widen the candidate set before scoring. If the query is
shipping, the
listing also considers apps that mention delivery, fulfillment or
logistics, so an app that solves the problem under a different word is not
missed.
Ranking
Scores are built in tiers. The tiers are spaced far enough apart that no amount of lower tier scoring can overturn a higher tier.
Below the name tiers, each query token is matched against every field. An exact
token match earns the field’s full weight:
A token that is a prefix of a word earns 60 percent of the field weight, and a
mid-word substring earns 30 percent. A single query token contributes at most
160 points across all fields, so a long description cannot run away with the
score.
Synonyms add one contribution per token, using the strongest match only:
Store type and tie breakers
When the listing has ashopType, an app that fits it gets a bounded bonus. This
is a bonus on a match, never a reason to include an app: an unrelated app in the
right store type still scores zero.
Two fractional tie breakers are added to apps that already matched. They are
always smaller than one lexical point, so social proof can reorder equal matches
but can never pull in a stranger.
The final score is rounded to six decimals. The integer part carries the lexical
score and the fraction carries the tie breakers, so an install count one apart
still breaks a tie.
The score field
A search result carriesscore:
score is present only when q is present and not blank. Browsing the
marketplace without a query keeps the older response shape and has no score
field. A blank query is treated as no query.
Sort and pagination
sort still applies while a search is active, but the score is always the
default order:
An unknown
sort falls back to relevance.
Search scores at most 500 candidates after the database has narrowed the
catalog to apps that mention a query term. total is the number of apps that
scored above zero, not the size of the whole catalog. Pagination slices that
ranked list.
Suggestions
The search box can ask for typeahead suggestions:- It returns up to 8 items.
- Categories come first, at most 3, then app names in rank order.
typeiscategoryorapp.- A category is suggested when its slug or display label starts with the query,
or when the query maps to it through a synonym. For example,
emailsuggestsMarketing. - An app name is suggested when the app matches the query through its name, tagline, category or tags.
- Suggestions are deduplicated case-insensitively, and a suggestion equal to the query itself is dropped.
- An empty or blank
qreturns an empty list. - The typeahead reads at most 60 candidates and uses the same auth gate as the listing.
Intent synonyms
These are the supported synonyms. The key is what a merchant may type; the values are terms the catalog actually uses.
A token that is not in this list still searches its own text. The map only adds
terms; it never replaces the query.
Next steps
Marketplace listing
The full listing contract, install consent and the consent ticket.
Developer analytics
See how installs and ratings move after a listing change.
Building and publishing
Name, tagline, category and tags are part of what a merchant searches.

