# X_QUERY_INPUT_UNENCODABLE

## Means

a query input cannot be carried in a query string

## Typical cause

a read declaring a nested `t.object`/`t.record`/`t.money` member, an array or union of one, a REQUIRED `t.nullable(...)` member, or a top-level input that is not an object, or a member named `_first` or `_after` — the two page controls the route reads off the search string before the schema sees it. A read is served as `GET /_x/query/<name>`, so its input is characters: the typed client would encode a structure as JSON text and skip a `null`, and `coerceQuery` has no inverse for either. Raised at `query()`, in the file that declared it

## Fix

flatten the key into scalar arguments (`status: t.string, limit: t.number`), spell an absent value as `.optional()` rather than `t.nullable(...)`, or declare it as an `action()` if it really needs a JSON body

[Policy and authz](/error-codes#policy-and-authz)
