URL filter syntax
Every filter on catchseo.com auction pages is encoded in the URL. URLs are stable, shareable, and indexed by Google. This page is the complete reference.
Equality
The simplest filter: field equals (or does not equal) a single value.
| Syntax | Example | Meaning | Status |
|---|---|---|---|
| ?f=value | ?tld=com | equals | implemented |
| ?f=!value | ?tld=!parked | not equals | implemented |
Lists (IN / NOT IN)
Match against multiple values at once. Use a comma to separate values.
| Syntax | Example | Meaning | Status |
|---|---|---|---|
| ?f=v1,v2,v3 | ?tld=com,net,org | in list (any of these values) | implemented |
| ?f=!v1,!v2 | ?tld=!parked,!squatted | not in list (none of these values) | implemented |
?tld=!com,net are rejected.Numeric ranges
Use a hyphen to separate the lower and upper bounds. Omit a bound to leave that side open.
| Syntax | Example | Meaning | Status |
|---|---|---|---|
| ?f=N-M | ?dr=50-100 | between N and M (inclusive both sides) | implemented |
| ?f=N- | ?dr=50- | at least N (open upper bound) | implemented |
| ?f=-M | ?dr=-100 | at most M (open lower bound) | implemented |
The >= and <= operators aren't part of the URL syntax — ranges always use the hyphen form (100-500).
Text matching
Use * as a wildcard for substring or prefix matching on string fields.
| Syntax | Example | Meaning | Status |
|---|---|---|---|
| ?f=*sub* | ?domain=*shop* | contains substring | experimental |
| ?f=!*sub* | ?domain=!*xxx* | does not contain substring | experimental |
| ?f=prefix* | ?domain=crypto* | starts with prefix | implemented |
| ?f=!prefix* | ?domain=!parked* | does not start with prefix | implemented |
ENDS WITH (?f=*suffix) is reserved syntax — Meilisearch doesn't support it yet. It will light up when they add the operator.
Existence / null / empty
Three distinct operators matching different "absence-like" states. Useful for power queries like "show me auctions without Ahrefs data yet."
| Syntax | Example | Meaning | Status |
|---|---|---|---|
| ?f=* | ?ahrefsData=* | field key exists (any value, including null/empty) | implemented |
| ?f=!* | ?ahrefsData=!* | field key is entirely missing | implemented |
| ?f=null | ?ahrefsData=null | field key is present but value is null | implemented |
| ?f=!null | ?ahrefsData=!null | field key is present and value is not null | implemented |
| ?f=empty | ?notes=empty | field value is empty ("", [], or {}) | implemented |
| ?f=!empty | ?notes=!empty | field value is not empty | implemented |
!*(NOT EXISTS) — the field key is entirely missing from the documentnull(IS NULL) — the field key is present but its value is literalnullempty(IS EMPTY) — the field key is present but its value is"",[], or{}
Sort & multi-sort
Sort by one or more columns. Use a dot to separate the column id from the direction. For multi-column sort, separate entries with a comma — the first entry is the primary sort, subsequent ones break ties.
| Syntax | Example | Meaning | Status |
|---|---|---|---|
| ?sort=col.asc | ?sort=godaddyData.auctionEndTime.asc | sort ascending by one column | implemented |
| ?sort=col.desc | ?sort=godaddyData.price.desc | sort descending (nested-path safe) | implemented |
| ?sort=col1.dir,col2.dir | ?sort=dr.desc,godaddyData.price.asc | multi-column sort (primary, secondary, …) | implemented |
godaddyData.price.desc correctly resolves to { id: "godaddyData.price", desc: true }. Any depth of nesting is fine.Combining filters
Combine multiple filters by joining them with & — standard URL query string syntax. Filters across different fields are AND-joined.
Reads as: TLD in (com, net) AND DR between 50 and 100 AND price between 0 and 500, sorted by auction end descending.
Cross-field OR is not expressible in the URL — filters across different fields always combine with AND.
Reserved / unsupported syntax
These patterns are intentionally not in the active grammar but are reserved at the parser level so adding them later won't break existing URLs.
| Pattern | Why not |
|---|---|
| ?f=>N or ?f=<M | Strict comparison. Use the hyphen form with an integer offset (?f=51- for > 50) — our filterable fields are all integers, so this is semantically equivalent and stays SEO-clean. |
| ?f=>=N or ?f=<=M | Explicit inclusive comparison. The hyphen form (?f=N-, ?f=-M) is the canonical form. |
| ?f=*suffix | ENDS WITH operator. Meilisearch doesn't support it yet; reserved in the grammar for the day they add it. |
| ?f=N-M,P-Q | Disjoint ranges (union). Not currently supported; reserved syntax. |
| ?f=~pattern | Regex matching. Postgres supports it but Meilisearch doesn't; reserved character. |
| ?location=geo:lat,lng,radius | Geo-radius filtering. Reserved for the day we have geo data on auctions. |
| ?q="<expression>" | Compound cross-field expressions ((dr>50 AND bl>100) OR …) aren't part of the URL syntax. |
Bookmark, share, automate
Filters live entirely in the URL, and every filter combination has exactly one canonical address — so a bookmarked or shared link always reproduces the exact same view.
Want to keep a view without managing URLs? Save it as a Saved Search from the toolbar — and turn on alerts to get an email when new domains match it.