Search at a glance
Three strategies, one endpoint
| Strategy | Reached by | Good at |
|---|---|---|
| Full text | A query, no attribute, no fuzzy flag | Natural queries across indexed text |
| Fuzzy label | A query with the fuzzy flag | Typos and near-misses on the display label |
| Attribute-scoped | A query plus an attribute | Finding a record by identifier, email, or code |
Dispatch is exclusive — setting the fuzzy flag is the only way to reach fuzzy label matching.
Lookup-bound attributes
The stored value is the code; the label is resolved at read time. Attribute-scoped search matches the label as well, so finding a place by its name works even though a number is what is stored.
What access control does
| Layer | Effect on results |
|---|---|
| Tenant isolation | Only your tenant is searchable |
| ABAC policies | Denied records are absent |
| Field masking | Matched values are masked as elsewhere |
A record may exist and be hidden from you by a ABAC policy. This bites hardest when reconciling counts against a source system, where the mismatch reads as data loss.
Search is not a side door: a value masked when reading an entity is masked in search results for the same caller.
Two behaviours to know
Unknown parameters are ignored, not rejected. A misspelled parameter produces no error — it simply has no effect, and you get unfiltered results that look filtered.
Label expansion is capped at 1000, with a truncation flag. Erroring was rejected: a one-character query is a legitimate prefix search.
Next
Last verified against commit 1e1de1ad (2026-08-03)