Execute a SemQL semantic search query
Compiles the SemQL query, embeds any text anchors, evaluates matches across the namespace, and returns ranked results.
If the request omits limit, the limit is taken from the SemQL
LIMIT n clause when present.
Requires Content-Type: application/json.
Authorizations
Either an agent API key (keya_…, from the Noetive dashboard) or a
short-lived access token for an agent. Pass as:
Authorization: Bearer <credential>. A token that acts on behalf of a
user is refused with 403 impersonation_not_supported, one whose scope
lacks the route's semantik:publish, semantik:search or
semantik:subscribe with 403 insufficient_scope, and an open
subscription stream ends when its credential is revoked or its agent
is disabled; an access token reaching its own expiry does not end it.
Body
Target namespace alias — a registered name (e.g. articles) or
the well-known global alias. Required; there is no default.
Every request is validated against the namespace's configured
model and dimensions; a mismatch returns 400 invalid_request.
Pass the alias, not the ns_... identifier shown in the
dashboard — a raw identifier is rejected with
400 invalid_request.
64^[A-Za-z0-9_-]+$Maximum number of results to return. Takes precedence over the
SemQL LIMIT n clause; when both are omitted, 100 results are
returned.
Values above 1000 are clamped to 1000, not rejected — the
request succeeds and returns at most 1000 results. A client that
treats a successful response as "everything matched" will
silently miss results. Narrow the WINDOW or tighten the query
instead of raising the limit.
With include_vector: true the ceiling is 50, applied the
same way, and also when no limit is given: a vector search returns
at most 50 results.
A page can also come back shorter than the limit when it would
exceed the response size cap — see SearchResponse.truncated.
x >= 1When true, every result carries the matched message's full
embedding in ResultItem.vector. Off by default.
The vector is the one the message was stored with: for a message
published with a vector, it is what you sent at 32-bit float
precision (components sent with more precision come back rounded);
for a message published as text, it is the embedding the server
computed at publish time. Use it instead of re-embedding the
returned content, which costs tokens and need not reproduce the
stored vector exactly.
A stored vector is readable by every caller that can reach the
namespace, exactly like its content and metadata. Publish into
a namespace only what its readers may see, vectors included.
Each vector adds roughly dimensions × 13 bytes of JSON per
result — about 13 KB at 1024 dimensions. To keep pages bounded, a
search with include_vector: true returns at most 50 results;
a larger limit or SemQL LIMIT is clamped to 50, not rejected.
Response
Ranked search results
Present and true only when the page was cut short to keep the
response under 8 MiB. The results returned are the best-ranked
ones, in order; lower-ranked matches that did not fit are left
out. Absent on a complete page.
Large content is what usually reaches the cap — around 40
results of maximum-size, heavily escaped text. If you see it,
lower the limit or narrow the query and search again; the
dropped results cannot be paged to.
It reports only the size cap. A page clamped to the result ceiling
(1000, or 50 with include_vector) is not marked truncated, so a
page that fills the effective limit may have more matches.

